C语言 当我把'X'或'O'在一些特定的地方在我的10x10井字游戏程序,2个空格注册

zzwlnbp8  于 2023-03-17  发布在  其他
关注(0)|答案(2)|浏览(106)

我做了一个10 x10井字游戏,赢家是在一行,一列和对角线上标记了5的玩家。当我在第一列,即0,或最后一列,即9中输入'X'或'O'时,例如:8 0,9 0,0 9.在另一列上将有第二个标记,它们是8 0-〉7 9,9 0-〉8 9,0 9-〉1 0。

0   1   2   3   4   5   6   7   8   9
 |---|---|---|---|---|---|---|---|---|---|
0|   |   |   |   |   |   |   |   |   | X |
 |---|---|---|---|---|---|---|---|---|---|
1| X |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
2|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
3|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
4|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
5|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
6|   |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|
7|   |   |   |   |   |   |   |   |   | X |
 |---|---|---|---|---|---|---|---|---|---|
8| X |   |   |   |   |   |   |   |   | O |
 |---|---|---|---|---|---|---|---|---|---|
9| O |   |   |   |   |   |   |   |   |   |
 |---|---|---|---|---|---|---|---|---|---|

下面是代码:

#include <stdio.h>
#include <time.h>
char board[9][9];
const char PLAYER ='X';
const char PLAYER2 = 'O';
const char BOT ='O';

void resetBoard(){
    int i,j;
    for(i=0;i<10;i++){
        for(j=0;j<10;j++){
            board[i][j]=' ';
        }
    }
}

printBoard(){
    printf("   0   1   2   3   4   5   6   7   8   9");
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n0| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[0][0],board[0][1],board[0][2],board[0][3],board[0][4],board[0][5],board[0][6],board[0][7],board[0][8],board[0][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n1| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[1][0],board[1][1],board[1][2],board[1][3],board[1][4],board[1][5],board[1][6],board[1][7],board[1][8],board[1][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n2| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[2][0],board[2][1],board[2][2],board[2][3],board[2][4],board[2][5],board[2][6],board[2][7],board[2][8],board[2][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n3| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[3][0],board[3][1],board[3][2],board[3][3],board[3][4],board[3][5],board[3][6],board[3][7],board[3][8],board[3][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n4| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[4][0],board[4][1],board[4][2],board[4][3],board[4][4],board[4][5],board[4][6],board[4][7],board[4][8],board[4][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n5| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[5][0],board[5][1],board[5][2],board[5][3],board[5][4],board[5][5],board[5][6],board[5][7],board[5][8],board[5][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n6| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[6][0],board[6][1],board[6][2],board[6][3],board[6][4],board[6][5],board[6][6],board[6][7],board[6][8],board[6][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n7| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[7][0],board[7][1],board[7][2],board[7][3],board[7][4],board[7][5],board[7][6],board[7][7],board[7][8],board[7][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n8| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[8][0],board[8][1],board[8][2],board[8][3],board[8][4],board[8][5],board[8][6],board[8][7],board[8][8],board[8][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
    printf("\n9| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |",board[9][0],board[9][1],board[9][2],board[9][3],board[9][4],board[9][5],board[9][6],board[9][7],board[9][8],board[9][9]);
    printf("\n |---|---|---|---|---|---|---|---|---|---|");
}

void printWinner(char winner){
    if (winner==PLAYER){
        printf("\nYou win!");
    }
    else if(winner==BOT){
        printf("\nYou lose!");
    }
    else printf("\nTie!");
}

void printWinnerHuman(char winner){
    if (winner==PLAYER){
        printf("\nPlayer 1 wins!");
    }
    else if(winner==PLAYER2){
        printf("\nPlayer 2 wins!");
    }
    else printf("\nTie!");
}

void playerMove(){
    int x,y;
    do{
        printf("\nYou are X!");
        printf("\nEnter move (Ex: 0 2): ");
        scanf("%d %d",&x,&y);
        if (board[x][y]!=' '){
            printf("\n\n\n\n\n\n\nSpace already taken\n");
            printf("\nTry another move!\n");
            printBoard();
        }
        else {
            board[x][y]=PLAYER;
            break;
        }
    }
    while(board[x][y]!=' ');
}

void player2Move(){
    int x,y;
    do{
        printf("\n\nYou are O!");
        printf("\nEnter your move (Ex: 1 2): ");
        scanf("%d %d",&x,&y);
        if(board[x][y]!=' '){
            printf("\nSpace already taken!\n");
            printBoard();
        }
        else{
            board[x][y]=PLAYER2;
            break;
        }
    }
    while(board[x][y]!=' ');
}

void botMove(){
    //create random moves for bot
    srand(time(0));
    int x,y;
    if(checkFreeSpaces()>0){
        do{
            x=rand()%9;
            y=rand()%9;
        }
        while(board[x][y]!=' ');
        board[x][y]=BOT;
    }
    else printWinner(' ');
}

char checkWinner(){
    int i,j;
    int found=0;
    int count=0;
    //check rows winner
    for(i=0;i<10;i++){
        if(count<4){
            count=0;
            for(j=0;j<10;j++){
                if (board[i][j]==board[i][j+1]&&board[i][j]!=' '){
                    count++;
                    if(count==4){
                    return board[i][j];
                    }
                }
            }   
        }
    }
    //check columns winner
    for(i=0;i<10;i++){
        if(count<4){
            count=0;
            for(j=0;j<10;j++){
                if (board[j][i]==board[j+1][i]&&board[j][i]!=' '){
                    count++;
                    if(count==4){
                        return board[j][i];
                    }
                }
            }
        }
    }
    //check all diagonals above MAIN diagonals(\*)
    int row;
    int column;
    for(i=5;i>=0;i--){
        column=i;
        row=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column+1]&&board[row][column]!=' '){
                row++;
                column++;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column+1]&&board[row][column]==' '){
                row++;
                column++;
                }
            }
        }       
    }
    //check all diagonals above SECOND diagonal(*/)
    for(i=4;i<10;i++){
        column=i;
        row=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column-1]&&board[row][column]!=' '){
                row++;
                column--;
                count++;
                if(count==4){
                    return board[row][column];
                }
            else if(board[row][column]==board[row+1][column-1]&&board[row][column]==' '){
                row++;
                column--;   
            }
            }
        }   
    }
    //check all diagonals below MAIN diagonal(*\)
    for(i=1;i<10;i++){
        row=i;
        column=0;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column+1]&&board[row][column]!=' '){
                row++;
                column++;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column+1]&&board[row][column]==' '){
                    row++;
                    column++;
                }
            }
        }
    }
    //check all diagonals below SECOND diagonal(\*)
    for(i=1;i<10;i++){
        row=i;
        column=9;
        count=0;
        for(j=0;j<10;j++){
            if(board[row][column]==board[row+1][column-1]&&board[row][column]!=' '){
                row++;
                column--;
                count++;
                if(count==4){
                    return board[row][column];
                }
                else if(board[row][column]==board[row+1][column-1]&&board[row][column]==' '){
                    row++;
                    column--;
                }
            }
        }
    }
        return ' '; //no winners
    }
    
