Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 39.24 KB | None | 0 0
  1. //Dominika Piotrowska 180311 ID2
  2. //Project 1 – card game
  3.  
  4. #include<iostream>
  5. #include<ctime>
  6. #include <unistd.h>
  7.  
  8. using namespace std;
  9.  
  10. #define FILE_AVERAGE "average.txt"
  11. #define FILE_WINS "numberOfWins.txt"
  12. #define FILE_AVERAGE_2 "average2.txt"
  13.  
  14. #define SLEEP_TIME 0
  15.  
  16. #define MAX_SIZE_OF_DECK 52
  17. #define NUMBER_OF_COLORS 4
  18. #define NUMBER_OF_FIGURES 13
  19. const char CLUBS[] = { "\xe2\x99\xa3" };
  20. const char DIAMONDS[] = { "\xe2\x97\x86" };
  21. const char HEARTS[] = { "\xe2\x99\xa5" };
  22. const char SPADES[] = { "\xe2\x99\xa0" };
  23.  
  24. struct card {
  25. char rank;
  26. char color[4];
  27. unsigned short value;
  28. unsigned short valueColor;
  29. };
  30.  
  31. struct player {
  32. card deck[MAX_SIZE_OF_DECK]{};
  33. int numberOfWins = 0;
  34. int numberOfCards = 0;
  35. void (*strategy)(player&, player&) = nullptr;
  36.  
  37. };
  38.  
  39. void zeroing(card array[]);
  40. int choosingVariant(char variant);
  41. void initialization(int sizeOfDeck, card deck[]);
  42. void shuffling(int sizeOfDeck, card deck[]);
  43. int check(int pomValue, int pomValueColor, card deck[], int i);
  44. void dealingCards(int sizeOfDeck, card deck[], player& player1, player& player2);
  45. void initialHands(player& player1, player& player2);
  46. void battle(int sizeOfDeck, player& player1, player& player2, int isVariantA, int& sumOfMovements, card randomDeck[], int isSmartwar);
  47. void warSmartWar(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int& counter, int& numberOfMovements, int isVariantA, card randomDeck[], int isSmartWar);
  48. void randomStrategy(player& currentPlayer, player& secondPlayer);
  49. void furiousStrategy(player& furiousPlayer, player& secondPlayer);
  50. void peacefulStrategy(player& peacefulPlayer, player& secondPlayer);
  51. void winningRandom(player& winningPlayer, player& losingPlayer);
  52. void randomAdding(player& winningPlayer, player& losingPlayer, int counter, card randomDeck[]);
  53. void variantA(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int counter, int isVariantA, int& numberOfMovements, card randomDeck[], int isSmartWar);
  54. void variantB(player& winningPlayer, player& losingPlayer, int& counter);
  55. void moving(player& currentPlayer);
  56. void clear(player& currentPlayer, int number);
  57. void winning(player& winningPlayer, player& losingPlayer);
  58. void war(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int& counter, int isVariantA, int& numberOfMovements, int& counterHelp, card randomDeck[], int isSmartWar);
  59. void movingWar(player& winningPlayer, player& losingPlayer, int counter);
  60. void displayWar(player& player1, player& player2, card deck1[], card deck2[]);
  61. void endingWar(player& player1, player& player2, card deck1[], card deck2[], int counter, int isVariantA, card randomDeck[], int isSmartWar);
  62. void battleSmartWar(int sizeOfDeck, player& player1, player& player2, int isVariantA, int& sumOfMovements, card randomDeck[], int isSmartWar,int i);
  63. void ending(player& player1, player& player2, int numberOfMovements, int& sumOfMovements);
  64. void choosePlayerStrategy(player&);
  65. int valueOfStartingDeck(card* deck, int sizeOfDeck);
  66. int main()
  67. {
  68.  
  69.  
  70. card deck[MAX_SIZE_OF_DECK];
  71. card randomDeck[MAX_SIZE_OF_DECK];
  72. zeroing(randomDeck);
  73. srand(time(NULL));
  74.  
  75.  
  76. player player1;
  77. player player2;
  78. player1.numberOfWins = 0;
  79. player2.numberOfWins = 0;
  80. int sizeOfDeck = 0;
  81. char variant = 0;
  82. int sumOfMovements = 0;
  83. int option = 1;
  84. cout << "What do you want to do?" << endl;
  85. cout << "1. Demonstrate a simulation of a game. " << endl;
  86. cout << "2. Experiment 1. Simulate war game for x times and save to the file average number of movements." << endl;
  87. cout << "3. Experiment 1. Smart war game simulations." << endl;
  88. cout << "4. Experiment 2. Smart war game strategies." << endl;
  89. cout << "5. Experiment 2. Correlation." << endl;
  90. cout << "You choose option ";
  91. cin >> option;
  92. if (option != 4)//in option 4 size of deck must be 52
  93. {
  94. cout << "Choose size of deck: ";
  95. cin >> sizeOfDeck;
  96. }
  97. int isVariantA = 0;
  98. int isSmartWar = 0;
  99. if (option == 1 || option == 2||option==5)
  100. {
  101. cout << "Choose one of two possible variants of the game." << endl;
  102. cout << "A . If a player runs out of cards during a war he immediately loses." << endl;
  103. cout << "B . If a player (say X) runs out of cards during a war, then:" << endl << "1) if X starting the war had only one card, then his opponent (sayY) is placing two cards on X’s stack, then two cards on Y’s," << endl << "2) if X starting the war had two cards, then his opponent Y is placing one card on X’s stack, then one card on Y’s," << endl << "3) if Y runs of cards while playing, then X is loosing." << endl;
  104. cout << "You choose: ";
  105. cin >> variant;
  106. isVariantA = choosingVariant(variant);
  107. }
  108. if (option == 1)
  109. {
  110. initialization(sizeOfDeck, deck);
  111. dealingCards(sizeOfDeck, deck, player1, player2);
  112. battle(sizeOfDeck, player1, player2, isVariantA, sumOfMovements,randomDeck,isSmartWar);
  113. }
  114. else if (option == 2)
  115. {
  116. int numberOfGames = 0;
  117. cout << "How many times do you want to simulate this game?" << endl;
  118. cout << "You choose ";
  119. cin >> numberOfGames;
  120. for (int i = 0; i < numberOfGames; i++)
  121. {
  122. zeroing(player1.deck);
  123. zeroing(player2.deck);
  124. initialization(sizeOfDeck, deck);
  125. dealingCards(sizeOfDeck, deck, player1, player2);
  126. battle(sizeOfDeck, player1, player2, isVariantA, sumOfMovements, randomDeck, isSmartWar);
  127. }
  128. cout << endl << "Player1 won " << player1.numberOfWins << " times";
  129. cout << endl << "Player2 won " << player2.numberOfWins << " times";
  130. cout << endl << "IN " << numberOfGames << " GAMES " << sumOfMovements << " WERE MADE.";
  131. FILE* average = fopen(FILE_AVERAGE, "a");
  132. int averageOfMovements = sumOfMovements / numberOfGames;
  133.  
  134. fprintf(average, "average movements %d\n", averageOfMovements);
  135. fprintf(average, "size of deck %d\n", sizeOfDeck);
  136. fprintf(average, "variant %c\n", variant);
  137. fclose(average);
  138. cout << endl << "AVERAGE NUMBER OF MOVEMENTS PER GAME " << averageOfMovements << endl;
  139.  
  140. }
  141. else if (option == 3)
  142. {
  143. int numberOfGames = 0;
  144. cout << "How many times do you want to simulate this game?" << endl;
  145. cout << "You choose ";
  146. cin >> numberOfGames;
  147. isVariantA = 1;
  148. isSmartWar = 1;
  149. player1.strategy = randomStrategy;
  150. player2.strategy = randomStrategy;
  151.  
  152. for (int i = 0; i < numberOfGames; i++)
  153. {
  154. zeroing(player1.deck);
  155. zeroing(player2.deck);
  156. initialization(sizeOfDeck, deck);
  157. dealingCards(sizeOfDeck, deck, player1, player2);
  158. battleSmartWar(sizeOfDeck, player1, player2, isVariantA, sumOfMovements, randomDeck, isSmartWar,i);
  159. }
  160. cout << endl << "Player1 won " << player1.numberOfWins << " times";
  161. cout << endl << "Player2 won " << player2.numberOfWins << " times";
  162. cout << endl << "IN " << numberOfGames << " GAMES " << sumOfMovements << "WERE MADE.";
  163. FILE* average2 = fopen(FILE_AVERAGE_2, "a");
  164. int averageOfMovements = sumOfMovements / numberOfGames;
  165.  
  166. fprintf(average2, "average movements %d\n", averageOfMovements);
  167. fprintf(average2, "size of deck %d\n", sizeOfDeck);
  168. fclose(average2);
  169. cout << endl << "AVERAGE NUMBER OF MOVEMENTS PER GAME" << averageOfMovements << endl;
  170.  
  171. }
  172. else if (option == 4)
  173. {
  174.  
  175. isVariantA = 1;
  176. isSmartWar = 1;
  177. sizeOfDeck = 52;
  178. cout << "Choose strategy for 1 Player: " << endl;
  179. cout << "1.Random." << endl;
  180. cout << "2.Furious." << endl;
  181. cout << "3.Peaceful." << endl;
  182. choosePlayerStrategy(player1);
  183.  
  184. cout << "Choose strategy for 2 Player: " << endl;
  185. cout << "1.Random." << endl;
  186. cout << "2.Furious." << endl;
  187. cout << "3.Peaceful." << endl;
  188. choosePlayerStrategy(player2);
  189.  
  190.  
  191. int numberOfGames = 0;
  192. cout << "How many times do you want to simulate this game?" << endl;
  193. cout << "You choose ";
  194. cin >> numberOfGames;
  195. for (int i = 0; i < numberOfGames; i++)
  196. {
  197. zeroing(player1.deck);
  198. zeroing(player2.deck);
  199. initialization(sizeOfDeck, deck);
  200. dealingCards(sizeOfDeck, deck, player1, player2);
  201. battleSmartWar(sizeOfDeck, player1, player2, isVariantA, sumOfMovements, randomDeck, isSmartWar,i);
  202.  
  203. }
  204. cout << endl << "Player1 won " << player1.numberOfWins << " times";
  205. cout << endl << "Player2 won " << player2.numberOfWins << " times";
  206. FILE* wins = fopen(FILE_WINS, "a");
  207.  
  208. fprintf(wins, "player 1 wins %d\n", player1.numberOfWins);
  209. fprintf(wins, "player 2 wins %d\n", player2.numberOfWins);
  210.  
  211. fprintf(wins, "strategy player 1 ");
  212. if (player1.strategy == randomStrategy)
  213. fprintf(wins, "RANDOM\n");
  214. else if (player1.strategy == furiousStrategy)
  215. fprintf(wins, "FURIOUS\n");
  216. else
  217. fprintf(wins, "PEACEFUL\n");
  218.  
  219. fprintf(wins, "strategy player 2 ");
  220. if (player2.strategy == randomStrategy)
  221. fprintf(wins, "RANDOM\n");
  222. else if (player2.strategy == furiousStrategy)
  223. fprintf(wins, "FURIOUS\n");
  224. else
  225. fprintf(wins, "PEACEFUL\n");
  226. fclose(wins);
  227. }
  228. else if (option == 5)
  229. {
  230.  
  231. initialization(sizeOfDeck, deck);
  232. dealingCards(sizeOfDeck, deck, player1, player2);
  233. cout << "p1 deck value: " << valueOfStartingDeck(player1.deck, sizeOfDeck) << endl;
  234. cout << "p2 deck value: " << valueOfStartingDeck(player2.deck, sizeOfDeck) << endl;
  235. battle(sizeOfDeck, player1, player2, isVariantA, sumOfMovements, randomDeck, isSmartWar);
  236.  
  237. }
  238.  
  239.  
  240. return 0;
  241.  
  242. }
  243.  
  244. int choosingVariant(char variant)
  245. {
  246. int option = 0;
  247. switch (variant)
  248. {
  249. case 'A':
  250. option = 1;
  251. break;
  252. case 'B':
  253. option = 0;
  254. break;
  255. default:
  256. break;
  257. }
  258. return option;
  259. }
  260.  
  261. void initialization(int sizeOfDeck, card deck[])
  262. {
  263. zeroing(deck);
  264. shuffling(sizeOfDeck, deck);
  265. for (int i = 0; i < sizeOfDeck; i++)
  266. {
  267. if (deck[i].value < 9)
  268. {
  269. deck[i].rank = (deck[i].value + 49);
  270. }
  271. else
  272. {
  273. switch (deck[i].value)
  274. {
  275. case 9:
  276. deck[i].rank = 'X';
  277. break;
  278. case 10:
  279. deck[i].rank = 'J';
  280. break;
  281. case 11:
  282. deck[i].rank = 'Q';
  283. break;
  284. case 12:
  285. deck[i].rank = 'K';
  286. break;
  287. case 13:
  288. deck[i].rank = 'A';
  289. break;
  290. }
  291. }
  292. switch (deck[i].valueColor)
  293. {
  294. case 1:
  295. strcpy(deck[i].color, CLUBS);
  296. break;
  297. case 2:
  298. strcpy(deck[i].color, DIAMONDS);
  299. break;
  300. case 3:
  301. strcpy(deck[i].color, HEARTS);
  302. break;
  303. case 4:
  304. strcpy(deck[i].color, SPADES);
  305. break;
  306. }
  307. }
  308. }
  309.  
  310. int check(int pomValue, int pomValueColor, card deck[], int i)//check if such a card is already in the deck
  311. {
  312. for (int index = 0; index < i; index++)
  313. {
  314. if (pomValue == deck[index].value && pomValueColor == deck[index].valueColor)
  315. {
  316. return 1;
  317. }
  318. }
  319. deck[i].value = pomValue;
  320. deck[i].valueColor = pomValueColor;
  321. return 0;
  322. }
  323.  
  324. void shuffling(int sizeOfDeck, card deck[])
  325. {
  326.  
  327. for (int i = 0; i < sizeOfDeck; i++)
  328. {
  329. int pomValue;
  330. int pomValueColor;
  331. do {
  332. pomValue = rand() % (sizeOfDeck / NUMBER_OF_COLORS) + (NUMBER_OF_FIGURES - sizeOfDeck / NUMBER_OF_COLORS + 1);
  333. pomValueColor = rand() % (NUMBER_OF_COLORS)+1;
  334. } while (check(pomValue, pomValueColor, deck, i));
  335. }
  336. }
  337.  
  338. void dealingCards(int sizeOfDeck, card deck[], player& player1, player& player2)
  339. {
  340. player1.numberOfCards = sizeOfDeck / 2;
  341. player2.numberOfCards = sizeOfDeck / 2;
  342. for (int i = 0; i < sizeOfDeck; i++)
  343. {
  344. if (i < (sizeOfDeck / 2))
  345. {
  346. player1.deck[i] = deck[i];
  347. }
  348. else
  349. {
  350. player1.deck[i].value = 0;
  351. player1.deck[i].valueColor = 0;
  352. player1.deck[i].rank = 0;
  353. strcpy(player1.deck[i].color, "");
  354. }
  355. }
  356. for (int i = 0; i < sizeOfDeck; i++)
  357. {
  358. if (i < sizeOfDeck / 2)
  359. {
  360. player2.deck[i] = deck[i + (sizeOfDeck / 2)];
  361. }
  362. else
  363. {
  364. player2.deck[i].value = 0;
  365. player2.deck[i].valueColor = 0;
  366. player2.deck[i].rank = 0;
  367. strcpy(player2.deck[i].color, "");
  368. }
  369. }
  370. }
  371. void initialHands(player& player1, player& player2)
  372. {
  373. cout << "----------------------------------------------" << endl;
  374. cout << "----------------------------------------------" << endl;
  375. cout << "Initial hands PLAYER 1" << endl << endl;
  376. for (int i = 0; i < player1.numberOfCards; i++)
  377. {
  378. cout << "PLAYER1 [" << i << "]\t\t" << player1.deck[i].rank << player1.deck[i].color << endl;
  379. }
  380. cout << "----------------------------------------------" << endl;
  381. cout << "----------------------------------------------" << endl;
  382. cout << "Initial hands PLAYER 2" << endl << endl;
  383. for (int i = 0; i < player2.numberOfCards; i++)
  384. {
  385. cout << "PLAYER2 [" << i << "]\t\t" << player2.deck[i].rank << player2.deck[i].color << endl;
  386. }
  387. }
  388. void battleSmartWar(int sizeOfDeck, player& player1, player& player2, int isVariantA, int& sumOfMovements,card randomDeck[],int isSmartWar,int i)
  389. {
  390. int numberOfMovements = 0;
  391. int numberOfChoicesMade = 0;
  392.  
  393. initialHands(player1, player2);
  394. while (player1.numberOfCards != 0 && player2.numberOfCards != 0)
  395. {
  396. numberOfMovements++;
  397. numberOfChoicesMade++;
  398. if(i % 2 == 0) {
  399.  
  400. if (numberOfChoicesMade % 2 == 0) {
  401. cout << endl << "PLAYER 1\t \t";
  402. cout << "PLAYER 2" << endl;
  403. cout << player1.deck[0].rank << player1.deck[0].color << " | " << player1.deck[1].rank
  404. << player1.deck[1].color << "\t \t \t";
  405. cout << player2.deck[0].rank << player2.deck[0].color << endl;
  406. player1.strategy(player1, player2);
  407. } else {
  408. cout << endl << "PLAYER 1\t \t";
  409. cout << "PLAYER 2" << endl;
  410. cout << player1.deck[0].rank << player1.deck[0].color << "\t \t \t \t";
  411. cout << player2.deck[0].rank << player2.deck[0].color << " | " << player2.deck[1].rank
  412. << player2.deck[1].color << endl;
  413. player2.strategy(player2, player1);
  414. }
  415. }
  416. else {
  417. if (numberOfChoicesMade % 2 == 1) {
  418. cout << endl << "PLAYER 1\t \t";
  419. cout << "PLAYER 2" << endl;
  420. cout << player1.deck[0].rank << player1.deck[0].color << " | " << player1.deck[1].rank
  421. << player1.deck[1].color << "\t \t \t";
  422. cout << player2.deck[0].rank << player2.deck[0].color << endl;
  423. player1.strategy(player1, player2);
  424. } else {
  425. cout << endl << "PLAYER 1\t \t";
  426. cout << "PLAYER 2" << endl;
  427. cout << player1.deck[0].rank << player1.deck[0].color << "\t \t \t \t";
  428. cout << player2.deck[0].rank << player2.deck[0].color << " | " << player2.deck[1].rank
  429. << player2.deck[1].color << endl;
  430. player2.strategy(player2, player1);
  431. }
  432. }
  433. cout << endl << "PLAYER 1\t \t";
  434. cout << "PLAYER 2" << endl;
  435. cout << player1.deck[0].rank << player1.deck[0].color << "\t \t \t \t";
  436. cout << player2.deck[0].rank << player2.deck[0].color << endl;
  437. sleep(SLEEP_TIME);
  438. if (player1.deck[0].value > player2.deck[0].value)
  439. {
  440. winningRandom(player1, player2);
  441. cout << "Player 1 won a battle." << endl;
  442. }
  443. else if (player1.deck[0].value < player2.deck[0].value)
  444. {
  445. winningRandom(player2, player1);
  446. cout << "Player 2 won a battle." << endl;
  447. }
  448. else//WAR
  449. {
  450. cout << endl << " WAR" << endl << endl;
  451.  
  452. if (player1.numberOfCards < 3 || player2.numberOfCards < 3)
  453. {
  454. if (player1.numberOfCards > player2.numberOfCards)
  455. {
  456. player1.numberOfCards = player1.numberOfCards + player2.numberOfCards;
  457. player2.numberOfCards = 0;
  458. }
  459. else
  460. {
  461. player2.numberOfCards = player2.numberOfCards + player1.numberOfCards;
  462. player1.numberOfCards = 0;
  463. }
  464. }
  465. else
  466. {
  467. numberOfMovements++;
  468. int counter = 1;
  469. player1.numberOfCards = player1.numberOfCards - 3;//they can lose 3 cards
  470. player2.numberOfCards = player2.numberOfCards - 3;
  471. warSmartWar(sizeOfDeck, player1, player2, player1.deck+2, player2.deck+2, counter, numberOfMovements, isVariantA, randomDeck, isSmartWar);
  472. }
  473. }
  474.  
  475.  
  476. }
  477. ending(player1, player2, numberOfMovements, sumOfMovements);
  478. }
  479.  
  480. void randomStrategy(player& currentPlayer, player& secondPlayer)//choosing one of two cards
  481. {
  482. if (currentPlayer.numberOfCards == 1) return;
  483. int i=0;
  484. i = rand() % 2;
  485. if (i == 1)
  486. {
  487. card pomCard = currentPlayer.deck[i];
  488. currentPlayer.deck[i] = currentPlayer.deck[i - 1];
  489. currentPlayer.deck[i - 1] = pomCard;
  490. }
  491. }
  492.  
  493. void furiousStrategy(player& furiousPlayer, player &secondPlayer)
  494. {
  495. if (furiousPlayer.deck[1].value == secondPlayer.deck[0].value)
  496. {
  497. card pomCard = furiousPlayer.deck[1];
  498. furiousPlayer.deck[1] = furiousPlayer.deck[0];
  499. furiousPlayer.deck[0] = pomCard;
  500. }
  501. else if (furiousPlayer.deck[0].value > secondPlayer.deck[0].value)
  502. {
  503. if (furiousPlayer.deck[1].value > secondPlayer.deck[0].value && furiousPlayer.deck[1].value<furiousPlayer.deck[0].value)
  504. {
  505. card pomCard = furiousPlayer.deck[1];
  506. furiousPlayer.deck[1] = furiousPlayer.deck[0];
  507. furiousPlayer.deck[0] = pomCard;
  508. }
  509.  
  510. }
  511. else if (furiousPlayer.deck[0].value < secondPlayer.deck[0].value)
  512. {
  513. if (furiousPlayer.deck[1].value > secondPlayer.deck[0].value)
  514. {
  515. card pomCard = furiousPlayer.deck[1];
  516. furiousPlayer.deck[1] = furiousPlayer.deck[0];
  517. furiousPlayer.deck[0] = pomCard;
  518. }
  519. else if (furiousPlayer.deck[1].value < furiousPlayer.deck[0].value)
  520. {
  521. card pomCard = furiousPlayer.deck[1];
  522. furiousPlayer.deck[1] = furiousPlayer.deck[0];
  523. furiousPlayer.deck[0] = pomCard;
  524. }
  525.  
  526. }
  527.  
  528. }
  529.  
  530. void peacefulStrategy(player& peacefulPlayer, player& secondPlayer)
  531. {
  532. if (peacefulPlayer.numberOfCards == 1) return;
  533. else if (peacefulPlayer.deck[0].value < peacefulPlayer.deck[1].value)
  534. {
  535. if (peacefulPlayer.deck[0].value == secondPlayer.deck[0].value)
  536. {
  537. card pomCard = peacefulPlayer.deck[1];
  538. peacefulPlayer.deck[1] = peacefulPlayer.deck[0];
  539. peacefulPlayer.deck[0] = pomCard;
  540. }
  541.  
  542. }
  543. else
  544. if (peacefulPlayer.deck[1].value != secondPlayer.deck[0].value)
  545. {
  546. card pomCard = peacefulPlayer.deck[1];
  547. peacefulPlayer.deck[1] = peacefulPlayer.deck[0];
  548. peacefulPlayer.deck[0] = pomCard;
  549. }
  550. }
  551.  
  552. void winningRandom(player& winningPlayer, player& losingPlayer)//adding cards in random order after winning the battle
  553. {
  554. int i;
  555. i = rand() % 2;
  556.  
  557. card pomWinner = winningPlayer.deck[0];
  558. card pomLoser = losingPlayer.deck[0];
  559. moving(winningPlayer);
  560. winningPlayer.numberOfCards++;
  561. moving(losingPlayer);
  562. losingPlayer.numberOfCards--;
  563. if (i == 1)
  564. {
  565. winningPlayer.deck[winningPlayer.numberOfCards - 2] = pomWinner;
  566. winningPlayer.deck[winningPlayer.numberOfCards - 1] = pomLoser;
  567. }
  568. else
  569. {
  570. winningPlayer.deck[winningPlayer.numberOfCards - 2] = pomLoser;
  571. winningPlayer.deck[winningPlayer.numberOfCards - 1] = pomWinner;
  572. }
  573.  
  574.  
  575. }
  576.  
  577. void randomAdding(player& winningPlayer, player& losingPlayer, int counter, card randomDeck[])//creating a table with cards which should go to winners hand in random order
  578. {
  579. int index = 0;
  580. for (int i = 0; i < ((counter * 2) + 1); i++)
  581. {
  582. do
  583. {
  584. index = rand() % (2 * ((counter * 2) + 1));
  585. } while (randomDeck[index].value != 0);
  586.  
  587. randomDeck[index]= winningPlayer.deck[0];
  588. moving(winningPlayer);
  589. winningPlayer.numberOfCards--;
  590. }
  591.  
  592. for (int i = 0; i < ((counter * 2) + 1); i++)
  593. {
  594. do
  595. {
  596. index = rand() % (2 * ((counter * 2) + 1));
  597. } while (randomDeck[index].value != 0);
  598.  
  599. randomDeck[index]= losingPlayer.deck[0];
  600. moving(losingPlayer);
  601. losingPlayer.numberOfCards--;
  602. }
  603.  
  604. for (int i = 0; i < (2 * ((counter * 2) + 1)); i++)
  605. {
  606. winningPlayer.deck[winningPlayer.numberOfCards + i] = randomDeck[i];
  607. }
  608.  
  609. zeroing(randomDeck);
  610. winningPlayer.numberOfCards = winningPlayer.numberOfCards + (2 * ((counter * 2) + 1));
  611. }
  612.  
  613. void warSmartWar(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int& counter, int& numberOfMovements, int isVariantA, card randomDeck[],int isSmartWar)
  614. {
  615. if (deck1[0].value == deck2[0].value)
  616. {
  617. counter++;
  618. numberOfMovements++;
  619. if (player1.numberOfCards <= 1 || player2.numberOfCards <= 1)
  620. {
  621.  
  622. endingWar(player1, player2, deck1, deck2, counter, isVariantA, randomDeck, isSmartWar);
  623.  
  624. }
  625. else
  626. {
  627. displayWar(player1, player2, deck1, deck2);
  628. cout << endl << " WAR" << endl << endl;
  629. player1.numberOfCards = player1.numberOfCards - 2;//player can lose 2 cards
  630. player2.numberOfCards = player2.numberOfCards - 2;
  631. warSmartWar(sizeOfDeck, player1, player2, deck1 + 2, deck2 + 2, counter, numberOfMovements,isVariantA,randomDeck,isSmartWar );
  632. }
  633.  
  634. }
  635. else if (player1.numberOfCards < 0)
  636. {
  637. player1.numberOfCards = 0;
  638. player2.numberOfCards = sizeOfDeck;
  639. }
  640. else if (player2.numberOfCards < 0)
  641. {
  642. player2.numberOfCards = 0;
  643. player1.numberOfCards = sizeOfDeck;
  644. }
  645. else
  646. {
  647. endingWar(player1, player2, deck1, deck2, counter, isVariantA,randomDeck,isSmartWar);
  648. }
  649.  
  650. }
  651.  
  652.  
  653. void battle(int sizeOfDeck, player& player1, player& player2, int isVariantA, int& sumOfMovements,card randomDeck[],int isSmartWar)
  654. {
  655. int numberOfMovements = 0;
  656.  
  657. initialHands(player1, player2);
  658. while (player1.numberOfCards != 0 && player2.numberOfCards != 0)
  659. {
  660. int counterHelp = 0;
  661. numberOfMovements++;
  662. cout << endl << "PLAYER 1 \t \t";
  663. cout << "PLAYER 2" << endl;
  664. cout << player1.deck[0].rank << player1.deck[0].color << "\t \t \t \t";
  665. cout << player2.deck[0].rank << player2.deck[0].color << endl;
  666. sleep(SLEEP_TIME);
  667. if (player1.deck[0].value > player2.deck[0].value)
  668. {
  669. winning(player1, player2);
  670. cout << "Player 1 won a battle." << endl;
  671. }
  672. else if (player1.deck[0].value < player2.deck[0].value)
  673. {
  674. winning(player2, player1);
  675. cout << "Player 2 won a battle." << endl;
  676. }
  677. else//WAR
  678. {
  679. cout << endl << " WAR" << endl << endl;
  680. if (isVariantA)
  681. {
  682. if (player1.numberOfCards < 3 || player2.numberOfCards < 3)
  683. {
  684. if (player1.numberOfCards > player2.numberOfCards)
  685. {
  686. player1.numberOfCards = player1.numberOfCards + player2.numberOfCards;
  687. player2.numberOfCards = 0;
  688. }
  689. else
  690. {
  691. player2.numberOfCards = player2.numberOfCards + player1.numberOfCards;
  692. player1.numberOfCards = 0;
  693. }
  694. }
  695. else
  696. {
  697. numberOfMovements++;
  698. int counter = 1;
  699. player1.numberOfCards = player1.numberOfCards - 3;//player can lose 3 cards
  700. player2.numberOfCards = player2.numberOfCards - 3;
  701. war(sizeOfDeck, player1, player2, player1.deck + 2, player2.deck + 2, counter, isVariantA, numberOfMovements, counterHelp,randomDeck,isSmartWar);
  702. }
  703. }
  704. else//VariantB
  705. {
  706. int counter = 1;
  707. if (player1.numberOfCards == 1 || player1.numberOfCards == 2)
  708. {
  709. if (player1.numberOfCards == 1)
  710. numberOfMovements++;
  711. counterHelp++;
  712. variantB(player2, player1, counter);
  713. }
  714. else if (player2.numberOfCards == 1 || player2.numberOfCards == 2)
  715. {
  716. if (player2.numberOfCards == 1)
  717. numberOfMovements++;
  718. counterHelp++;
  719. variantB(player1, player2, counter);
  720. }
  721. player1.numberOfCards = player1.numberOfCards - 3;
  722. player2.numberOfCards = player2.numberOfCards - 3;
  723. war(sizeOfDeck, player1, player2, player1.deck + 2, player2.deck + 2, counter, isVariantA, numberOfMovements, counterHelp, randomDeck, isSmartWar);
  724.  
  725. }
  726.  
  727. }
  728. }
  729.  
  730. if (player1.numberOfCards > player2.numberOfCards)
  731. player1.numberOfCards = player1.numberOfCards + player2.numberOfCards;
  732. else if (player1.numberOfCards < player2.numberOfCards)
  733. player2.numberOfCards = player2.numberOfCards + player1.numberOfCards;
  734. ending(player1, player2, numberOfMovements, sumOfMovements);
  735. }
  736.  
  737. void ending(player& player1, player& player2, int numberOfMovements, int& sumOfMovements)
  738. {
  739. cout << "THE END" << endl;
  740. if (player1.numberOfCards == 0 && player2.numberOfCards != 0)
  741. {
  742. cout << "PLAYER 1 HAS LOST ALL CARDS" << endl;
  743. cout << "PLAYER 2 IS A WINNER";
  744. player2.numberOfWins++;
  745. }
  746. else if (player2.numberOfCards == 0 && player1.numberOfCards != 0)
  747. {
  748. cout << "PLAYER 2 HAS LOST ALL CARDS" << endl;
  749. cout << "PLAYER 1 IS A WINNER";
  750. player1.numberOfWins++;
  751. }
  752. else
  753. cout << "DRAW";
  754. cout << endl << numberOfMovements << " MOVEMENTS WERE MADE ";
  755. sumOfMovements = sumOfMovements + numberOfMovements;
  756. }
  757.  
  758. void choosePlayerStrategy(player &player)
  759. {
  760. int option = 1;
  761. cin >> option;
  762. switch (option) {
  763. case 1:
  764. player.strategy = randomStrategy;
  765. break;
  766. case 2:
  767. player.strategy = furiousStrategy;
  768. break;
  769. case 3:
  770. player.strategy = peacefulStrategy;
  771. break;
  772. default:
  773. break;
  774. }
  775.  
  776.  
  777. }
  778.  
  779.  
  780. void winning(player& winningPlayer, player& losingPlayer)//adding cards to winners hand
  781. {
  782. card pomWinner = winningPlayer.deck[0];
  783. card pomLoser = losingPlayer.deck[0];
  784. moving(winningPlayer);
  785. winningPlayer.numberOfCards++;
  786. moving(losingPlayer);
  787. losingPlayer.numberOfCards--;
  788. winningPlayer.deck[winningPlayer.numberOfCards - 2] = pomWinner;
  789. winningPlayer.deck[winningPlayer.numberOfCards - 1] = pomLoser;
  790.  
  791. }
  792.  
  793. void moving(player& currentPlayer)
  794. {
  795. for (int i = 0; i < currentPlayer.numberOfCards - 1; i++)
  796. {
  797. currentPlayer.deck[i] = currentPlayer.deck[i + 1];
  798. }
  799. clear(currentPlayer, 1);
  800.  
  801. }
  802.  
  803. void movingWar(player& winningPlayer, player& losingPlayer, int counter)
  804. {
  805. for (int i = 0; i < ((counter * 2) + 1); i++)
  806. {
  807. card pomWinner = winningPlayer.deck[0];
  808. moving(winningPlayer);
  809. winningPlayer.numberOfCards++;
  810. winningPlayer.deck[winningPlayer.numberOfCards - 2 - i] = pomWinner;
  811. }
  812. for (int i = 0; i < ((counter * 2) + 1); i++)
  813. {
  814. card pomLoser = losingPlayer.deck[0];
  815. moving(losingPlayer);
  816. losingPlayer.numberOfCards--;
  817. winningPlayer.deck[winningPlayer.numberOfCards - (counter * 2 + 1 - i)] = pomLoser;
  818.  
  819. }
  820. }
  821.  
  822. void war(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int& counter, int isVariantA, int& numberOfMovements, int& counterHelp,card randomDeck[],int isSmartWar)
  823. {
  824.  
  825. if (!isVariantA)
  826. numberOfMovements++;
  827. if (deck1[0].value == deck2[0].value)
  828. {
  829. counter++;
  830. if (isVariantA)
  831. {
  832. variantA(sizeOfDeck, player1, player2, deck1, deck2, counter, isVariantA, numberOfMovements, randomDeck, isSmartWar);
  833. }
  834. else//VariantB
  835. {
  836.  
  837. if (player2.numberOfCards == 0 && counterHelp == 1)
  838. {
  839. displayWar(player1, player2, deck1, deck2);
  840. cout << "Player 1 won a war." << endl;
  841. }
  842. else if (player1.numberOfCards == 0 && counterHelp == 1)
  843. {
  844.  
  845. displayWar(player1, player2, deck1, deck2);
  846. cout << "Player 2 won a war." << endl;
  847. }
  848. else if (player1.numberOfCards == 0 || player1.numberOfCards == 1 || player2.numberOfCards == 0 || player2.numberOfCards == 1)
  849. {
  850.  
  851. if ((player1.numberOfCards == 0 && player2.numberOfCards>4) || (player1.numberOfCards == 1 && player2.numberOfCards>2))
  852. {
  853. numberOfMovements++;
  854. if (player1.numberOfCards == 0)
  855. numberOfMovements++;
  856. player1.numberOfCards++;
  857. variantB(player2, player1, counter);
  858. player1.numberOfCards--;
  859. displayWar(player1, player2, deck1, deck2);
  860. cout << endl << " WAR" << endl << endl;
  861. player1.numberOfCards = player1.numberOfCards - 2;
  862. player2.numberOfCards = player2.numberOfCards - 2;
  863. war(sizeOfDeck, player1, player2, deck1 + 2, deck2 + 2, counter, isVariantA, numberOfMovements, counterHelp, randomDeck, isSmartWar);
  864. }
  865. else if ((player2.numberOfCards == 0 && player1.numberOfCards>4) || (player2.numberOfCards == 1 && player1.numberOfCards>2))
  866. {
  867. numberOfMovements++;
  868. if (player2.numberOfCards == 0)
  869. numberOfMovements++;
  870. player2.numberOfCards++;
  871. variantB(player1, player2, counter);
  872. player2.numberOfCards--;
  873. displayWar(player1, player2, deck1, deck2);
  874. cout << endl << " WAR" << endl << endl;
  875. player1.numberOfCards = player1.numberOfCards - 2;
  876. player2.numberOfCards = player2.numberOfCards - 2;
  877. war(sizeOfDeck, player1, player2, deck1 + 2, deck2 + 2, counter, isVariantA, numberOfMovements, counterHelp, randomDeck, isSmartWar);
  878. }
  879.  
  880.  
  881. }
  882.  
  883. else
  884. {
  885. displayWar(player1, player2, deck1, deck2);
  886. cout << endl << " WAR" << endl << endl;
  887. player1.numberOfCards = player1.numberOfCards - 2;
  888. player2.numberOfCards = player2.numberOfCards - 2;
  889. war(sizeOfDeck, player1, player2, deck1 + 2, deck2 + 2, counter, isVariantA, numberOfMovements, counterHelp, randomDeck, isSmartWar);
  890. }
  891. }
  892. }
  893. else if (player1.numberOfCards < 0)
  894. {
  895. player1.numberOfCards = 0;
  896. player2.numberOfCards = sizeOfDeck;
  897. }
  898. else if (player2.numberOfCards < 0)
  899. {
  900. player2.numberOfCards = 0;
  901. player1.numberOfCards = sizeOfDeck;
  902. }
  903. else
  904. {
  905. endingWar(player1, player2, deck1, deck2, counter, isVariantA,randomDeck,isSmartWar);
  906. }
  907.  
  908. }
  909.  
  910. void displayWar(player& player1, player& player2, card deck1[], card deck2[])
  911. {
  912. cout << endl << "PLAYER 1\t \t";
  913. cout << "PLAYER 2" << endl;
  914. cout << deck1[0].rank << deck1[0].color << "\t \t \t \t";
  915. cout << deck2[0].rank << deck2[0].color << endl;
  916. sleep(SLEEP_TIME);
  917. }
  918.  
  919. void variantA(int sizeOfDeck, player& player1, player& player2, card deck1[], card deck2[], int counter, int isVariantA, int& numberOfMovements,card randomDeck[],int isSmartWar)
  920. {
  921. numberOfMovements++;
  922. if (player1.numberOfCards <= 1 || player2.numberOfCards <= 1)
  923. {
  924. endingWar(player1, player2, deck1, deck2, counter, isVariantA, randomDeck, isSmartWar);
  925. }
  926. else
  927. {
  928. displayWar(player1, player2, deck1, deck2);
  929. cout << endl << " WAR" << endl << endl;
  930. player1.numberOfCards = player1.numberOfCards - 2;
  931. player2.numberOfCards = player2.numberOfCards - 2;
  932. war(sizeOfDeck, player1, player2, deck1 + 2, deck2 + 2, counter, isVariantA, numberOfMovements, counter,randomDeck,isSmartWar);
  933. }
  934. }
  935.  
  936. void clear(player& currentPlayer, int number)
  937. {
  938. currentPlayer.deck[currentPlayer.numberOfCards - number].value = 0;
  939. currentPlayer.deck[currentPlayer.numberOfCards - number].valueColor = 0;
  940. currentPlayer.deck[currentPlayer.numberOfCards - number].rank = 0;
  941. strcpy(currentPlayer.deck[currentPlayer.numberOfCards - number].color, "");
  942. }
  943.  
  944. void variantB(player& winningPlayer, player& losingPlayer, int& counter)
  945. { if (losingPlayer.numberOfCards == 1){
  946. if (counter == 1){
  947. losingPlayer.deck[1] = winningPlayer.deck[1];
  948. losingPlayer.deck[2] = winningPlayer.deck[2];
  949. for (int i = 1; i < (winningPlayer.numberOfCards - 2); i++)
  950. winningPlayer.deck[i] = winningPlayer.deck[i + 2];
  951. clear(winningPlayer, 1);
  952. clear(winningPlayer, 2);
  953. losingPlayer.numberOfCards = losingPlayer.numberOfCards + 2;
  954. winningPlayer.numberOfCards = winningPlayer.numberOfCards - 2;
  955. }
  956. else{
  957. losingPlayer.deck[counter * 2 - 1] = winningPlayer.deck[counter * 2 - 1];
  958. losingPlayer.deck[counter * 2] = winningPlayer.deck[counter * 2];
  959. for (int i = counter * 2; i < (winningPlayer.numberOfCards + 2); i++)
  960. winningPlayer.deck[i - 1] = winningPlayer.deck[i + 1];
  961. clear(winningPlayer, -1);
  962. clear(winningPlayer, -2);
  963. losingPlayer.numberOfCards = losingPlayer.numberOfCards + 2;
  964. winningPlayer.numberOfCards = winningPlayer.numberOfCards - 2;
  965. }
  966. }
  967. else if (losingPlayer.numberOfCards == 2){
  968. if (counter == 1){
  969. losingPlayer.deck[2] = winningPlayer.deck[2];
  970. for (int i = 1; i < (winningPlayer.numberOfCards - 2); i++)
  971. winningPlayer.deck[i + 1] = winningPlayer.deck[i + 2];
  972. clear(winningPlayer, 1);
  973. losingPlayer.numberOfCards = losingPlayer.numberOfCards + 1;
  974. winningPlayer.numberOfCards = winningPlayer.numberOfCards - 1;
  975. }
  976. else{
  977. losingPlayer.deck[counter * 2] = winningPlayer.deck[counter * 2];
  978. for (int i = counter * 2; i < (winningPlayer.numberOfCards + 2); i++)
  979. winningPlayer.deck[i] = winningPlayer.deck[i + 1];
  980. clear(winningPlayer, -2);
  981. losingPlayer.numberOfCards = losingPlayer.numberOfCards + 1;
  982. winningPlayer.numberOfCards = winningPlayer.numberOfCards - 1;
  983. }
  984. }
  985.  
  986. }
  987. void endingWar(player& player1, player& player2, card deck1[], card deck2[], int counter, int isVariantA, card randomDeck[], int isSmartWar)
  988. {
  989. if (deck1[0].value > deck2[0].value){
  990. player1.numberOfCards = player1.numberOfCards + (2 * counter + 1);
  991. player2.numberOfCards = player2.numberOfCards + (2 * counter + 1);
  992. displayWar(player1, player2, deck1, deck2);
  993. if (isSmartWar) {
  994. randomAdding(player1, player2, counter, randomDeck);
  995. }
  996. else
  997. movingWar(player1, player2, counter);
  998. cout << "Player 1 won a war." << endl;
  999. }
  1000. else if (deck1[0].value < deck2[0].value){
  1001. player1.numberOfCards = player1.numberOfCards + (2 * counter + 1);
  1002. player2.numberOfCards = player2.numberOfCards + (2 * counter + 1);
  1003. displayWar(player1, player2, deck1, deck2);
  1004. if (isSmartWar) {
  1005. randomAdding(player2, player1, counter, randomDeck);
  1006. }
  1007. else
  1008. movingWar(player2, player1, counter);
  1009. cout << "Player 2 won a war." << endl;
  1010. }
  1011. else if (deck1[0].value == deck2[0].value && isVariantA){
  1012. displayWar(player1, player2, deck1, deck2);
  1013. if (player1.numberOfCards > player2.numberOfCards){
  1014. cout << "Player 1 won a war." << endl;
  1015. player2.numberOfCards = 0;
  1016. }
  1017. else if (player1.numberOfCards < player2.numberOfCards){
  1018. cout << "Player 2 won a war." << endl;
  1019. player1.numberOfCards = 0;
  1020. }
  1021. else if ((player1.numberOfCards == 0 && player2.numberOfCards == 0) || (player1.numberOfCards == 1 && player2.numberOfCards == 1)){
  1022. player1.numberOfCards = 0;
  1023. player2.numberOfCards = 0;
  1024. cout << "DRAW";
  1025. }
  1026.  
  1027. }
  1028. }
  1029.  
  1030.  
  1031. void zeroing(card array[])
  1032. {
  1033. for (int i = 0; i < MAX_SIZE_OF_DECK; i++) {
  1034. strcpy(array[i].color, "");
  1035. array[i].rank = 0;
  1036. array[i].value = 0;
  1037. array[i].valueColor = 0;
  1038. }
  1039. }
  1040.  
  1041.  
  1042. int valueOfStartingDeck(card* deck, int sizeOfDeck)
  1043. {
  1044. int value = 0;
  1045. for (int i = 0; i < sizeOfDeck / 2; i++)
  1046. {
  1047. int cardValue = deck[i].value;
  1048. if (cardValue != 0)
  1049. {
  1050. if ((sizeOfDeck / NUMBER_OF_COLORS) % 2 == 1)
  1051. value += cardValue + (sizeOfDeck - MAX_SIZE_OF_DECK) / (2 * NUMBER_OF_COLORS) - 7;
  1052. else {
  1053.  
  1054. if (cardValue < ((MAX_SIZE_OF_DECK - 4 - sizeOfDeck) / (2 * NUMBER_OF_COLORS) + 8))
  1055. value += cardValue + (sizeOfDeck - (MAX_SIZE_OF_DECK - 4)) / (2 * NUMBER_OF_COLORS) - 8;
  1056. else
  1057. value += cardValue + (sizeOfDeck - (MAX_SIZE_OF_DECK - 4)) / (2 * NUMBER_OF_COLORS) - 7;
  1058. }
  1059. }
  1060. }
  1061. return value;
  1062. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement