
目录
一、整体逻辑
游戏界面截图
游戏的功能实现截图
二、代码的讲解
1.数组初始化函数
2.棋盘显示函数
3.玩家走棋函数
4.电脑走棋函数
5.胜负判断函数
6.棋盘满子函数
7.主函数
三、总结
一、整体逻辑 游戏界面截图 游戏的功能实现截图
二、代码的讲解 1.数组初始化函数2.棋盘显示函数void board_init(char a[ROW][COL], int row, int col)//棋盘初始化函数 { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { a[i][j] = ' '; } } }3.玩家走棋函数void display(char a[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 ", a[i][j]);//把“空格%c空格”当做一个数组元素打印,每行打印3个 if (j < col - 1)//同时打印完一个元素后打印分隔竖杠,最后一列不出现分隔竖杠,所以用if来判断打印到了第几列 printf("|"); } printf("\n");//每打印一行就实现换行 for (j = 0; j < col; j++)//在同一个循环里面实现两次列的打印,上面的是打印空白+分隔,这里打印的是界面的“---”,也是当成一个元素打印 { printf("---"); if (j < col - 1)//同时打印完一个元素后打印分隔竖杠,最后一列不出现分隔竖杠,所以用if来判断打印到了第几列 printf("|"); } printf("\n");//上面的第i行元素打印完成,换到下一行打印 } }4.电脑走棋函数void playermove(char a[ROW][COL], int row, int col)//玩家下棋 { int x = 0; int y = 0; while (1) { printf("请玩家输入坐标:>"); scanf("%d%d", &x, &y);//输入坐标 if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入的坐标是否合法 { if (a[x - 1][y - 1] == ' ')//判断想要输入的坐标是否有棋子 { a[x - 1][y - 1] = '*';//‘*’代表玩家落棋 break;//落棋完成退出循环,到下一个函数实现功能 } else//棋盘落子位置已下有棋,则给玩家打印提示信息 printf("坐标被占用\n"); } else//坐标非法,则提示玩家重新输入 printf("坐标输入有误,请重新输入!"); } }5.胜负判断函数void computermove(char a[ROW][COL], int row, int col)//电脑下棋 { printf("电脑下棋\n"); int x = 0; int y = 0; while (1)//电脑下棋,用随机数来实现模拟电脑下棋 { x = rand() % row;//调用rand函数,再对所取的数对3取模,把这个随机数固定在0~2 y = rand() % col;//同理 if (a[x][y] == ' ')//在棋盘为空的地方落棋,用if判断 { a[x][y] = '#'; break; } } }6.棋盘满子函数char winorlose(char a[ROW][COL], int row, int col)//判断输赢 { int i = 0; int j = 0; for (i = 0; i < row; i++)//行胜利的判断 { j = 0; while (j <= col - 2) { if (a[i][j] == a[i][j + 1] && a[i][j] != ' ')//先判断每一行的第一个元素和第二个元素是否相等,并且不能为空格 { j += 1;//如果每一行的第一个元素和第二个元素相等,则跳到下一个元素 if (a[i][j] == a[i][j + 1])//如果下一个元素和最后一个元素相等,则返回元素字符,通过返回的字符判断是电脑赢还是玩家赢 { return a[i][j]; } } j++; } } for (j = 0; j < col; j++)//列胜利的判断,这里的判断与行判断同理 { i = 0; while (i <= row - 2) { if (a[i][j] == a[i+1][j] && a[i][j] != ' ') { i += 1; if (a[i][j] == a[i + 1][j]) { return a[i][j]; } } i++; } } i = 0;//这里把元素定位到左上角 j = 0; while (i <= (row - 2) && j <= (col - 2))//左上角到右下角对角线的胜利判断 { if (a[i][j] != ' '&&a[i][j]==a[i+1][j+1] )//判断对角线的第一个元素与第二个元素是否相等,并且元素不能为空格 { i += 1;//如果相等,则对对角线的下一个元素进行比较 j += 1; if (a[i][j] == a[i + 1][j + 1])//如果第二个元素和第三个元素相等,则第一个元素和第三个元素相等,则判断出胜利条件 { return a[i][j]; //返回元素字符,用以判断是玩家胜利还是电脑胜利 } } i++;//用以退出循环,不写会死循环 j++; } i = 0; j = col - 1; while (i <= row - 2)//右上角到左下角的胜利判断 { if (a[i][j] != ' '&&a[i][j]==a[i+1][j-1])//这里的判断与上面的同理,只是要注意行列是怎么变化的 { i += 1; j -= 1; if (a[i][j] == a[i + 1][j - 1]) { return a[i][j]; } } i++; } if (fullornot(a, ROW, COL)) return 1; return 'c'; }int fullornot(char a[ROW][COL], int row, int col)//判断棋盘是否满子,满子即平局 { int i = 0; int j = 0; for (i = 0; i < row; i++)//原理是对整个数组元素遍历,如果发现有元素仍为空格,则返回0,否则遍历完成还没有发现空格,则退出循环返回1 { for (j = 0; j < col; j++) { if (a[i][j] == ' ') return 0; } } return 1; }
7.主函数int main() { srand((unsigned int)time(NULL)); int input = 0; char a[ROW][COL] = { 0 }; menu(); printf("请输入数字:>"); scanf("%d", &input); while (input) { switch (input) { case 1: game(a, ROW, COL); break; case 0: break; default: printf("输入错误,请重新选择:>"); break; } menu(); printf("请选择:>"); scanf("%d", &input); } return 0; }
三、总结三子棋代码实现起来不难,主要考验的是代码的逻辑关系,很适合初学者手敲,用到的知识就函数,数组,还有循环结构。
有些地方写的不是很好,比如胜负的判断那里,纯纯就是按照三子棋来写的,代码的复用性不高,后续的话会写一个5子棋,也算是锻炼锻炼自己。
其次是我写的博客次数不多,可能写的不是很好,希望大家凑合着看吧
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)