今天分享一波用C语言在Linux环境中编写五子棋程序的代码。
首先,实现五子棋,分为两个部分:
需要的数据:
1、定义棋盘数组
2、定义变量用于记录棋子位置
3、定义角色变量
业务逻辑:
是否需要对数据进行初始化
for(;;)
{
1、清理屏幕,显示棋盘
2、落子
坐标要合法,原位置不能有棋子
3、检查是否形成五子
4、切换角色
}
其中最重要的一环则是输赢判断,当判定一方获胜时,结束游戏,将数组置零,写入文件,然后结束游戏。
判定输赢的逻辑为,遍历一边二维数组,找出被赋了非零值的数组项,判定他相邻两格内有无被赋予相同值的数组项,有则记录加1,无则继续遍历。其中相邻记录分为:横(across)、竖(through),和斜(slant_r和slant_l)。遍历结束后这三项任一项数据大于等于1时,判定成功,游戏结束。具体代码稍显过长但简单易懂:
//判定是否获胜
int across_w = 0,across_b = 0;
int through_w = 0,through_b=0;
int slant_r_w = 0,slant_r_b=0;
int slant_l_w = 0,slant_l_b=0;
for(int i = 0; i<15; i++)
{
for(int j =0; j<15;j++)
{
//判定白子获胜
if(1 == arr[i][j])
{
(i>0 && i<15)&&( 1==arr[i][j-1]&&1 == arr[i][j+1]&&1 == arr[i][j+2]&&1 == arr[i][j-2])&& across_w++;
(j>0 && j<15)&&(1==arr[i-1][j]&&1 == arr[i+1][j]&&1 == arr[i+2][j]&&1 == arr[i-2][j]) && through_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j-1]&&1 == arr[i+1][j+1]&&1 == arr[i+2][j+2]&&1 == arr[i-2][j-2]) && slant_r_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j+1]&&1 == arr[i+1][j-1]&&1 == arr[i-2][j+2]&&1 == arr[i+2][j-2]) && slant_l_w++;
}
//判定黑子获胜
if(2 == arr[i][j])
{
(i>0 && i<15)&&( 2==arr[i][j-1]&&2 == arr[i][j+1]&&2 == arr[i][j+2]&&2 == arr[i][j-2])&& across_b++;
(j>0 && j<15)&&(2==arr[i-1][j]&&2 == arr[i+1][j]&&2 == arr[i+2][j]&&2 == arr[i-2][j]) && through_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j-1]&&2 == arr[i+1][j+1]&&2 == arr[i+2][j+2]&&2 == arr[i-2][j-2]) && slant_r_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j+1]&&2 == arr[i+1][j-1]&&2 == arr[i-2][j+2]&&2 == arr[i+2][j-2]) && slant_l_b++;
}
}
}
printf("黑%d%d%d%d白%d%d%d%d",across_b,through_b,slant_l_b,slant_r_b,across_w,through_w,slant_r_w,slant_l_w);
if(across_b>=1 || through_b>=1 || slant_r_b>=1 || slant_l_b>1)
{
printf("黑子获胜!游戏结束!\n");
//exit_arr();
return 0;
}
if(across_w>=1 || through_w>=1 || slant_r_w>=1 || slant_l_w>=1)
{
printf("白子获胜!游戏结束!\n");
//exit_arr();
return 0;
}
棋盘显示和光标移动部分:
void show_arr(void)
{
system("clear");
for(int i= 0; i<15; i++)
{
printf("-----------------------------------------------------------------------------\n");
for(int j= 0; j<15; j++)
{
if(arr[i][j])
{
if(2 == arr[i][j])
{
printf("| B");
}
if(1 == arr[i][j])
{
printf("| W");
}
}
else
{
printf("| ");
}
}
printf("|\n");
}
printf("-----------------------------------------------------------------------------\n");
for(;;)
{
printf("\33[%d;%dH",(x+1)*2,(y+1)*5);
switch(getch())
{
case 183: x>0 && x--; break;
case 184: x<14 && x++; break;
case 185: y<14 && y++; break;
case 186: y>0 && y--; break;
case 10 : return;
}
}
}
整个程序代码:
#include
#include
#include
#include
int x = 7, y = 7;
int step = 1;
int arr[15][15];
//1、显示界面
void show_arr(void)
{
system("clear");
for(int i= 0; i<15; i++)
{
printf("-----------------------------------------------------------------------------\n");
for(int j= 0; j<15; j++)
{
if(arr[i][j])
{
if(2 == arr[i][j])
{
printf("| B");
}
if(1 == arr[i][j])
{
printf("| W");
}
}
else
{
printf("| ");
}
}
printf("|\n");
}
printf("-----------------------------------------------------------------------------\n");
for(;;)
{
printf("\33[%d;%dH",(x+1)*2,(y+1)*5);
switch(getch())
{
case 183: x>0 && x--; break;
case 184: x<14 && x++; break;
case 185: y<14 && y++; break;
case 186: y>0 && y--; break;
case 10 : return;
}
}
}
//判定黑棋还是白棋
void is_WB(void)
{
if(0 != arr[x][y])
{
printf("落子失败!\n");
return;
}
//白子置为1
if(0 == step%2)
{
arr[x][y] = 1;
step ++;
}
//黑子置为2
else
{
arr[x][y] =2;
step++;
}
}
//加载数据
void start_arr(void)
{
FILE* frp = fopen("wuziqi.bin", "r");
if(NULL == frp)
{
printf("加载数据失败!\n");
return ;
}
fread(arr,4,225,frp);
fclose(frp);
}
//保存数据
void exit_arr(void)
{
FILE* fwp = fopen("wuziqi.bin","w");
if(NULL == fwp)
{
printf("保存数据失败!\n");
}
fwrite(arr,4,225,fwp);
fclose(fwp);
}
//主函数
int main()
{
//start_arr();
for(;;)
{
show_arr();
is_WB();
//判定是否获胜
int across_w = 0,across_b = 0;
int through_w = 0,through_b=0;
int slant_r_w = 0,slant_r_b=0;
int slant_l_w = 0,slant_l_b=0;
for(int i = 0; i<15; i++)
{
for(int j =0; j<15;j++)
{
//判定白子获胜
if(1 == arr[i][j])
{
(i>0 && i<15)&&( 1==arr[i][j-1]&&1 == arr[i][j+1]&&1 == arr[i][j+2]&&1 == arr[i][j-2])&& across_w++;
(j>0 && j<15)&&(1==arr[i-1][j]&&1 == arr[i+1][j]&&1 == arr[i+2][j]&&1 == arr[i-2][j]) && through_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j-1]&&1 == arr[i+1][j+1]&&1 == arr[i+2][j+2]&&1 == arr[i-2][j-2]) && slant_r_w++;
(i>0 && i<15 && j>0 && j<15)&&(1 == arr[i-1][j+1]&&1 == arr[i+1][j-1]&&1 == arr[i-2][j+2]&&1 == arr[i+2][j-2]) && slant_l_w++;
}
//判定黑子获胜
if(2 == arr[i][j])
{
(i>0 && i<15)&&( 2==arr[i][j-1]&&2 == arr[i][j+1]&&2 == arr[i][j+2]&&2 == arr[i][j-2])&& across_b++;
(j>0 && j<15)&&(2==arr[i-1][j]&&2 == arr[i+1][j]&&2 == arr[i+2][j]&&2 == arr[i-2][j]) && through_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j-1]&&2 == arr[i+1][j+1]&&2 == arr[i+2][j+2]&&2 == arr[i-2][j-2]) && slant_r_b++;
(i>0 && i<15 && j>0 && j<15)&&(2 == arr[i-1][j+1]&&2 == arr[i+1][j-1]&&2 == arr[i-2][j+2]&&2 == arr[i+2][j-2]) && slant_l_b++;
}
}
}
printf("黑%d%d%d%d白%d%d%d%d",across_b,through_b,slant_l_b,slant_r_b,across_w,through_w,slant_r_w,slant_l_w);
if(across_b>=1 || through_b>=1 || slant_r_b>=1 || slant_l_b>1)
{
printf("黑子获胜!游戏结束!\n");
//exit_arr();
return 0;
}
if(across_w>=1 || through_w>=1 || slant_r_w>=1 || slant_l_w>=1)
{
printf("白子获胜!游戏结束!\n");
//exit_arr();
return 0;
}
}
exit_arr();
}