没有人工智能的Tic-Tac-Toe

没有人工智能的Tic-Tac-Toe,c,tic-tac-toe,C,Tic Tac Toe,我正在为UNI做作业,我必须做一个Tic-Tac-Toe,玩家没有做出任何决定,所有动作都是随机选择的。因此,如果矩阵上的字符是“”,则表示它是自由的,而如果是“X”或“O”,则应生成另一个移动。这是代码(C语言): 我没有复制整个代码,因为它根本没有完成,我只是需要帮助解决这个问题。但是如果我试着运行这个,符号可能会被覆盖,就像我在矩阵[1][2]上有一个“X”,在一些回合后它可能是一个“O”。那么,我如何才能使移动不被覆盖?(抱歉英语不好)。只需输入正确的条件: while (matrix[

我正在为UNI做作业,我必须做一个Tic-Tac-Toe,玩家没有做出任何决定,所有动作都是随机选择的。因此,如果矩阵上的字符是“”,则表示它是自由的,而如果是“X”或“O”,则应生成另一个移动。这是代码(C语言):


我没有复制整个代码,因为它根本没有完成,我只是需要帮助解决这个问题。但是如果我试着运行这个,符号可能会被覆盖,就像我在
矩阵[1][2]
上有一个“X”,在一些回合后它可能是一个“O”。那么,我如何才能使移动不被覆盖?(抱歉英语不好)。

只需输入正确的条件:

while (matrix[randAlt1][randAlt2] == 'X' || matrix[randAlt1][randAlt2] == 'O')
(即,如果此单元格不为空,请重试)

此外,在不丢失任何东西的情况下简化代码也很容易:

randAlt1 = rand1;
randAlt2 = rand2;
while (matrix[randAlt1][randAlt2] != ' ') {
    randAlt1 = MINRND + rand()%(MAXRND - MINRND +1);
    randAlt2 = MINRND + rand()%(MAXRND - MINRND +1);
}
matrix[randAlt1][randAlt2] = (playerTurn == 1) ? 'X' : 'O';
最好添加循环保护,以防止无限循环(或针对这种情况添加特殊检查):

randAlt1=rand1;
randAlt2=rand2;
int=0;
而(矩阵[randAlt1][randAlt2]!=''&&nbtruments<100){
randAlt1=MINRND+rand()%(MAXRND-MINRND+1);
randAlt2=MINRND+rand()%(MAXRND-MINRND+1);
nbc++;
}
if(矩阵[randAlt1][randAlt2]!=“”){
//显示错误消息并停止游戏
}
矩阵[randAlt1][randAlt2]=(播放塔==1)?'X':'O';

您可以选择任意位置,然后测试它是否空闲–可能多次。但你也可以选择一些自由的位置,然后找到它

首先设置一个转弯计数器

int   turnNo = 0;
然后做一个交替移动的循环,选择一个
9-turnNo
未使用的位置,找到它,用一个玩家标记标记,并测试移动是否有三行:

while(turnNo < 9)
{
    char  currPlayerMark = ...choose 'X' or 'O';

    int   freePos = 9 - turnNo;
    int   currPos = rand() % freePos;  // 0 .. freePos-1

    for(x=0; x<3; x++)
    {
        for(y=0; y<3; y++)
        {
            if(matrix[x][y] == ' ')  // a free position
                if(--currPos < 0)    // the sought one
                    break;           // break the inner loop
        }
        if(currPos < 0)
            break;                   // break the outer loop
    }

    matrix[x][y] = currPlayerMark;

    if(test_for_win_position(x,y))
    {
         message_a_win_of_player(currPlayerMark);
         break;  // turnNo < 9 here
    }

    turnNo ++;
}
测试获胜位置的函数可能如下所示:

int test_for_win_position(int x, int y)
{
    char mark = matrix[x][y];

    // check a column
    if(matrix[x][0] == mark && matrix[x][1] == mark && matrix[x][2] == mark)
        return 1;

    // check a row
    if(matrix[0][y] == mark && matrix[1][y] == mark && matrix[2][y] == mark)
        return 1;

    // check one diagonal
    if(x==y)
        if(matrix[0][0] == mark && matrix[1][1] == mark && matrix[2][2] == mark)
            return 1;

    // check another diagonal
    if(x+y==2)
        if(matrix[0][2] == mark && matrix[1][1] == mark && matrix[2][0] == mark)
            return 1;

    // current player has not won (yet)
    return 0;
}

while
应测试
!=''
矩阵[randAlt1][randAlt2]!='X'&矩阵[randAlt1][randAlt2]!='O'
此条件是错误的。如果我设置此条件,它将在某个点停止生成符号。我将尝试您编写的上一个条件,TY。但我不能用接线员吗因为我的老师说这很糟糕,“它会停止生成符号”?你在说什么?好的,没有必要使用三元运算符(但你可以看到,我的程序是两倍的短和简单)。我的意思是,如果我用逻辑或(| |)放置条件,它将在某个点停止“生成”移动,就像某些框将保留“字符”。但是这个!=''情况很好,泰!
while(turnNo < 9)
{
    char  currPlayerMark = ...choose 'X' or 'O';

    int   freePos = 9 - turnNo;
    int   currPos = rand() % freePos;  // 0 .. freePos-1

    for(x=0; x<3; x++)
    {
        for(y=0; y<3; y++)
        {
            if(matrix[x][y] == ' ')  // a free position
                if(--currPos < 0)    // the sought one
                    break;           // break the inner loop
        }
        if(currPos < 0)
            break;                   // break the outer loop
    }

    matrix[x][y] = currPlayerMark;

    if(test_for_win_position(x,y))
    {
         message_a_win_of_player(currPlayerMark);
         break;  // turnNo < 9 here
    }

    turnNo ++;
}
if(turnNo == 9)
    message_its_a_draw(); // no-one wins
int test_for_win_position(int x, int y)
{
    char mark = matrix[x][y];

    // check a column
    if(matrix[x][0] == mark && matrix[x][1] == mark && matrix[x][2] == mark)
        return 1;

    // check a row
    if(matrix[0][y] == mark && matrix[1][y] == mark && matrix[2][y] == mark)
        return 1;

    // check one diagonal
    if(x==y)
        if(matrix[0][0] == mark && matrix[1][1] == mark && matrix[2][2] == mark)
            return 1;

    // check another diagonal
    if(x+y==2)
        if(matrix[0][2] == mark && matrix[1][1] == mark && matrix[2][0] == mark)
            return 1;

    // current player has not won (yet)
    return 0;
}