当前位置: 代码迷 >> 综合 >> 【C语言编程】在Linux终端用C语言编程实现五子棋(附代码)
  详细解决方案

【C语言编程】在Linux终端用C语言编程实现五子棋(附代码)

热度:45   发布时间:2024-01-29 03:00:41.0

        今天分享一波用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 <stdio.h>
#include <stdlib.h>
#include <getch.h>
#include <stdbool.h>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;}//白子置为1if(0 == step%2){arr[x][y] = 1;step ++;}//黑子置为2else{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();
}