NIM游戏对PC初学者

NIM game against PC beginner

本文关键字:初学者 PC 游戏 NIM      更新时间:2023-10-16

我的教授给我布置了一个作业,让我写一个16局的尼姆游戏。

任务的一部分是使PC也采取行动。所以,我试图通过使用SRAND来解决问题,但PC选择了相同的行和相同数量的棒。更重要的是,PC也采取空行,并撞墙时,他采取零质量。

所以,这就是我已经做过的。任何想法吗?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define row 4
int main()
{
    int theChecker = 1, sticks[row] = {1,3,5,7}, stickSum, i, choiceRow, choiceStick, pcRow, pcStick;
    char answer;
    do
    {
        printf("nnt  ************ n");
        printf("t *THE NIM GAME* n");
        printf("t  ************ nn");
        stickSum = sticks[0] + sticks[1] + sticks[2] + sticks[3];
        while(stickSum > 0)
        {
            printf("nStick log:n");
            for(i = 0; i < row; i++)
                printf("Row %d: %dn", i+1, sticks[i]);
            printf("n");
            if(theChecker == 1)
            {
                printf("Choose a row: ");
                scanf("%d", &choiceRow);
                printf("Choose a sick: ");
                scanf("%d", &choiceStick);
                while((choiceRow <= 0) || (choiceRow > 4) || (sticks[choiceRow - 1] < choiceStick) || (choiceStick == 0))
                {
                    printf("nt    !!!ERROR!!!ntInvalid row or sticknnCheck stick log abovenn");
                    printf("Choose a row: ");
                    scanf("%d", &choiceRow);
                    printf("Choose a sick: ");
                    scanf("%d", &choiceStick);
                }
                sticks[choiceRow-1] -= choiceStick;
                stickSum -= choiceStick;
            }
            else    //pc move starts-------------------------------------------
            {
                while(((pcRow <= 0) || (pcRow > 4)) && sticks[choiceRow - 1] == 0)
                {
                    time_t seconds;
                    seconds = 0;
                    time(&seconds);
                    srand((unsigned int)seconds);
                    pcRow = rand() % 4;
                }
                printf("PC ROW: %dn", pcRow);
                while((sticks[pcRow - 1] < pcStick) || (pcStick == 0))
                {
                    time_t seconds2;
                    seconds2 = 0;
                    time(&seconds2);
                    srand((unsigned int)seconds2);
                    pcStick = rand() % 16;
                }
                printf("PC STICK: %dnn", pcStick);

                sticks[pcRow-1] -= pcStick;
                stickSum -= pcStick;
            }
            if((theChecker == 1) && (stickSum == 0))
                printf("nn!!!GAME OVER!!! You took the last stick!!!nn");
            else if((theChecker == 2) && (stickSum == 0))
                printf("nn!!!CONGRATS!!! You won!!!nn");
            theChecker++;
            if(theChecker == 3)
                theChecker -= 2;
        }
        printf("nPress r to restart the game or any key to end the game: ");
        scanf("%c", &answer);
        printf("n");
    }
    while(answer == 'r');
    return 0;`enter code here`
}

不要调用srand()超过一次,它用于初始化随机种子,你总是初始化为相同的值,内部状态被重置一遍又一遍,总是产生相同的伪随机值。

我说你总是传递相同的种子,因为time()具有秒分辨率,并且在一秒内,整个游戏完成并终止。

您只需要在程序开始时调用srand(),以防止程序在不同的程序运行中选择相同的值,而不是在相同的运行