需要的数据:
1、定义棋盘:二维数组 15*15 空位置 *
2、定义棋子角色:白棋‘#’,黑棋‘$’
3、定义一个变量记录下棋位置
业务逻辑:(实现成一个个函数)
是否需要初始化
for(;;) //死循环
{
1、清理屏幕,打印棋盘
2、落子
坐标要合法,该位置不能有棋子,否则继续落子
3、判断是否五子连珠
4、交换角色
}
具体代码如下
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//定义棋盘
char board[15][15];
//定义棋子角色
char role ='@';
//棋子落子坐标
char x=7,y=7;
void init_board(void)
{
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
board[i][j] = '*';
}
}
void show_board(void)
{
system("clear");
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
printf(" %c",board[i][j]);
printf("\n");
}
}
void get_key()
{
for(;;)
{
printf("请输入%c棋子坐标\n",role);
scanf("%hhd%hhd",&x,&y);
//检查是否合法
if(x>14||x<0||y>14||y<0)
{
printf("坐标不合法,请重新输入\n");
continue;
}
//检查该位置是否已经有棋子
if('*'!=board[x][y])
{
printf("此位置已有棋子,请重新输入\n");
continue;
}
board[x][y]=role;
return;
}
}
bool is_win(void)
{
int cnt=0;
//上下
for(int i=x-1,j=y;i>=0&&j>=0;i--)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
for(int i=x+1,j=y;i<15&&j<15;i++)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
if(cnt>=4)
return true;
cnt=0;
//左右
for(int i=x,j=y-1;i>=0&&j>=0;j--)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
for(int i=x,j=y+1;i<15&&j<15;j++)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
if(cnt>=4)
return true;
cnt=0;
//左上右下
for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
for(int i=x+1,j=y+1;i<15&&j<15;i++,j++)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
if(cnt>=4)
return true;
cnt=0;
//左下右上
for(int i=x-1,j=y+1;i>=0&&j<15;i--,j++)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
for(int i=x+1,j=y-1;i<15&&j>=0;i++,j--)
{
if(board[i][j]==board[x][y])
cnt++;
else
break;
}
if(cnt>=4)
return true;
cnt=0;
return false;
}
int main(int argc,const char* argv[])
{
//初始化棋盘
init_board();
for(int i=0;i<225;i++)
{
//清屏,打印棋盘
show_board();
//落子
get_key();
//判断是否五子连珠
if(is_win())
{
show_board();
printf("游戏结束,%c赢了\n",role);
return 0;
}
//交换角色
role=role=='@'?'$':'@';
}
}
运行结果如下