![]()
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>// 宏定义棋盘尺寸,统一管理,修改方便#defineROW15#defineCOL15// 函数声明voidinitBoard(charboard[ROW][COL]);// 初始化棋盘voiddrawBoard(charboard[ROW][COL]);// 绘制棋盘intputChess(charboard[ROW][COL],intx,inty,charch);// 落子intisWin(charboard[ROW][COL],intx,inty,charch);// 判断胜利intisDraw(charboard[ROW][COL]);// 判断平局// 棋盘初始化函数voidinitBoard(charboard[ROW][COL]){for(inti=0;i<ROW;i++){for(intj=0;j<COL;j++){board[i][j]=' ';// 全部置空}}}// 棋盘绘制函数voiddrawBoard(charboard[ROW][COL]){// 打印顶部坐标printf(" ");for(inti=0;i<COL;i++){printf("%2d",i);}printf("\n");// 打印棋盘主体for(inti=0;i<ROW;i++){printf("%2d ",i);// 打印左侧坐标for(intj=0;j<COL;j++){printf("%c",board[i][j]);if(j<COL-1){printf("|");}}printf("\n");// 打印分割线if(i<ROW-1){printf(" ");for(intk=0;k<COL;k++){printf("--");if(k<COL-1){printf("+");}}printf("\n");}}}// 落子函数:成功返回1,失败返回0intputChess(charboard[ROW][COL],intx,inty,charch){// 坐标越界判断if(x<0||x>=ROW||y<0||y>=COL){return0;// 落子失败}// 判断位置是否已有棋子if(board[x][y]!=' '){return0;// 落子失败}// 合法落子,更新棋盘board[x][y]=ch;return1;// 落子成功}// 判断胜负:四大方向检测五子连珠intisWin(charboard[ROW][COL],intx,inty,charch){intcount=1;// 当前棋子本身为1// 1. 水平方向 左右判断for(inti=y-1;i>=0;i--){if(board[x][i]==ch)count++;elsebreak;}for(inti=y+1;i<COL;i++){if(board[x][i]==ch)count++;elsebreak;}if(count>=5)return1;// 2. 垂直方向 上下判断count=1;for(inti=x-1;i>=0;i--){if(board[i][y]==ch)count++;elsebreak;}for(inti=x+1;i<ROW;i++){if(board[i][y]==ch)count++;elsebreak;}if(count>=5)return1;// 3. 左斜方向 左上-右下count=1;for(inti=x-1,j=y-1;i>=0&&j>=0;i--,j--){if(board[i][j]==ch)count++;elsebreak;}for(inti=x+1,j=y+1;i<ROW&&j<COL;i++,j++){if(board[i][j]==ch)count++;elsebreak;}if(count>=5)return1;// 4. 右斜方向 右上-左下count=1;for(inti=x-1,j=y+1;i>=0&&j<COL;i--,j++){if(board[i][j]==ch)count++;elsebreak;}for(inti=x+1,j=y-1;i<ROW&&j>=0;i++,j--){if(board[i][j]==ch)count++;elsebreak;}if(count>=5)return1;// 无五子连珠,继续游戏return0;}// 判断平局intisDraw(charboard[ROW][COL]){for(inti=0;i<ROW;i++){for(intj=0;j<COL;j++){if(board[i][j]==' '){return0;// 还有空位,不是平局}}}return1;// 棋盘已满,平局}// 主函数:游戏逻辑整体调度intmain(){charboard[ROW][COL];intx,y;intret;intturn=0;// 0:玩家1黑子 1:玩家2白子// 初始化棋盘initBoard(board);while(1){system("cls");// 清屏刷新界面drawBoard(board);// 切换玩家if(turn==0){printf("【玩家1 黑子】请输入落子坐标(行 列):");scanf("%d %d",&x,&y);ret=putChess(board,x,y,'@');// 落子失败重新输入while(ret==0){printf("坐标非法或已有棋子!请重新输入:");scanf("%d %d",&x,&y);ret=putChess(board,x,y,'@');}// 判断是否获胜if(isWin(board,x,y,'@')){system("cls");drawBoard(board);printf("🎉 玩家1(黑子)获胜!游戏结束!\n");break;}}else{printf("【玩家2 白子】请输入落子坐标(行 列):");scanf("%d %d",&x,&y);ret=putChess(board,x,y,'#');while(ret==0){printf("坐标非法或已有棋子!请重新输入:");scanf("%d %d",&x,&y);ret=putChess(board,x,y,'#');}if(isWin(board,x,y,'#')){system("cls");drawBoard(board);printf("🎉 玩家2(白子)获胜!游戏结束!\n");break;}}// 判断平局if(isDraw(board)){system("cls");drawBoard(board);printf("🤝 棋盘已满,平局!游戏结束!\n");break;}// 切换回合turn=!turn;}return0;}
![]()