一、数据分析
定义15*15棋盘二维数组
定义角色变量 '@'黑棋 '$' 白棋 '*'空
定义变量 用于记录落子位置
二、逻辑分析
考虑是否需要初始化棋盘
for(;;)
{
1、清屏、打印棋盘
2、落子
判断是否超范围 如果是则提示非法并重新落子‘;
判断是否已有棋子,如果是则提示并重新落子;
成功落子才继续。
3、判断是否五子连珠
是:结束程序
4、交换角色
}
三、代码实现
3.1 基础版
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
//定义棋盘
char arr[15][15];
//定义角色变量
char num='@';
//定义落子位置
int x=0,y=0;
//显示棋盘
void show(void);
//开始下棋
void begin(void);
//是否成功落子
bool is_down(void);
//是否五子连珠
bool is_end(void);
//横向连珠
bool x_row(void);
//纵向连珠
bool y_row(void);
//左斜连珠
bool l_xy(void);
//右斜连珠
bool r_xy(void);
int main()
{
//初始化棋盘
for(int i=0; i<15; i++)
{
for(int j=0; j<15; j++)
{
arr[i][j]='*';
}
}
int flag=-1; //换人下棋标志位
//下棋循环
while(1)
{
//显示棋盘
show();
//开始下棋
begin();
//五子连珠
if(is_end())
{
show();
printf("恭喜%c获胜!\n",num);
return 0;
}
//换人下棋
flag=-flag;
if(flag>0)
{
num='$';
}
else
{
num='@';
}
}
}
//显示棋盘
void show(void)
{
system("clear");
printf(" ");
for(int i=0; i<15; i++)
{
printf("%2d ",i);
}
printf("\n");
for(int i=0; i<15; i++)
{
printf("%2d ",i);
for(int j=0; j<15; j++)
{
printf("%2c ",arr[i][j]);
}
printf("\n");
}
}
//开始下棋
void begin(void)
{
printf("请%c输入棋子位置:",num);
scanf("%d%d",&x,&y);
while(!is_down())
{
printf("该位置有误,请%c重新输入:",num);
scanf("%d%d",&x,&y);
}
arr[x][y]=num;
}
//是否成功落子
bool is_down(void)
{
if(x<0||x>=15||y<0||y>=15)
{
return false;
}
if(arr[x][y]!='*')
{
return false;
}
return true;
}
//是否五子连珠
bool is_end(void)
{
if(x_row()||y_row()||l_xy()||r_xy())
{
return true;
}
else
{
return false;
}
}
//横向连珠
bool x_row(void)
{
int sum=0;
for(int i=0;i<15;i++)
{
if(arr[x][i]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
}
return false;
}
//纵向连珠
bool y_row(void)
{
int sum=0;
for(int i=0;i<15;i++)
{
if(arr[i][y]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
}
return false;
}
//左斜连珠
bool l_xy(void)
{
int sum=0;
int x_i=x>y?x-y:0;
int y_i=x<y?y-x:0;
for(int i=x_i,j=y_i;i<15&&j<15;)
{
if(arr[i][j]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
i++;
j++;
}
return false;
}
//右斜连珠
bool r_xy(void)
{
int sum=0;
int x_i=14-x>=y?x+y:14;
int y_i=14-x<=y?y-14+x:0;
for(int i=x_i,j=y_i;i<15&&j<15;)
{
if(arr[i][j]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
i--;j++;
}
return false;
}
3.2改进版
由于基础版的设计需要用户输入坐标,非常不方便,因此寻思考虑使用方向键,直接到达下棋位置,按下回车即可下棋。注意:该代码运行仅使用在linux系统下,getch.h头文件内容可前往此处查看。
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <getch.h>
//定义棋盘
char arr[15][15];
//定义角色变量
char num='@';
//定义落子位置
int x=0,y=0;
//换人下棋标志位
int flag=-1;
//显示棋盘
void show(void);
//是否成功落子
bool is_down(void);
//是否五子连珠
bool is_end(void);
//横向连珠
bool x_row(void);
//纵向连珠
bool y_row(void);
//左斜连珠
bool l_xy(void);
//右斜连珠
bool r_xy(void);
int main()
{
//初始化棋盘
for(int i=0; i<15; i++)
{
for(int j=0; j<15; j++)
{
arr[i][j]='*';
}
}
//显示棋盘
show();
//下棋循环
while(1)
{
//开始下棋
printf("\33[%d;%dH",x+1,(y+1)*2);
switch(getch())
{
case 183:x>0 && x--;break;
case 184:x<14 && x++;break;
case 186:y>0 && y--;break;
case 185:y<14 && y++;break;
case 10:
printf("%c",num);
arr[x][y]=num;
//五子连珠
if(is_end())
{
printf("\33[16;0H");
printf("恭喜%c获胜!\n",num);
return 0;
}
flag=-flag;
//换人下棋
if(flag>0)
{
num='$';
}
else
{
num='@';
}
}
}
}
//显示棋盘
void show(void)
{
system("clear");
for(int i=0; i<15; i++)
{
for(int j=0; j<15; j++)
{
printf(" %c",arr[i][j]);
}
printf("\n");
}
}
//是否成功落子
bool is_down(void)
{
if(x<0||x>=15||y<0||y>=15)
{
return false;
}
if(arr[x][y]!='*')
{
return false;
}
return true;
}
//是否五子连珠
bool is_end(void)
{
if(x_row()||y_row()||l_xy()||r_xy())
{
return true;
}
else
{
return false;
}
}
//横向连珠
bool x_row(void)
{
int sum=0;
for(int i=0;i<15;i++)
{
if(arr[x][i]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
}
return false;
}
//纵向连珠
bool y_row(void)
{
int sum=0;
for(int i=0;i<15;i++)
{
if(arr[i][y]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
}
return false;
}
//左斜连珠
bool l_xy(void)
{
int sum=0;
int x_i=x>y?x-y:0;
int y_i=x<y?y-x:0;
for(int i=x_i,j=y_i;i<15&&j<15;)
{
if(arr[i][j]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
i++;
j++;
}
return false;
}
//右斜连珠
bool r_xy(void)
{
int sum=0;
int x_i=14-x>=y?x+y:14;
int y_i=14-x<=y?y-14+x:0;
for(int i=x_i,j=y_i;i<15&&j<15;)
{
if(arr[i][j]==num)
{
sum++;
if(sum==5)
{
return true;
}
}
else
{
sum=0;
}
i--;j++;
}
return false;
}