在编写五子棋游戏前首先对整个项目进行分析:
1、五子棋的界面绘制及显示
2、对输入的数据进行写入
3、判断输入的数据多对应的位置上是否可以下棋其中包括检测此位置是否为空及是否超出下棋的有效位置(越界超出棋盘大小)
4、判断五个棋子相连的情况
5、检测胜利
6、整合所有函数功能实现双人对战的效果
以下内容是对上边步骤的代码实现
①对界面的设计首先需要确定好棋盘的大小,本次代码以8*8的矩阵大小绘制棋盘,并配合系统清屏函数进行显示,函数的代码如下
行列相等==8
printf();--绘制棋盘
System(“cls”);--系统清屏函数
头文件:#include
/*
函数功能:显示棋盘
返回值:无
形参:无
*/
void menu(void)
{
u8 i,j; //i代表行,j代表列
printf("n ");
for(i=0;i
printf("n ");
for(i=0;i
printf("n");
for(j=0;j
{
printf("%d|",j);
for(i=0;i
{
if(chess[j] == 0)
{
printf(" *");
}
}
printf("n");
}
}
②对输入的数据进行写入,此功能只需要将输入的值进行接收即可:
函数功能:获取值
返回值:无
形参:x,y的地址(地址传递)
*/
void getdata(u32 *x,u32 *y)
{
scanf("%d %d",x,y);
}
/*
函数功能:对应位子(x,y)写入数据
返回值:无
形参:x,y的坐标,who:对应玩家
*/
void putdata(u32 x,u32 y,u32 who)
{
chess[x][y] = who;
}
③判断输入的数据多对应的位置上是否可以下棋其中包括检测此位置是否为空及是否超出下棋的有效位置
/*
函数功能:检测(x,y)是否为空
返回值:1表示没有棋子,0表示有棋子
形参:x,y的坐标
*/
u8 kong(u32 x,u32 y)
{
if(chess[x][y] == 0)
{
return 1;
}
printf("此处有棋,请重新下棋!n");
return 0;
}
/*
函数功能:检测(x,y)是否越界并且为空可以输入
返回值:1表示没有,0表示越界
形参:x,y的坐标
*/
u8 check_out(u32 x,u32 y)
{
if(x<0 || x>7 || y<0 || y>7)
{
return 0;
}
if(kong() == 1)
{
return 1;
}
return 0;
}
④判断五个棋子相连的情况
分别判断四个方向中其中有一个方向连成5子
/*
函数功能:检测5子相连
返回值:1表示有5子相连,0表示没有
形参:x,y的坐标
*/
u8 check_five(u32 x,u32 y) //x,y 0,0
{
u32 x_next,y_next;
u8 i,j;
u32 who;
u8 num = 1;
u32 dirx[4]={0,1,1,1}; //对应四个方向下,右,右下,右上
u32 diry[4]={1,0,1,-1};
who = chess[x][y]; //将值传入给who给后边判断玩家i
if(who == 0) //判断对应坐标是否为0,
{
return 0; //不需要检测
}
for(i=0;i<4;i++) //四个方向
{
num = 1;
x_next = x; //下一个子=前一个往某方向偏移
y_next = y;
for(j=1;j
{
x_next += dirx; //下一个子=前一个往某方向偏移
y_next += diry;
if(chess[x_next][y_next] == who)
{
num++;
}
}
if(num == FIVE) //判断是否已连成五子
{
printf("玩家%d胜利,胜利方向dir->%dn",who,i);
return 1;
}
}
return 0;
}
⑤检测胜利
/*
函数功能:检测胜利
返回值:1表示有人胜利,0表示没有
形参:无
*/
u8 check_win()
{
u32 x,y;
for(x=0;x
{
for(y=0;y
{
if(check_five(x,y) == 1)
{
return 1;
}
}
}
return 0;
}
⑥整合代买
/*
函数功能:函数汇总
返回值:结果
形参:无
*/
u32 fiveplay(void)
{
u32 x,y;
u32 step = 0 ;
u32 who;
char ch;
printf("亲爱的玩家!您准备好了吗?请按任意键继续!n");
getchar();
showmenu();
printf("您可以输入x y的值落下对应位子的棋子,如1 1n");
while(1)
{
who = step %2 + 1;
printf("玩家%d请下棋:",who);
getdata(&x,&y);
if(check_out(x,y))
{
putdata(x,y,who);
clear;
showmenu();
step++;
if(win())
{
printf("祝贺玩家%d取得胜利n",who);
scanf("%c",&ch);
if(ch == 'N')
{
return ;
}
else
{
chess[HANG][LIE]
}
}
}
else
{
printf("%d %d这个位子不允许下棋,请重新输入!nn",x,y);
}
}
}
更多交流私我呀132-60-56-2029
|