int checkFreeSpaces(){
    int i,j;
    int freeSpaces=100;
    for(i=0;i<10;++i){
        for(j=0;j<10;++j){
            if (board[i][j]!=' '){
                freeSpaces--;
            }
        }
    }
    return freeSpaces;
}

void humanPlay(){
    resetBoard(); //reset default declaration of computer
        char winner =' ';
        while(winner == ' ' &&checkFreeSpaces()!=0){     //while there is no winner and there are still spaces
            printBoard();
            playerMove();
            winner=checkWinner();   //after every move of player, program checks if there is a winner and if there are spaces left.
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
            printBoard();
            player2Move();
            winner=checkWinner();
            if(winner!=' '||checkFreeSpaces()==0){          //if there is no spaces left and no winner, break loop.
                break;
            }
        }
        printBoard();
        printWinnerHuman(winner);
        
    }

    
void botPlay(){
    resetBoard(); //reset default declarartion of computer
        char winner =' ';
        while(winner == ' ' &&checkFreeSpaces()!=0){    //while there is no winner and there are still spaces
            printBoard();
            playerMove();
            winner=checkWinner();   //after every move of player, program checks if there is a winner and if there are spaces left.
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
            botMove();
            winner=checkWinner();
            if(winner!=' ' || checkFreeSpaces()==0){
                break;
            }
        }
        printBoard();
        printWinner(winner);
    }

//main
int main(){
    humanPlay();
    return 0;
}

我试着再次查看printBoard()函数,检查是否有任何矩阵位置输入错误,但我没有看到任何错误

sqougxex

sqougxex1#

在C语言中声明数组时,你必须指定的不是最大索引,而是元素的数目。
数组char board[9][9];的每个维度的可用索引为0到8。
分配足够的元素(如char board[10][10];)来修复错误。

nhaq1z21

nhaq1z212#

如果你想在X和Y两个维度上都有10个元素,你需要在每个维度上声明10个元素!你有char board[9][9],而不是char board[10][10]。因此,X或Y的最大合法索引是8(范围0...8,给出9个离散的可能性)。声明的元素总数是81(99)。
你正梦游般地陷入灾难,因为数组溢出。你声明了总共81(9
9)个元素,但是你索引了第100个元素,在board[9][9]。一旦你写过了第81个元素,你就破坏了别人的内存。
我想补充的是,你的电路板显示函数是丑陋的。考虑一下你可以用两个嵌套循环来代替它。
您还可以将resetBoard()函数的内容替换为简单的memset(board, ' ', sizeof(board));
还有一件事你不检查你的人类玩家输入的坐标。这是一个全新的欠/超限的可能性!
还记得那个老笑话吗:* “一个软件测试员走进一家酒吧。点了一瓶啤酒。点了零瓶啤酒。点了一瓶googolplex啤酒。点了-23的平方根啤酒。点了一只毛茸茸的猛犸。"*总是检查你的输入!

相关问题