五子棋:
分析数据:
char board的棋盘[][];棋盘
char key_x,key_y;接受棋子坐标。
char role;记录角色‘@’,‘#’。
业务逻辑:
1.初始化棋盘,所有位置赋值位‘*’;
2.清理屏幕,显示棋盘。
(可以在判断是否五子语句中加入清屏解决最终棋盘没有五子的情况)
3.输入棋子坐标,
检查坐标是否合法,这个位置是否已经有棋子。
4.检查是否形成五子(可以由下子的这个棋子开始对8个方位进行判断,相同的直线合起来计算是否5子)
5.切换角色
利用三目运算符可达到需求1?2:3;(如果1正确则为2反之则为3)
printf("\33[%hhd;%hhdH",x,y);设置光标位置(其中要注意的为设置棋盘时会有空格所以x,y坐标设置需要变化)
#include<getch.h>
getch()
一般用
while(true)
{
switch(getch())
{
case 183(向上):......;break;
case 184(向下):......;break;
case 185(向右):......;break;
case 186(向左):......;break;
case 10(空格):.......
...........
return
}
}

include<stdio.h>

include<stdlib.h>

include<getch.h>

include<stdbool.h>

void make_board(void);
void board_clear(void);
void go_role(void);
bool jiesu(void);
char board[15][15];
char key_x=7,key_y=7;
char role='@';
int main()
{
make_board();
while(true)
{
board_clear();
go_role();
if(jiesu())
{
board_clear();
printf("%c获得胜利,游戏结束",role);
break;
}
role=role=='@'?'#':'@';
}
}
void make_board(void)
{
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
board[i][j]='*';
}
}
}
void board_clear(void)
{
system("clear");
for(int i=0;i<15;i++)
{
for(int j=0;j<15;j++)
{
printf(" %c",board[i][j]);
}
printf("\n");
}

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

}
void go_role(void)
{
printf("...........请%c落子",role);
while(true)
{
printf("\33[%hhd;%hhdH",key_x+1,(key_y+1)2);
switch(getch())
{
case 183 :key_x>0&&key_x--;break;
case 184 :key_x<14&&key_x++;break;
case 185 :key_y<14&&key_y++;break;
case 186 :key_y>0&&key_y--;break;
case 10 :
if(board[key_x][key_y]=='
')
{
board[key_x][key_y]=role;
return;
}
}
}
}
bool jiesu(void)
{
int cut=0;
for(int x=key_x-1,y=key_y-1;x>=0&&y>=0;x--&&y--)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
for(int x=key_x+1,y=key_y+1;x<15&&y<15;x++&&y++)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
if(cut>=4)
{
return true;
}
else
{
cut=0;
}

for(int x=key_x-1,y=key_y+1;x>=0&&y<15;x--&&y++)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
for(int x=key_x+1,y=key_y-1;x<15&&y>=0;x++&&y--)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
if(cut>=4)
{
return true;
}
else
{
cut=0;
}

for(int x=key_x-1,y=key_y;x>=0;x--)

{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
for(int x=key_x+1,y=key_y;x<15;x++)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
if(cut>=4)
{
return true;
}
else
{
cut=0;
}

for(int x=key_x,y=key_y-1;y>=0;y--)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
for(int x=key_x,y=key_y+1;y<15;y++)
{
if(board[key_x][key_y]==board[x][y])
{
cut++;
}
else
{
break;
}
}
if(cut>=4)
{
return true;
}
else
{
cut=0;
return false;
}

}
判断是否五子可以通过将上述代码封装为函数
将各个方向由文字转换为数字便是1,-1.由此可以得到将方向转化为数字输入后可以减少代码量
由于要返回cut的数所以需要返回值
int count(int i,int j)
{
for(int x=key_x+i,y=key_y+j;x>=0&&x<15&&y>=0;y<15;i+=i,j+=j)
{
if(board[x][y]==board[key_x][key_y])
{
cut++;
}
else
{
return cut;//(当不为时说明已经断了就没有必要再继续循环了)
}

}
}
再接着上述的判断语句bool当得到的值大于4时记得到五子。

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