C语言实现简单井字棋游戏
作者:冰凌呀
这篇文章主要为大家详细介绍了C语言实现简单井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下
游戏截图
源代码
person.h
//玩家对战 void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出胜负且棋局未落满子前无限循环 while(1) { //获取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判断是否已经分出胜负 if(isWin(map)==1) { //输出获胜方 displayWinner(); break; } //是否棋局已满 else if(count==row*col) { printf("平局!\n"); break; } //交替到对手回合 exchangeTurn(); } }
computer.h
//局面价值 int getSum(char map[][col]) { int sumO=0,sumX=0; int i,j; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(map[i][j]=='O') { sumO+=score[i][j]; } else if(map[i][j]=='X') { sumX+=score[i][j]; } } } return sumX-sumO; } //思考 void think(char map[][col]) { int canWin=0; int i,j; int x=-1,y=-1; int sum; int maxSum=-20; count++; for(i=0;i<row;i++) { for(j=0;j<col;j++) { if(map[i][j]==m) { map[i][j]='X'; //能获胜,直接落子此处 if(isWin(map)) { return; } //不能获胜,落子在分数最多的地方 else { map[i][j]='O'; if(isWin(map)) { map[i][j]='X'; return; } map[i][j]='X'; sum=getSum(map); if(sum>maxSum) { maxSum=sum; x=i; y=j; } } map[i][j]=m; } } } map[x][y]='X'; } void computer() { int i,j; char computerType='X'; initMap(map); //打印棋局 displayMap(map); //未分出胜负且棋局未落满子前无限循环 while(1) { //电脑落子 if(nowType==computerType) { printf("电脑落子:"); think(map); } //玩家落子 else { //获取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); } //清屏 system("cls"); //打印棋局 displayMap(map); //玩家落子后判断是否已经分出胜负 if(isWin(map)==1) { //输出获胜方 displayWinner(); break; } //是否棋局已满 else if(count==row*col) { printf("平局!\n"); break; } //交替到对手回合 exchangeTurn(); } }
main.c
#include<stdio.h> #include<stdlib.h> //棋局 char map[3][3]; //行列 int row=3,col=3; //棋子类型 char o='O',x='X',m=' '; //当前棋子类型 char nowType='O'; //已落子数量 int count=0; //初始化棋局 void initMap(char map[][col]) { int i,j; for(i=0;i<row;i++) { for(j=0;j<col;j++) { map[i][j]=m; } } } //打印当前棋局 void displayMap(char map[][col]) { int i,j; printf(" "); for(i=0;i<col;i++) { printf("%d ",i); } printf("\n "); for(i=0;i<2*col+1;i++) { printf("*"); } printf("\n"); for(i=0;i<row;i++) { printf("%d ",i); for(j=0;j<col;j++) { printf("%c ",map[i][j]); } printf("\n "); for(j=0;j<2*col+1;j++) { printf("*"); } printf("\n"); } } //获取用户输入 void getXY(int *i,int *j) { while(1) { printf("落子方:%c\n",nowType); printf("落子位置(x,y)="); scanf("%d %d",i,j); if(*i<0||*i>=row||*j<0||*j>=col||map[*i][*j]!=m) { printf("输入不合法!\n"); } else { return; } } } //交替下子 void exchangeTurn() { if(nowType==o) { nowType=x; } else { nowType=o; } } //下子 void setPiece(char map[][col],int i,int j) { map[i][j]=nowType; count++; } //判断是否分出胜负,分别从横竖斜三个方向数数 int isWin(char map[][col]) { int i,j; int flagR,flagC; for(i=0;i<row;i++) { flagR=0,flagC=0; for(j=0;j<col;j++) { if(map[i][j]==o) { flagR++; } else if(map[i][j]==x) { flagR--; } if(map[j][i]==o) { flagC++; } else if(map[j][i]==x) { flagC--; } } if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col)) { return 1; } } flagR=0,flagC=0; for(i=0,j=0;i<row&&j<col;i++,j++) { if(map[i][j]==o) { flagR++; } else if(map[i][j]==x) { flagR--; } if(map[i][col-j-1]==o) { flagC++; } else if(map[i][col-j-1]==x) { flagC--; } } if(flagR==col||flagC==col||flagR==(-col)||flagC==(-col)) { return 1; } else { return 0; } } //输出胜方 void displayWinner() { printf("%c方获得胜利!\n",nowType); } //给局面打分的基础表(站位分) int score[3][3]={ {4,2,4}, {2,8,2}, {4,2,4} }; //引入自定义头文件 #include"person.h" #include"computer.h" int main() { int gameType; printf("1.人机对战\n其他.玩家对战\n"); scanf("%d",&gameType); if(gameType==1) { computer(); } else { person(); } return 0; }
代码解析
1、 其实棋类游戏设计最重要的就是模拟下棋的过程。
2、 我们知道井字棋是双方交替下子,一方执O,一方执X。
3、 比如O先下,玩家下完子后,我们判断一下此时他是否已经获胜(即是否出现横或竖或两斜线出现三子连珠的情况),没有获胜则判断是否已经将棋局下满子了,还是没有的话,轮到X的回合。再次执行此步骤。
4、 了解了过程就自然好设计了。因为棋局比较简单,我们用一个二维字符数组即可存储。落子位置用坐标(x,y),通过玩家输入即可进行模拟。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。