You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:15:54