问题描述:两个游戏者在3*3棋盘里轮流作标记,如果一个人在行,列或者两个对角线可以作三个标记,则为获胜。
我们首先得打印菜单供玩家选择(可以选择玩游戏或者退出游戏)
1 void menu() 2 { 3 printf("******************** "); 4 printf("***** 1.play ***** "); 5 printf("***** 0.exit ***** "); 6 printf("******************** "); 7 }
接下来得有个test函数测试游戏的可玩性:
srand()函数随机生成生成数起点,为rand()函数服务,注意包含头文件为<Time.h>
void test() { int input = 0; srand((unsigned int)time(NULL));
do { menu(); printf("请输入选项:"); scanf("%d",&input); switch(input) { case 1: game(); break; case 0: printf("退出游戏"); break; default: printf("输入有误,请重新输入"); break; } }while(input); }
接下来就到了玩游戏环节:
用'#'作电脑标记,用'*'作玩家标记,用变量ret接受输赢信息,'*'为玩家赢,’#‘为电脑赢,’C'继续玩游戏,‘P’平局;
void game() { char ret = '0'; char board[ROW][COL]={0}; InitBoard(board,ROW,COL); DisplatBoard(board,ROW,COL); while(1) { PlayMove(board,ROW,COL); DisplatBoard(board,ROW,COL); ret=IsWin(board,ROW,COL); if(ret=='*') { printf("玩家赢 "); break; } else if(ret=='#') { printf("电脑赢 "); break; } else if(ret=='Q') { printf("平局 "); break; } ComputerMove(board,ROW,COL); DisplatBoard(board,ROW,COL); ret=IsWin(board,ROW,COL); if(ret=='*') { printf("玩家赢 "); break; } else if(ret=='#') { printf("电脑赢 "); break; } else if(ret=='Q') { printf("平局 "); break; } } }
最后就是game.c的游戏完善部分:
初始化棋盘:
使用memset()将棋盘全部初始化为空格,头文件为<string.h>
void InitBoard(char board[ROW][COL],int row,int col) { memset(board,' ',row*col*sizeof(board[0][0])); }
打印棋盘:
void DisplatBoard(char board[ROW][COL],int row,int col) { int i=0; int j=0; for(i = 0; i < row; i++) { for(j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf(" "); for(j = 0; j < col ; j++) { if (i < row - 1) printf("___"); else printf(" "); if (j < col - 1) printf("|"); } printf(" "); } }
玩家下:
void PlayMove(char board[ROW][COL],int row,int col) { int x=1; int y=1; do { printf("请玩家输入坐标:"); scanf("%d %d",&x,&y); if ((x>0 && x<=row) && (y>0 && y<=col)) { if (board[x-1][y-1]==' ') { board[x-1][y-1]='*'; break; } else printf("这个坐标被占了,请重新输入: "); } else printf("输入错误,请重新输入 "); }while(1); }
电脑下:
使用rand()函数随机生成坐标
void ComputerMove(char board[ROW][COL],int row,int col) { int x = 0; int y = 0; printf("电脑走: "); while (1) { x = rand()%row; y = rand()%col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
判断输赢:
char IsWin(char board[ROW][COL],int row,int col) { int i=0; int j=0; int count=0; char temp[ROW] = {'0'}; for (i = 0; i < row; i++) { count = 0; for(j = 0; j < col; j++) temp[j]=board[i][j]; for(j = 0; j < col - 1; j++) { if(temp[j]==temp[j+1]) count++; else break; } if(count==(row-1)) return board[i][0]; } count = 0; for (i = 0; i < col; i++) { count=0; for(j = 0; j < row; j++) temp[j]=board[j][i]; for(j = 0; j < row - 1; j++) { if(temp[j]==temp[j+1]) count++; else break; } if(count==(row-1)) return board[0][i]; } count = 0; for (i = 0; i < row; i++) temp[i]=board[i][i]; for(j = 0; j < col - 1; j++) { if(temp[j]==temp[j+1]) count++; else break; } if(count==(row-1)) return board[0][0]; count = 0; for (i = 0; i < row; i++) temp[i]=board[i][row-1-i]; for(j = 0; j < col - 1; j++) { if(temp[j]==temp[j+1]) count++; else break; } if(count==(row-1)) return board[0][row-1]; if (IsFull(board,ROW,COL)) return 'Q'; }
判断棋盘是否满了:
static把函数封装在game.c内部
static int IsFull(char board[ROW][COL],int row,int col) { int i=0; int j=0; int count=0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] != ' ') count++; } } if (count==row*col) return 1; else return 0; }
部分调试界面展示:
因为我写代码时考虑到想让三子棋改为五子棋、八子棋等方便点,就在声明部分声明行和列,方便修改棋盘,这是调试过程调试五子棋显示的棋盘。
最后,我的游戏还很蠢想要打败玩家除非玩家想让它赢,存在很多不足,希望各位可以借鉴的同时不要吐槽,也期待进一步的优化和改进。