如何在Token游戏中按回合顺序打印玩家所选Token?C代码求助
问题:游戏最优行动轨迹记录与胜负判定
游戏规则
- 两名玩家A和B在摆放着1到20个带数字Token的桌面进行游戏,A先手,双方轮流行动。
- 每回合玩家可选取1-2个Token,但不能连续选取两个Token(即上一回合选了2个的话,本回合只能选1个)。
- 当玩家取走最后一个Token时游戏结束,Token数值总和更高的玩家获胜。
- 任务要求:找出双方最优行动并按回合顺序输出所选Token,最后判定胜者。
输入输出示例
输入
-11 5 3 6 -1
输出
Player A chose -1 with index [4] Player B chose 6 and 3 with index [3], [2] Player A chose 5 with index [1] Player B chose -11 with index [0] A: 4, B: -2
当前问题
我已实现计算胜负结果的逻辑,但无法按回合顺序打印出玩家每一步所选的Token。以下是我的C语言代码:
#include <stdio.h> #include <stdbool.h> int processInput(int elements[], int maxElements) { int count = 0; do { int input = scanf("%d", &elements[count++]); if (input == 0 || count == maxElements) { break; } } while (getchar() != '\n'); return count; } int findSmallest4(int a, int b, int c, int d) { int smallestArr[] = {a, b, c, d}; int smallest = smallestArr[0]; for(int i = 1; i < 4; i++) { smallest = smallestArr[i] < smallest ? smallestArr[i] : smallest; } return smallest; } int findSmallest3(int a, int b, int c) { int smallestArr[] = {a, b, c}; int smallest = smallestArr[0]; for(int i = 1; i < 3; i++) { smallest = smallestArr[i] < smallest ? smallestArr[i] : smallest; } return smallest; } int findSmallest2(int a, int b) { return (a < b) ? a : b; } int findLargest4(int a, int b, int c, int d) { int largestArr[] = {a, b, c, d}; int largest = largestArr[0]; for(int i = 1; i < 4; i++) { largest = largestArr[i] > largest ? largestArr[i] : largest; } return largest; } int findLargest3(int a, int b, int c) { int largestArr[] = {a, b, c}; int largest = largestArr[0]; for(int i = 1; i < 3; i++) { largest = largestArr[i] > largest ? largestArr[i] : largest; } return largest; } int findLargest2(int a, int b) { return (a > b) ? a : b; } // Recursive function to maximize the number of coins collected by player 1, // assuming that the player 2 also plays optimally int findMaxCoins(int coin[], int i, int j, bool playerAPrevMove, bool playerBPrevMove) { // Base cases if (i > j) { return 0; } else if (i == j) { return coin[i]; } else if (i + 1 == j) { if (playerAPrevMove == true) { return findLargest3(coin[i], coin[j], coin[i] + coin[j]); } else { return findLargest2(coin[i], coin[j]); } } else if (i + 2 == j) { if (playerAPrevMove == true) { return findLargest2(coin[i] + coin[i+1], coin[j] + coin[i+1]); } else { if (playerBPrevMove == true) { int firstChoice = findLargest2(coin[i], coin[j]); int secondChoice = 0; if (findSmallest2(coin[i], coin[j]) < 0 || coin[i+1] < 0) { secondChoice = findSmallest3(coin[i], coin[j], coin[i+1]); } return firstChoice + secondChoice; } else { return (coin[i] > coin[j]) ? coin[i] + findSmallest2(coin[i+1], coin[j]) : coin[j] + findSmallest2(coin[i], coin[j-1]); } } } int start2 = 0; int end2 = 0; if (playerAPrevMove == true) { // in case player's 1 previous move wasn't including two coins int bOpt1 = findMaxCoins(coin, i + 3, j, false, true); //from left int bOpt2 = findMaxCoins(coin, i + 2, j - 1, false, true); //from left int bOpt3 = findMaxCoins(coin, i + 1, j - 2, false, true); // from right int bOpt4 = findMaxCoins(coin, i, j - 3, false, true); // from right int bOpt5, bOpt6, bOpt7; // Player 2 selects option where player 1 has the least coins if (playerBPrevMove == true) { // in case player's 2 previous move wasn't including two coins bOpt5 = findMaxCoins(coin, i + 4, j, false, false); // from left bOpt6 = findMaxCoins(coin, i + 2, j - 2, false, false); // from left and right bOpt7 = findMaxCoins(coin, i, j - 4, false, false); // from right } if (playerBPrevMove == true) { // in case player's 2 previous move wasn't including two coins start2 = coin[i] + coin[i+1] + findSmallest4(bOpt1, bOpt5, bOpt2, bOpt6); end2 = coin[j] + coin[j-1] + findSmallest4(bOpt3, bOpt6, bOpt4, bOpt7); } else { start2 = coin[i] + coin[i+1] + findSmallest2(bOpt1, bOpt2); end2 = coin[j] + coin[j-1] + findSmallest2(bOpt3, bOpt4); } } int bOpt8 = findMaxCoins(coin, i + 2, j, true, true); //from left int bOpt9 = findMaxCoins(coin, i + 1, j - 1, true, true); //from left and right int bOpt10 = findMaxCoins(coin, i, j - 2, true, true); //from right int bOpt11, bOpt12, bOpt13, bOpt14; if (playerBPrevMove == true) { bOpt11 = findMaxCoins(coin, i + 3, j, true, false); //from left bOpt12 = findMaxCoins(coin, i + 1, j - 2, true, false); //from left bOpt13 = findMaxCoins(coin, i + 2, j - 1, true, false); //from right bOpt14 = findMaxCoins(coin, i, j - 3, true, false); //from right } int start1; int end1; if (playerBPrevMove == true) { start1 = coin[i] + findSmallest4(bOpt8, bOpt11, bOpt9, bOpt12); end1 = coin[j] + findSmallest4(bOpt9, bOpt13, bOpt10, bOpt14); } else { start1 = coin[i] + findSmallest2(bOpt8, bOpt9); end1 = coin[j] + findSmallest2(bOpt9, bOpt10); } // Player 1 chooses the option where he has the most coins int largestResult; if (playerAPrevMove == true) { largestResult = findLargest4(start1, start2, end1, end2); } else { largestResult = findLargest2(start1, end1); } return largestResult; } int main() { int coin[100]; int maxElements = sizeof(coin) / sizeof(coin[0]); int n = processInput(coin, maxElements); bool playerAPrevMove = true, playerBPrevMove = true; // check if players previous move wasn't including 2 coins int maxCoins = findMaxCoins(coin, 0, n - 1, playerAPrevMove, playerBPrevMove); printf("Coins collected by player 1 is %d\n", maxCoins); return 0; }
恳请各位帮忙解决该问题,谢谢!
内容的提问来源于stack exchange,提问作者Teodor Otkovic
相关产品推荐
相关产品推荐

