今天分享一波用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;
	}
	//白子置为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();
}

 

Logo

更多推荐