mathhater 2021-12-07 15:17 采纳率: 64.3%
浏览 18
已结题

三字棋游戏,玩家走的棋子神秘丢失

玩家走的棋子会丢失不记录,一模一样的代码,电脑走的却不会丢失,我也调试过了,就是在调用完玩家走的函数之后,调用电脑走的函数,玩家下的棋子就会被清空初始化了,而且奇怪的是,玩家走的棋子每次都会被清空,最后棋盘上等电脑的子符合胜利条件之后,会判断电脑胜利。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3

void boardinit(char arr[ROW][COL]) {
for(int i=0; i<ROW; i++)
for(int j=0; j<COL; j++)
arr[i][j]=' ';

}

void print(char arr[ROW][COL]) {
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
printf(" %c ",arr[i][j]);
if(j<COL-1)
printf("|");
}
printf("\n");
for(int k=0; k<COL; k++) {
printf("---");
if(k<COL-1)
printf("|");
}
printf("\n");
}

}

void playermove(char arr[ROW][COL]) {
int x=0;
int y=0;

    printf("please enter the coordinate\n");

here:
scanf("%d%d",&x,&y);
if((x>ROW||x<1)||(y>COL||y<1)) {
printf("wrong value,please enter again\n");
goto here;
}
if(arr[x-1][y-1]==' ') {
arr[x-1][y-1]='*';
print(arr);

    }

    else {
        printf("you can not move there,please enter again\n");
        goto here;
    }

}

void pcmove(char arr[ROW][COL]) {
int x=0;
int y=0;
srand(time(NULL));
printf("computer move\n");
here:
x=rand()%3;
y=rand()%3;
if(arr[x][y]==' ') {
arr[x][y]='#';
print(arr);

}

else {
    goto here;
}

}

int isfull(char arr[ROW][COL]) {
for(int i=0; i<ROW; i++) {
for(int j=0; j<COL; j++) {
if(arr[i][j]=' ')
return 0;
}

}
return 1;

}

char iswin(char arr[ROW][COL]) {

for(int i=0; i<ROW; i++) {
    if(arr[i][0]==arr[i][1]&&arr[i][1]==arr[i][2]&&arr[i][0]!=' ')
        return arr[i][0];
}

for(int i=0; i<COL; i++) {
    if(arr[0][i]==arr[1][i]&&arr[1][i]==arr[2][i]&&arr[0][i]!=' ')
        return arr[0][i];
}

if(arr[0][0]==arr[1][1]&&arr[1][1]==arr[2][2]&&arr[0][0]!=' ') {
    return arr[0][0];
}

if(arr[2][0]==arr[1][1]&&arr[1][1]==arr[0][2]&&arr[2][0]!=' ') {
    return arr[2][0];
}
if(isfull(arr)==0)
    return 'c';
else
    return 'q';

}

int main() {
char board[ROW][COL];
boardinit(board);
print(board);
while(1) {
playermove(board);
if(iswin(board)!='c') {
if(iswin(board)=='*') {
printf("you are the winner");
break;
}

        if(iswin(board)=='#') {
            printf("computer are the winner");
            break;
        }
        if(iswin(board)=='q') {
            printf("no one is winning");
            break;
        }


    }

    pcmove(board);
    if(iswin(board)!='c') {
        if(iswin(board)=='*') {
            printf("you are the winner");
            break;
        }

        if(iswin(board)=='#') {
            printf("computer are the winner");
            break;
        }
        if(iswin(board)=='q') {
            printf("no one is winning");
            break;
        }


    }

}

return 0;

}

  • 写回答

2条回答 默认 最新

  • 於黾 2021-12-07 16:07
    关注

    int isfull(char arr[ROW][COL]) {
    for(int i=0; i<ROW; i++) {
    for(int j=0; j<COL; j++) {
    if(arr[i][j]=' ')
    return 0;
    }
    你把判断写成赋值了
    -=-=-=
    你说你调试了,可是你是一步一步调试的吗,你断点跟了吗,跟进函数里面了吗
    你只知道一个函数走完,数组就被清空了,那到底是哪一条语句清空的,你找到了吗
    这种bug用眼睛看,要累死人,编译器在你手里,你要好好利用啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月15日
  • 已采纳回答 12月7日
  • 创建了问题 12月7日

悬赏问题

  • ¥15 模电中二极管,三极管和电容的应用
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。
  • ¥15 气象网格数据与卫星轨道数据如何匹配
  • ¥100 java ee ssm项目 悬赏,感兴趣直接联系我
  • ¥15 微软账户问题不小心注销了好像
  • ¥15 x264库中预测模式字IPM、运动向量差MVD、量化后的DCT系数的位置
  • ¥15 curl 命令调用正常,程序调用报 java.net.ConnectException: connection refused
  • ¥20 关于web前端如何播放二次加密m3u8视频的问题
  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络