如何通过C语言实现井字棋游戏
如何通过C语言实现井字棋游戏
今天就跟大家聊聊有关如何通过C语言实现井字棋游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名。
题目分析 :
要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么?
1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来;
2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为(空格);
3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下。在
4.每一次下完棋后需要进行检测,判断该下棋位置是否合法、判断是否胜利等等。
根据上述分析,可以大致定义出以下函数窗口:
voidInitGame();//初始化游戏(棋盘)voidPrintChess();//输出棋盘voidPlayerMove();//玩家下棋voidComputerMove();//电脑下棋charCheckGameOver();//判断游戏是否结束(玩家胜/电脑胜/和棋)
初始化棋盘:将3*3的二维数组棋盘的每个位置初始化为‘ ’
voidInitGame(){for(inti=0;i<ROW;i++){for(intj=0;j<COL;j++)chess_board[i][j]='';}}
输出棋盘: 输出棋盘时,棋盘的风格可以根据自己的喜好来设计
voidPrintfChess()//输出棋盘,棋盘的设计可以根据自己的喜好设计{for(inti=0;i<ROW;i++){printf("|%c|%c|%c|\n",chess_board[i][0],chess_board[i][1],chess_board[i][2]);if(i<ROW-1)printf("|---|---|---|\n");}}
玩家下棋: 玩家输入下棋位置后,需要判断该位置是否合法、输入位置是否已被占用
voidPlayerMove()//玩家下棋{printf("玩家落子.\n");introw,col;while(1){printf("请输入一组坐标(下棋位置):>");scanf("%d%d",&row,&col);//检查坐标的有效性if(row<0||row>ROW||col<0||col>COL){printf("输入非法,请重新输入...");continue;}if(chess_board[row][col]!=''){printf("输入的位置已被占用,请重新输入...");continue;}chess_board[row][col]='x';//x代表玩家下的棋break;}}
电脑下棋: 电脑下棋时,下棋的位置利用srand函数随机产生
voidComputerMove()//电脑下棋{srand(time(0));while(1){introw=rand()%ROW;intcol=rand()%COL;if(chess_board[row][col]!=''){continue;}chess_board[row][col]='o';//o代表电脑下的棋break;}}
检查棋盘 :在检测棋盘时,分别判断行、列、对角线,在这里我规定:
'x'代表玩家赢 'o'代表电脑赢 'h'代表和棋 'c'代表继续
charCheckGameOver()//检测游戏是否结束{//检查行for(inti=0;i<ROW;i++){if(chess_board[i][0]!=''&&chess_board[i][0]==chess_board[i][1]&&chess_board[i][0]==chess_board[i][2])returnchess_board[i][0];}//检查列for(intj=0;j<COL;j++){if(chess_board[0][j]!=''&&chess_board[0][j]==chess_board[1][j]&&chess_board[0][j]==chess_board[2][j])returnchess_board[0][j];}//检查对角线if(chess_board[0][0]!=''&&chess_board[0][0]==chess_board[1][1]&&chess_board[0][0]==chess_board[2][2])returnchess_board[0][0];if(chess_board[0][2]!=''&&chess_board[0][2]==chess_board[1][1]&&chess_board[0][2]==chess_board[2][0])returnchess_board[0][2];//判断是否和棋if(ChessFull())return'h';return'c';}
至此,主要的功能函数均已编写完毕,整个程序的流程如下所示:
1.初始化棋盘;
2.输出棋盘;
3.玩家下棋;
4.检测棋盘;
5.电脑下棋;
6.检测棋盘
代码如下:
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<time.h>#include<stdbool.h>#include<stdlib.h>#defineSTART1#defineQUIT0#defineROW3#defineCOL3staticcharchess_board[ROW][COL];//定义棋盘voidStartGame();voidInitGame();voidPrintfChess();voidPlayerMove();voidComputerMove();charCheckGameOver();boolChessFull();intmain(intargc,char*argv[]){intselect=1;while(select){printf("*********************\n");printf("*[1]StartGame*\n");printf("*[2]OverGame*\n");printf("*********************\n");printf("请选择:>");scanf_s("%d",&select);if(select==QUIT)break;if(select!=START){printf("输入有错,请重新输入.....\n");continue;}StartGame();}printf("GoodBye.....");return0;}voidStartGame(){charwinner;//1初始化游戏(棋盘)InitGame();//2进入游戏while(1){//3输出棋盘PrintfChess();//4玩家下棋PlayerMove();//5检查结果winner=CheckGameOver();if(winner!='c')break;//6电脑下棋ComputerMove();//7检查结果CheckGameOver();winner=CheckGameOver();if(winner!='c')break;}if(winner=='x')printf("玩家赢.\n");if(winner=='o')printf("电脑赢.\n");if(winner=='h')printf("和棋.\n");}voidInitGame(){for(inti=0;i<ROW;i++){for(intj=0;j<COL;j++)chess_board[i][j]='';}}voidPrintfChess()//输出棋盘,棋盘的设计可以根据自己的喜好设计{for(inti=0;i<ROW;i++){printf("|%c|%c|%c|\n",chess_board[i][0],chess_board[i][1],chess_board[i][2]);if(i<ROW-1)printf("|---|---|---|\n");}}voidPlayerMove()//玩家下棋{printf("玩家落子.\n");introw,col;while(1){printf("请输入一组坐标(下棋位置):>");scanf("%d%d",&row,&col);//检查坐标的有效性if(row<0||row>ROW||col<0||col>COL){printf("输入非法,请重新输入...");continue;}if(chess_board[row][col]!=''){printf("输入的位置已被占用,请重新输入...");continue;}chess_board[row][col]='x';//x代表玩家下的棋break;}}voidComputerMove()//电脑下棋{srand(time(0));while(1){introw=rand()%ROW;intcol=rand()%COL;if(chess_board[row][col]!=''){continue;}chess_board[row][col]='o';//o代表电脑下的棋break;}}/**'x'代表玩家赢*'o'代表电脑赢*'h'代表和棋*'c'代表继续*/charCheckGameOver()//检测游戏是否结束{//检查行for(inti=0;i<ROW;i++){if(chess_board[i][0]!=''&&chess_board[i][0]==chess_board[i][1]&&chess_board[i][0]==chess_board[i][2])returnchess_board[i][0];}//检查列for(intj=0;j<COL;j++){if(chess_board[0][j]!=''&&chess_board[0][j]==chess_board[1][j]&&chess_board[0][j]==chess_board[2][j])returnchess_board[0][j];}//检查对角线if(chess_board[0][0]!=''&&chess_board[0][0]==chess_board[1][1]&&chess_board[0][0]==chess_board[2][2])returnchess_board[0][0];if(chess_board[0][2]!=''&&chess_board[0][2]==chess_board[1][1]&&chess_board[0][2]==chess_board[2][0])returnchess_board[0][2];//判断是否和棋if(ChessFull())return'h';return'c';}boolChessFull(){for(inti=0;i<ROW;i++){for(intj=0;j<COL;j++){if(chess_board[i][j]=='')returnfalse;}}returntrue;}
运行测试图:
程序的运行界面我们还可以利用system("cls")对界面进行优化,这样可以使界面更加美观。
看完上述内容,你们对如何通过C语言实现井字棋游戏有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。