您的位置:首页 > 其它

三子棋小游戏

2017-11-20 23:09 183 查看
一、井字双人对战游戏(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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: