c - 这是一个有效的 Tic Tac Toe 获胜条件检查器功能吗?

标签 c arrays function if-statement multidimensional-array

我正在尝试为 Tic Tac Toe 游戏制作一个条件检查器,以在玩家获胜时宣布。我创建了如下所示的函数。但是,当我调用它并尝试应用获胜条件时,什么也没有发生。我知道这是一个乏味的功能,但我对如何使其有效和高效感到困惑。

功能:

int checker_o(char aray[3][3]){

        if(aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }

        if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 1;
        }
}

完整代码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>


void map(char a[3][3]){

    int row, column;

    for(row=0;row<3;row++){

        for(column=0;column<3;column++){

            printf ("%c       ", a[row][column]);

        }
        printf("\n \n \n \n \n");
}
}
float getRand() {

    return ((rand() / (RAND_MAX+1.0))*8)+1;
}

int control(int ui, int kb){

    if (kb=='b'){
        ui--;
    }
    if(kb=='c' && 0<ui &&ui<4){
            ui+=5;
    }
    else{

        if(kb=='c' && 3<ui &&ui<7){
                    ui--;
        }
        else{

            if(kb=='c' && 6<ui &&ui<10){
                            ui-=7;
            }
        }
    }
return ui;

}

int checker_o(char aray[3][3]){

        if(aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;


        }

        if(aray[1][0]=='O'&& aray[1][1]=='O' && aray[1][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }

        if(aray[2][0]=='O'&& aray[2][1]=='O'&& aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;

        }
        if(aray[0][0]=='O'&& aray[1][0]=='O' && aray[2][0]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }
        if(aray[0][1]=='O'&& aray[1][1]=='O' && aray[2][1]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }
        if(aray[0][2]=='O'&& aray[1][2]=='O' && aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }
        if(aray[0][0]=='O'&& aray[1][1]=='O' && aray[2][2]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }
        if(aray[0][2]=='O'&& aray[1][1]=='O' && aray[2][0]=='O'){
            system("cls");
            printf("Player 'O' Wins!");
            getchar();
            return 0;
        }
}
int checker_x(char aray[3][3]){

        if(aray[0][0]=='X'&& aray[0][1]=='X'&& aray[0][2]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }

        if(aray[1][0]=='X'&& aray[1][1]=='X' && aray[1][2]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }

        if(aray[2][0]=='X'&& aray[2][1]=='X'&& aray[2][2]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;


        }
        if(aray[0][0]=='X'&& aray[1][0]=='X' && aray[2][0]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }
        if(aray[0][1]=='X'&& aray[1][1]=='X' && aray[2][1]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }
        if(aray[0][2]=='X'&& aray[1][2]=='X' && aray[2][2]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }
        if(aray[0][0]=='X'&& aray[1][1]=='X' && aray[2][2]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;

        }
        if(aray[0][2]=='X'&& aray[1][1]=='X' && aray[2][0]=='X'){
            system("cls");
            printf("Player 'X' Wins!");
            getchar();
            return 0;
        }
}
int main(){

    int r,c,ui,cntr,cntr2,ran,g,x;
    char kb, aray[3][3]={{'.','.','.'},{'.','.','.'},{'.','.','.'}};

    srand( time(NULL) );
    getRand();


    map(aray);  
    printf("Which keyboard method would u prefer? \n \n \n");
    printf("(a)\t \t (b)\t \t (c)\n \n easy \t \t mobile \t #Pad \n \n 0 1 2 \t \t 1 2 3 \t \t 7 8 9\n \n");
    printf(" 3 4 5 \t \t 4 5 6 \t \t 4 5 6 \n \n 6 7 8 \t \t 7 8 9 \t \t 1 2 3 \n \n \n");


    scanf("%c", &kb);
    system("cls");
    map(aray);
    do{


        printf("Your Move! \n \n");
        scanf("%i", &ui);
        ui=control(ui,kb);
        r=ui/3;
        c=ui%3;
        if(aray[r][c]=='X'|| aray[r][c]=='O'){
            printf("'X/O' Already exists there \n");
            getchar();
            getchar();
            return 0;
        }
        else{
            aray[r][c]='X';
            system("cls");
            map(aray);
            checker_x(aray);
        }



            ran=getRand();
            g=ran/3;
            x=ran%3;
            if(aray[g][x]=='.'){
                aray[g][x]='O';
                system("cls");
                map(aray);
            }else{
                do{
                    ran=getRand();
                    g=ran/3;
                    x=ran%3;
                    }while (aray[g][x]!='.');
                aray[g][x]='O';
                system("cls");
                map(aray);
        checker_o(aray);
            }

    } while (checker_x(aray)!=1 || checker_o(aray)!=1);

    getchar();
}

最佳答案

毕竟 if 语句你需要放置语句

return 0;

否则函数有未定义的行为。

另外你在这个语句中有一个错字

if (aray[0][0]=='O'&& aray[0][1]=='O'|| aray[0][2]=='O'){
                                     ^^^

必须有

if (aray[0][0]=='O'&& aray[0][1]=='O'&& aray[0][2]=='O'){
                                     ^^^

考虑到这段代码

        system("cls");
        printf("Player 'O' Wins!");
        getchar();
        return 1;

是重复的。

您可以重写函数,使该代码片段在函数中只出现一次。

例如

const size_t N = 3;
int winner = 0;

for ( size_t i = 0; !winner && i < N; i++ )
{
    size_t j = 0;
    while ( aray[i][j] == 'O' && j < N ) j++;

    winner = j == N;
}
//...

if ( winner )
{
        system("cls");
        printf("Player 'O' Wins!");
        getchar();
}

return winner;

您可以为要检查的字符再引入一个参数。最好不要在程序中使用魔数(Magic Number)和其他文字。给它们起有意义的名字。

考虑到最好使用英文单词 array 而不是 aray

关于c - 这是一个有效的 Tic Tac Toe 获胜条件检查器功能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33322919/

相关文章:

javascript - 对如何将数组中的值与另一个变量一起使用感到困惑

c++ - 为 Erlang 提取 C 函数签名

JavaScript var 可见性

c++ - 函数 try block 是否允许我们解决异常?

php - 如何用php编写函数(类似于mysql_query)

c - 埃拉托色尼筛法 C 实现错误

c - 从 "the Book"开始进行 C 数组练习的直观方法。 [例1-13]

PHP函数根据输入获得相同的输出

c - 增加 xcode 上的线程数会增加程序时间

c - 从内存中获取 n 个字节