2.4 电脑下棋
电脑下棋就是对数组直接控制,只需要我们用随机数控制二维数组的行列就可以,对于随机数的产生我在猜数字游戏中有详细的介绍,随机数产生后我们需要判断随机数控制的的位置是否已经被输入,如果已经被输入,需要让系统再次产生随机数,代码如下
void computer_play(char broad[ROW][COL],int row,int col) { printf("电脑下棋\n"); while(1) { int x=rand()%row; int y=rand()%col; if(x>=0&&x<row&&y>=0&&y<col) { if(broad[x][y]==' ') { broad[x][y]='#'; break; } } } }
现在给大家演示一下人机对弈的过程
这里我们看到玩家已经获胜,但是系统并没有提示接下来就需要我们编写下一个函数。
2.5 游戏输赢判断
对于判断输赢函数的编写我们在游戏实现函数中用ret接收以进行判断,对于不同的结果我们返回不同的符号。
由于玩家输入的是” * “为了便于从数组中提取所以用 * 表示玩家已经获胜,同理用 #表示电脑获胜,游戏继续我们用 ‘ C ’表示,平局用‘ Q ’表示。
对于三子棋,我们主要从行,列,对角线是否三个成一条线判断,对于平局,只需要数组全部不是空格后仍然没有三个成一条线就成立,这里我们再用一个函数is_full()判断即可。下面就是判断输赢代码演示:
char is_win(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { if(broad[i][0]==broad[i][1]&&broad[i][1]==broad[i][2]&&broad[i][2]!=' ') { return broad[i][0]; } } for(i=0;i<col;i++) { if(broad[0][i]==broad[1][i]&&broad[1][i]==broad[2][i]&&broad[2][i]!=' ') { return broad[0][i]; } } if(broad[0][0]==broad[1][1]&&broad[1][1]==broad[2][2]&&broad[2][2]!=' '|| broad[0][2]==broad[1][1]&&broad[1][1]==broad[2][0]&&broad[2][0]!=' ') { return broad[1][1]; } if(is_full(broad,ROW,COL)==1) { return 'Q'; } else return 'C'; }
对于is_full()函数,代码如下:
int is_full(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { int j=0; for(j=0;j<col;j++) { if(broad[i][j]==' ') return 0; } } return 1; }
实现演示:
(还有两个结果大家可以自行演示,总代码在最下方)
以上就是三子棋的所有板块的书写,为了让大家更好的进行对代码的观看和理解,下面我把所有代码整个在一起
总代码
#include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void mune() { printf("*************************\n"); printf("******* 1.play ********\n"); printf("******* 0.exit ********\n"); printf("*************************\n"); } void init_broad(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<=row;i++) { int j=0; for(j=0;j<=col;j++) { broad[i][j]=' '; } } } void print_broad(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { int j=0; for(j=0;j<col;j++) { printf(" %c ",broad[i][j]); if(j<col-1) printf("|"); } printf("\n"); if(i<row-1) for(j=0;j<col;j++) { printf("___"); if(j<col-1) printf("|"); } printf("\n"); } } void men_play(char broad[ROW][COL],int row,int col) { int x=0; int y=0; printf("玩家下棋\n"); while(1) { printf("输入填入的坐标:\n"); scanf("%d %d",&x,&y); if(x<1&&x>row&&y<1&&y>col) { printf("非法输\n"); } else { if(broad[x-1][y-1]==' ') { broad[x-1][y-1]='*'; break; } } } } int is_full(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { int j=0; for(j=0;j<col;j++) { if(broad[i][j]==' ') return 0; } } return 1; } void computer_play(char broad[ROW][COL],int row,int col) { printf("电脑下棋\n"); while(1) { int x=rand()%row; int y=rand()%col; if(x>=0&&x<row&&y>=0&&y<col) { if(broad[x][y]==' ') { broad[x][y]='#'; break; } } } } char is_win(char broad[ROW][COL],int row,int col) { int i=0; for(i=0;i<row;i++) { if(broad[i][0]==broad[i][1]&&broad[i][1]==broad[i][2]&&broad[i][2]!=' ') { return broad[i][0]; } } for(i=0;i<col;i++) { if(broad[0][i]==broad[1][i]&&broad[1][i]==broad[2][i]&&broad[2][i]!=' ') { return broad[0][i]; } } if(broad[0][0]==broad[1][1]&&broad[1][1]==broad[2][2]&&broad[2][2]!=' '|| broad[0][2]==broad[1][1]&&broad[1][1]==broad[2][0]&&broad[2][0]!=' ') { return broad[1][1]; } if(is_full(broad,ROW,COL)==1) { return 'Q'; } else return 'C'; } void game() { char broad[3][3]; srand(time(NULL)); char ret=0; init_broad(broad,ROW,COL); print_broad(broad,ROW,COL); while(1) { men_play(broad,ROW,COL); ret=is_win(broad,ROW,COL); if(ret!='C') { break; } computer_play(broad,ROW,COL); ret=is_win(broad,ROW,COL); print_broad(broad,ROW,COL); if(ret!='C') { break; } } if(ret=='*') { printf("玩家获胜\n"); } else if(ret=='#') { printf("电脑获胜\n"); } else printf("平局\n"); } void text() { int input=0; do { mune(); scanf("%d",&input); switch(input) { case 1: { game(); break; } case 0: { printf("退出游戏"); break; } default: printf("输入有误"); } }while(input); } int main() { text(); return 0; }