Advertisement
heroys6

Game "Underword"

Mar 18th, 2015
263
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 20.19 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdlib>
  4.  
  5. // System switcher: 1 - Linux  2 - Windows
  6.  
  7. #define system_switch 2
  8.  
  9. // Control of game balance
  10.  
  11. #define POP 9999           // Population
  12. #define TAX_RATE_WHITE 2
  13. #define TAX_RATE_BLACK 2
  14. #define CASH 1000          // Start money
  15.  
  16. using namespace std;
  17.  
  18. char menu();
  19. int Troll_battle();
  20. void clscr();
  21.  
  22. // Stats of Units
  23.  
  24. const int Mill_costs = 10;
  25. const int Arch_costs = 20;
  26. const int Pike_costs = 30;
  27. const int Cava_costs = 35;
  28.  
  29. class town
  30. {
  31. public:
  32.     int population;
  33.     long int gold;
  34.  
  35.     struct{
  36.         int barracks;
  37.         int barracks_lvl;
  38.         int homes;
  39.         int homes_lvl;
  40.     } building;
  41.  
  42.     struct{
  43.         int HP;
  44.         int DEF;
  45.         int DAM;
  46.         int unit_val;
  47.     } Military;
  48.  
  49.     struct{
  50.         int HP;
  51.         int DEF;
  52.         int DAM;
  53.         int unit_val;
  54.     } Archers;
  55.  
  56.     struct{
  57.         int HP;
  58.         int DEF;
  59.         int DAM;
  60.         int unit_val;
  61.     } Pikemen;
  62.  
  63.     struct{
  64.         int HP;
  65.         int DEF;
  66.         int DAM;
  67.         int unit_val;
  68.     } Cavalry;
  69. };
  70.  
  71. struct Troll{
  72.     int HP;
  73.     int DEF;
  74.     int DAM;
  75. } Troll;
  76.  
  77. town white, black;
  78.  
  79. int main()
  80. {
  81.     char choice;
  82.     int win = 0, homes_timer = 0, barracks_timer = 0;
  83.  
  84.     // Initial conditions
  85.  
  86.     white.population = POP;
  87.     white.building.homes = POP/4;
  88.     white.building.homes_lvl = 1;
  89.     white.building.barracks = 0;
  90.     white.building.barracks_lvl = 0;
  91.     white.gold = CASH;
  92.     white.Military.unit_val = 0;
  93.     white.Archers.unit_val = 0;
  94.     white.Pikemen.unit_val = 0;
  95.     white.Cavalry.unit_val = 0;
  96.     white.Military.HP = 100;
  97.     white.Archers.HP = 80;
  98.     white.Pikemen.HP = 120;
  99.     white.Cavalry.HP = 150;
  100.     white.Military.DEF = 50;
  101.     white.Archers.DEF = 30;
  102.     white.Pikemen.DEF = 100;
  103.     white.Cavalry.DEF = 110;
  104.     white.Military.DAM = 100;
  105.     white.Archers.DAM = 130;
  106.     white.Pikemen.DAM = 165;
  107.     white.Cavalry.DAM = 150;
  108.  
  109.     black = white;
  110.  
  111.     Troll.HP = 99999;
  112.     Troll.DEF = 50000;
  113.     Troll.DAM = 25000;
  114.  
  115.     // Balance
  116.  
  117.     for (int i = 1; win == 0; i++)
  118.     {
  119.         cout << "\t\t\t        _._.= " << i << " day =._._" << endl << endl;
  120.         cout << "Gold: " << white.gold << endl;
  121.         cout << "Population: " << white.population << " people" << endl;
  122.         if (white.Military.unit_val > 0)
  123.             cout << "Military: " << white.Military.unit_val << endl;
  124.         if (white.Archers.unit_val > 0)
  125.             cout << "Archers: " << white.Archers.unit_val << endl;
  126.         if (white.Pikemen.unit_val > 0)
  127.             cout << "Pikemen: " << white.Pikemen.unit_val << endl;
  128.         if (white.Cavalry.unit_val > 0)
  129.             cout << "Cavalry: " << white.Cavalry.unit_val << endl;
  130.  
  131.         int err;
  132.  
  133.     // Dialog
  134.  
  135.         do{
  136.             choice = menu();
  137.  
  138.             err = 0;
  139.  
  140.             switch(choice)
  141.             {
  142.                 case 'j':
  143.                     if (white.gold != 0)
  144.                     {
  145.                         white.gold = 0;
  146.                         cout << "\nTaki thank you! *Rebe love you*\n";
  147.                     }
  148.  
  149.                 case 'w':
  150.                     break;
  151.  
  152.                 case '1':
  153.                     if ((white.gold - 600) < 0)
  154.                     {
  155.                         cout << "\nNot enough gold\n";
  156.                         err = 1;
  157.                     }
  158.                     else
  159.                     {
  160.                         if (homes_timer != 0)
  161.                         {
  162.                             cout << "\nWait when previous home will be completed!\n";
  163.                             err = 1;
  164.                         }
  165.                         else{
  166.                             white.gold -= 600;
  167.                             cout << "\nAfter 2 days build will be complete\n\n";
  168.                             homes_timer = i + 2;
  169.                             err = 1;
  170.                         }
  171.                     }
  172.                     break;
  173.  
  174.                 case '2':
  175.                     if((white.gold - 2000) < 0 || white.building.homes_lvl < 1)
  176.                     {
  177.                         cout << "\nNot enough gold and/or lvl for build\n";
  178.                         err = 1;
  179.                     }
  180.                     else
  181.                     {
  182.                         if (homes_timer != 0)
  183.                         {
  184.                             cout << "\nWait when previous home will be completed!\n";
  185.                             err = 1;
  186.                         }
  187.                         else{
  188.                             white.gold -= 2000;
  189.                             cout << "\nAfter 3 days build will be complete\n\n";
  190.                             homes_timer = i + 3;
  191.                             err = 1;
  192.                         }
  193.                     }
  194.                     break;
  195.  
  196.                 case '3':
  197.                     if((white.gold - 5000) < 0 || white.building.homes_lvl < 2)
  198.                     {
  199.                         cout << "\nNot enough gold and/or lvl for build\n";
  200.                         err = 1;
  201.                     }
  202.                     else
  203.                     {
  204.                         if (homes_timer != 0)
  205.                         {
  206.                             cout << "\nWait when previous home will be completed!\n";
  207.                             err = 1;
  208.                         }
  209.                         else{
  210.                             white.gold -= 5000;
  211.                             cout << "\nAfter 5 days build will be complete\n\n";
  212.                             homes_timer = i + 5;
  213.                             err = 1;
  214.                         }
  215.                     }
  216.                     break;
  217.  
  218.                 case 'f':
  219.                     if ((white.gold - 1000) < 0)
  220.                     {
  221.                         cout << "\nNot enough gold\n";
  222.                         err = 1;
  223.                     }
  224.                     else
  225.                     {
  226.                         if (barracks_timer != 0)
  227.                         {
  228.                             cout << "\nWait when previous barracks will be completed!\n";
  229.                             err = 1;
  230.                         }
  231.                         else{
  232.                             white.gold -= 1000;
  233.                             cout << "\nAfter 2 days build will be complete\n";
  234.                             barracks_timer = i + 2;
  235.                             err = 1;
  236.                         }
  237.                     }
  238.                     break;
  239.  
  240.                 case 's':
  241.                     if((white.gold - 5000) < 0 || white.building.barracks_lvl < 1)
  242.                     {
  243.                         cout << "\nNot enough gold and/or lvl for build\n";
  244.                         err = 1;
  245.                     }
  246.                     else
  247.                     {
  248.                         if (barracks_timer != 0)
  249.                         {
  250.                             cout << "\nWait when previous barak will be completed!\n";
  251.                             err = 1;
  252.                         }
  253.                         else{
  254.                             white.gold -= 5000;
  255.                             cout << "\nAfter 4 days build will be complete\n";
  256.                             barracks_timer = i + 4;
  257.                             err = 1;
  258.                         }
  259.                     }
  260.                     break;
  261.  
  262.                 case 't':
  263.                     if((white.gold - 12000) < 0 || white.building.barracks_lvl < 2)
  264.                     {
  265.                         cout << "\nNot enough gold and/or lvl for build\n";
  266.                         err = 1;
  267.                     }
  268.                     else
  269.                     {
  270.                         if (barracks_timer != 0)
  271.                         {
  272.                             cout << "\nWait when previous home will be completed!\n";
  273.                             err = 1;
  274.                         }
  275.                         else{
  276.                             white.gold -= 12000;
  277.                             cout << "\nAfter 6 days build will be complete\n";
  278.                             barracks_timer = i + 6;
  279.                             err = 1;
  280.                         }
  281.                     }
  282.                     break;
  283.  
  284.                 case 'm':
  285.                     if ((white.gold - Mill_costs * 60) < 0)
  286.                     {
  287.                         cout << "\nNot enough gold\n";
  288.                         err = 1;
  289.                     }
  290.                     else
  291.                     {
  292.                         if (white.building.barracks < 1)
  293.                         {
  294.                             cout << "\nFirst of all build barracks!\n";
  295.                             err = 1;
  296.                         }
  297.                         else
  298.                         {
  299.                             white.Military.unit_val += 60;
  300.                             cout << "\nNew military: Ok sir! Let's rush enemy!\n";
  301.                             err = 1;
  302.                         }
  303.                     }
  304.                     break;
  305.  
  306.                 case 'a':
  307.                     if ((white.gold - Arch_costs * 40) < 0)
  308.                     {
  309.                         cout << "\nNot enough gold\n";
  310.                         err = 1;
  311.                     }
  312.                     else
  313.                     {
  314.                         if (white.building.barracks < 1)
  315.                         {
  316.                             cout << "\nFirst of all build barracks!\n";
  317.                             err = 1;
  318.                         }
  319.                         else
  320.                         {
  321.                             if (white.building.barracks_lvl < 2)
  322.                             {
  323.                                 cout << "\nYour barracks lvl is too low for this units!\n";
  324.                                 err = 1;
  325.                             }
  326.                             else
  327.                             {
  328.                                 white.Archers.unit_val += 40;
  329.                                 cout << "\nNew archers: Our arrows belong to you and incur death of your enemies!\n";
  330.                                 err = 1;
  331.                             }
  332.                         }
  333.                     }
  334.                     break;
  335.  
  336.                 case 'p':
  337.                     if ((white.gold - Pike_costs * 30) < 0)
  338.                     {
  339.                         cout << "\nNot enough gold\n";
  340.                         err = 1;
  341.                     }
  342.                     else
  343.                     {
  344.                         if (white.building.barracks < 1)
  345.                         {
  346.                             cout << "\nFirst of all build barracks!\n";
  347.                             err = 1;
  348.                         }
  349.                         else
  350.                         {
  351.                             if (white.building.barracks_lvl < 3)
  352.                             {
  353.                                 cout << "\nYour barracks lvl is too low for this units!\n";
  354.                                 err = 1;
  355.                             }
  356.                             else
  357.                             {
  358.                                 white.Pikemen.unit_val += 30;
  359.                                 cout << "\nNew pikemen: Our pikes is so long that you can't be afraid that enemy comes!\n";
  360.                                 err = 1;
  361.                             }
  362.                         }
  363.                     }
  364.                     break;
  365.  
  366.                 case 'c':
  367.                     if ((white.gold - Cava_costs * 30) < 0)
  368.                     {
  369.                         cout << "\nNot enough gold\n";
  370.                         err = 1;
  371.                     }
  372.                     else
  373.                     {
  374.                         if (white.building.barracks < 1)
  375.                         {
  376.                             cout << "\nFirst of all build barracks!\n";
  377.                             err = 1;
  378.                         }
  379.                         else
  380.                         {
  381.                             if (white.building.barracks_lvl < 3)
  382.                             {
  383.                                 cout << "\nYour barracks lvl is too low for this units!\n";
  384.                                 err = 1;
  385.                             }
  386.                             else
  387.                             {
  388.                                 white.Cavalry.unit_val += 30;
  389.                                 cout << "\nNew cavalries: Feel like a Chingisxan)\n";
  390.                                 err = 1;
  391.                             }
  392.                         }
  393.                     }
  394.                     break;
  395.  
  396.                 case 'k':
  397.                     if (white.Military.unit_val < 1)
  398.                     {
  399.                         if (white.Archers.unit_val < 1)
  400.                         {
  401.                             if (white.Pikemen.unit_val < 1 )
  402.                             {
  403.                                 if (white.Cavalry.unit_val < 1 )
  404.                                 {
  405.                                     cout << "\n\tWhat about you thinking man? You haven't no one unit!\n";
  406.                                     cout << "\tIf you hoped overcome Troll king the power of thought \n\tI must disappoint you(\n";
  407.                                     cout << "\tIt feature will added in next releases(when AMO-sphere will discovered)!\n";
  408.                                     err = 1;
  409.                                     break;
  410.                                 }
  411.                                 win = Troll_battle();
  412.                             }
  413.                             win = Troll_battle();
  414.                         }
  415.                         win = Troll_battle();
  416.                     }
  417.                     win = Troll_battle();
  418.                     break;
  419.             }
  420.  
  421.         }while(err != 0);
  422.  
  423.         if (homes_timer != 0 && i == homes_timer)
  424.         {
  425.             cout << "\nOne home was completed!\n\n";
  426.             white.building.homes_lvl++;
  427.             white.building.homes++;
  428.             homes_timer = 0;
  429.         }
  430.         if (barracks_timer != 0 && i == barracks_timer)
  431.         {
  432.             cout << "\nOne barracks was completed!\n\n";
  433.             white.building.barracks_lvl++;
  434.             white.building.barracks++;
  435.             barracks_timer = 0;
  436.         }
  437.  
  438.         // Every step changes
  439.  
  440.         white.gold += TAX_RATE_WHITE * white.population * 0.1; // Tax
  441.         black.gold += TAX_RATE_BLACK * black.population * 0.1;
  442.  
  443.         white.population += white.population * 0.1 * white.building.homes_lvl / TAX_RATE_WHITE + 1; // Growth
  444.         black.population += black.population * 0.1 * black.building.homes_lvl / TAX_RATE_BLACK + 1;
  445.  
  446.         clscr();
  447.     }
  448.  
  449.     if (win == 1)
  450.     {
  451.         cout << "\tIt's WIN! My congratulations!!!\n\n";
  452.         return 0;
  453.     }
  454.     if (win == -1)
  455.     {
  456.         cout << "\tGame Over! My congratulations!)azaza\n\n";
  457.         return 0;
  458.     }
  459. }
  460.  
  461. char menu()
  462. {
  463.     char m;
  464.  
  465.     do{
  466.         cout << "\n\tWhat we will doing today?\n\n" << "(G)o into battle" << "\nBuild new (h)omes\n" << "Build new (b)arracks\n"
  467.         << "Buy (u)nits in barracks\n" << "Spend some money on (j)ews\n" << "Just (w)ait\n"<< "\nYour choice: ";
  468.         cin >> m;
  469.     }while(!strchr("ghbjwu", tolower(m)));
  470.  
  471.     m = tolower(m); // User can enter U or u - it will work
  472.  
  473.     if (m == 'h')
  474.     {
  475.         do{
  476.             cout << "\n\tYou can build one of three types of homes:\n\n" << "(1)-st lvl: need 600 gold and 2 days\n"
  477.             << "(2)-nd lvl: need 2000 gold + 1 lvl and 3 days\n" << "(3)-rd lvl: need 5000 gold + 2 lvl and 5 days\n"
  478.             << "\nYour choice: ";
  479.             cin >> m;
  480.         }while(!strchr("123", tolower(m)));
  481.     }
  482.  
  483.     if (m == 'b')
  484.     {
  485.         do{
  486.             cout << "\n\tYou can build one of three types of barracks:\n\n" << "(F)irst lvl: need 1000 gold and 2 days\n"
  487.             << "(S)econd lvl: need 5000 gold + 1 lvl and 4 days\n" << "(T)hird lvl: need 12000 gold + 2 lvl and 6 days\n"
  488.             << "\nYour choice: ";
  489.             cin >> m;
  490.         }while(!strchr("fst", tolower(m)));
  491.     }
  492.  
  493.     if (m == 'u')
  494.     {
  495.         do{
  496.             cout << "\n\tSelect unit type:\n\n" << "(M)ilitary(1-st lvl of barracks) 60 units cost: " << Mill_costs * 60
  497.             << "\n(A)rchers(2-nd lvl of barracks) 40 units cost: " << Arch_costs * 40
  498.             << "\n(P)ikemen(3-st lvl of barracks) 30 units cost: " << Pike_costs * 30
  499.             << "\n(C)avalry (3-st lvl of barracks) 30 units cost: "<< Cava_costs * 30
  500.             << "\n*Note: you can buy only troop of units"<< "\n\nYour choice: ";
  501.             cin >> m;
  502.         }while(!strchr("mapc", tolower(m)));
  503.     }
  504.  
  505.     if (m == 'g')
  506.     {
  507.         cout << "\n\tSo, you are want to die or kill somebody?) Good solution :3\n\tWhere are we will going?\n\n"
  508.         << "Troll (k)ing\n  (Giant fat guy, if you'll overcome him you'll get\n  a lot of money and glad + glory + princess with big tits)"
  509.         << "\n(More enemies soon)" << "\n\nYour choice: ";
  510.         cin >> m;
  511.     }
  512.  
  513.     m = tolower(m);
  514.  
  515.     return m;
  516. }
  517.  
  518. int Troll_battle()
  519. {
  520.     int win = 0, my_damage = 0;
  521.     int my_hp = (white.Military.HP * white.Military.unit_val + white.Archers.HP * white.Archers.unit_val + white.Pikemen.HP * white.Pikemen.unit_val + white.Cavalry.HP * white.Cavalry.unit_val);
  522.  
  523.     for (int i = 1; win == 0; i++)
  524.     {
  525.         clscr();
  526.         cout << "\t\t\t\t   |--| Move " << i << " |--|\n\n";
  527.         cout << "\tTroll now: " << Troll.HP << " HP\n";
  528.         cout << "\tYour army now: " << my_hp << " HP\n\n\n";
  529.  
  530.         if (white.Military.unit_val > 0)
  531.         {
  532.             my_damage = white.Military.DAM * white.Military.unit_val - Troll.DEF;
  533.             if (my_damage > 0)
  534.             {
  535.                 Troll.HP -= my_damage;
  536.                 cout << " - Military caused damage: " << my_damage << " HP\n";
  537.             }
  538.             else
  539.                 cout << " Units can't punch Troll king's defense\n";
  540.             cout << " - Troll HP now: " << Troll.HP << " \n\n";
  541.         }
  542.  
  543.         if (white.Pikemen.unit_val > 0 )
  544.         {
  545.             my_damage = white.Pikemen.DAM * white.Pikemen.unit_val - Troll.DEF;
  546.             if (my_damage > 0)
  547.             {
  548.                 Troll.HP -= my_damage;
  549.                 cout << " - Pikemen caused damage: " << my_damage << " HP\n";
  550.             }
  551.             else
  552.                 cout << " Units can't punch Troll king's defense\n";
  553.             cout << " - Troll HP now: " << Troll.HP << " \n\n";
  554.         }
  555.  
  556.         if (white.Cavalry.unit_val > 0 )
  557.         {
  558.             my_damage = white.Cavalry.DAM * white.Cavalry.unit_val - Troll.DEF;
  559.             if (my_damage > 0)
  560.             {
  561.                 Troll.HP -= my_damage;
  562.                 cout << " - Cavalry caused damage: " << my_damage << " HP\n";
  563.             }
  564.             else
  565.                 cout << " Units can't punch Troll king's defense\n";
  566.             cout << " - Troll HP now: " << Troll.HP << " \n\n";
  567.         }
  568.  
  569.         if (white.Archers.unit_val > 0)
  570.         {
  571.             my_damage = white.Archers.DAM * white.Archers.unit_val - Troll.DEF;
  572.             if (my_damage > 0)
  573.             {
  574.                 Troll.HP -= my_damage;
  575.                 cout << " - Archers caused damage: " << my_damage << " HP\n";
  576.             }
  577.             else
  578.                 cout << " Units can't punch Troll king's defense\n";
  579.             cout << " - Troll HP now: " << Troll.HP << " \n\n";
  580.         }
  581.  
  582.         if (Troll.HP > 0)
  583.         {
  584.             my_hp -= Troll.DAM;
  585.             cout << " - Troll king caused damage: " << Troll.DAM << " HP\n";
  586.         }
  587.         if (Troll.HP <= 0)
  588.         {
  589.             win = 1;
  590.             cout << "\n\n\t\t\t   \tEnd of the battle!\n\n";
  591.         }
  592.         if (my_hp <= 0)
  593.         {
  594.             win = -1;
  595.             cout << "\n\n\t\t\t   \tEnd of the battle\n\n";
  596.         }
  597.  
  598.     }
  599.  
  600.     return win;
  601. }
  602.  
  603. void clscr()
  604. {
  605.     int pause;
  606.  
  607.     if (system_switch == 1)
  608.         {
  609.             cout << "\nFor continue press any symbol + Enter\nSymbol: ";
  610.             cin >> pause;
  611.             cout << "\n";
  612.             system("clear");
  613.         }
  614.         else
  615.             if (system_switch == 2)
  616.             {
  617.                 system("PAUSE");
  618.                 system("cls");
  619.             }
  620. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement