三子棋小游戏
2017-11-20 23:09
183 查看
一、井字双人对战游戏(3子棋游戏)
分析
1.棋盘模拟。
因为棋盘上的交叉点正好是3行3列,因此用一个3行3列的二维数组即可。数据初始值为0,表示未有妻子落下;值为1表示落下的是1好选手棋子,之位2表示的是2号选手的棋子。
2.是否连成一条线检测。
对刚落下的妻子检查所在的行是否都是同一选手的棋子;同样再检测所有的列是否都是同一选手的棋;同样的方法再检测对角线和反对角线。
3.对棋子位置的描述。
用一个结构体,把棋子所在的行号和列号组合在一起。程序中对连成一线的检测是从棋盘的角度出发,检测有没有相同的行、列、对角线,也可以从选手已下的棋子,即play1、play2数组出发,检测是否有3个的同值得行号分量或列号分量。
代码如下:
分析
1.棋盘模拟。
因为棋盘上的交叉点正好是3行3列,因此用一个3行3列的二维数组即可。数据初始值为0,表示未有妻子落下;值为1表示落下的是1好选手棋子,之位2表示的是2号选手的棋子。
2.是否连成一条线检测。
对刚落下的妻子检查所在的行是否都是同一选手的棋子;同样再检测所有的列是否都是同一选手的棋;同样的方法再检测对角线和反对角线。
3.对棋子位置的描述。
用一个结构体,把棋子所在的行号和列号组合在一起。程序中对连成一线的检测是从棋盘的角度出发,检测有没有相同的行、列、对角线,也可以从选手已下的棋子,即play1、play2数组出发,检测是否有3个的同值得行号分量或列号分量。
代码如下:
# include <stdio.h> # include <stdlib.h> struct position { int x = 0; int y = 0; }; int qipan[3][3]={0}; //棋盘数据结构 void printqipan(int qp[3][3]) //打印棋盘 { int i = 0; for(i = 0;i<3;i++) { if(qp[i][0] = 0) printf("+--"); else if(qp[i][0] = 1) printf("o--"); else printf("*--"); if(qp[i][1] = 0) printf("+--"); else if (qp[i][1] = 1) printf("o--"); else printf("*--"); if (qp[i][2] = 0) printf("+"); else if(qp[i][2] = 1) printf("o"); else printf("*"); printf("\n"); } } int check (struct position *play,int i) //检查有无3个棋子连成一线 { int k = 0; int x = play[i].x; int y = play[i].y; int qizi = qipan[x][y]; for (k = 0;k<=2;k++) //*检查所在的行是否是同一棋子 if(qipan[x][k]!=qizi) break; if(k>2) return 1; for(k = 0; k <= 2;k++) //检查所有的列是否都是同一棋子 if(qipan[k][y]!=qizi) break; if(k>2) return 1; for(k = 0;k <= 2;k++) //检查所有的对角线是否都是同一棋子 if(qipan[k][k]!=qizi) break; if(k>2) return 1; for(k = 0;k <= 2;k++) //检查所有反对角线是否都是同一棋子 if(qipan[x][2-k]!=qizi) break; if(k>2) return 1; return 0; } main() { int i,num=0,t_x,t_y; //t_x和t_y的取值范围是0、1、2 struct position play1[5],play2[5]; //每个选手最多下5次 printqipan(qipan); i = 1; while (num < 9) { do { printf("选手一下子,输入下一子的位置:"); scanf("%d,%d",&t_x,&t_y); }while(qipan[t_x][t_y]!=0); play1[i].x=t_x; play1[i].y=t_y; qipan[t_x][t_y]=1; num+=1; printqipan(qipan); if(check(play1,i)) { printf("1号选手胜利了"); return 0; } if(num == 9) break; do { printf("选手2下一子,输入下子的位置:"); scanf("%d,%d",&t_x,&t_y); }while(qipan[t_x][t_y]!=0); play2[i].x=t_x; play2[i].y=t_y; qipan[t_x][t_y]=2; num+=1; printqipan; if( check(play2,i)) { printf("2号选手胜利了"); return 0; } i++; } printf("两人都失败了"); return 0; }