三子棋------小游戏c语言实现(超清晰逻辑)

今天用c语言来实现一个简单有趣的小游戏————三子棋

三子棋的规则应该都不陌生吧 -_- .......
我一步,你(电脑)一步,无论是谁,每下完一步,就判断是否有三颗棋子在一条直线上,若在,则谁WIN!!
这句话有待会写代码的逻辑思路哟!!

好啦,现在开始着手如何实现整个代码    0.0   --------  0.0

该程序分三个文件来完成    test.c(存放main函数)     game.c(存放各种游戏函数)       game.h(存放函数声明等)

先分析一下逻辑:
一:玩一个游戏,肯定得放在一个循环里,玩完一次又来一次,知道选择退出为止>>>>>>
所以我们在main函数里提供一个循环,进入循环就选择输入菜单,决定是否进入游戏,选择游戏开始则进入playgame()函数,选择退出就退出这个循环,程序结束。这里我们要保证main函数里的简洁性,现在,main函数就搭建好了----------代码1---------test.c

int main()
{
	srand((unsigned int)time(NULL)); //产生随机数种子
	int key = 0;
	do
	{
		menu();
		scanf("%d", &key);
		if (key)
		{
			playgame();
		}
		else
		{
			printf("游戏结束\n");
			break;
		}
	} while (key);
	return 0;
}

二:首先,我们需要提供一个游戏菜单--------------代码2--------game.c

void menu()
{
	printf("**************   欢迎光临  ******************\n");
	printf("**************** 请选择 *********************\n");
	printf("*****************1.开始游戏  ****************\n");
	printf("*****************0.结束游戏  ****************\n");
}

三:进入游戏后,得打印一个棋盘吧,这就得思考一下了,棋盘用什么打印呢?待会棋盘还得放棋子呢,到底如何创建棋盘呢。嘿嘿,这里就得用到我们的二维数组了,想一想很nice吧!!创建棋盘二维数组后,则应该初始化吧(全初始化为空格),则需要一个初始化函数-------------代码三-------game.c
memset为一个提供内存初始化的库函数,需引入头文件string.h

void arr_init(char arr[ROW][CLO], int row, int clo)
{
	memset(&arr[0][0],' ',row*clo*sizeof(arr[0][0]));
}

四:棋盘创建好了得打印出来吧,so,打印棋盘为一个函数-----------------代码4-------game.c

void print(char arr[ROW][CLO], int row, int clo)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < clo; j++)
		{
			printf(" %c ", arr[i][j]);
			if (j <(clo - 1))
			{
				printf("|");
			}
		}

		printf("\n");

		for (j = 0; j < clo; j++)
		{
			printf("---");
			if (j <(clo - 1))
			{
				printf("|");
			}
		}
		printf("\n");
	}
	printf("\n");
}

五:每下一部棋之前,我们是不是得判断棋盘是否已经满了,若满了,则游戏结束,为平局,所以需要一个判断是否满盘的函数--------代码五------test.c

int judge_full(char arr[ROW][CLO],int row, int clo)
{
	int i = 0;
	int j = 0;
	int num = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < clo; j++)
		{
			if (arr[row][clo] == ' ')
			{
				num++;
				break;
			}
		}
	}
	if (num > 0)
		return 1;
	else
		return 0;
}

六:判断完是否满盘后,若游戏没结束,则该玩家下棋啦,则需要一个玩家下棋的函数----------代码六--------test.c

void play_man(char arr[ROW][CLO])
{
	int row = 0;
	int clo = 0;
	do
	{
		printf("请输入你要下的行和列:\n");
		scanf("%d%d", &row, &clo);
		if (row > 3 || clo > 3 || row < 0 || clo < 0)
		{
			printf("输入有误,请重新输入\n");
			continue;
		}
		else if (arr[row-1][clo-1] != ' ')    //坑二,不要写成arr[row][clo];
		{
			printf("这里有棋了,请重新输入\n");
			continue;
		}
		else
		{
			arr[row - 1][clo - 1] = '0';
			break;
		}

	} while (1);
	
}

七:玩家下完棋,是不是得判断是否赢了(此时也得判断是否盘满),若赢了,则游戏结束,若没赢,游戏继续,所以需要一个判断是否赢的函数---------代码七--------test.c

int judge(char arr[ROW][CLO])
{
	int i = 0;
	for (i = 0; i < 3; i++)   //检测行
	{
		if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]) && (arr[i][2] != ' '))
		{
			return 1;
		}
	}

	for (i = 0; i < 3; i++)   //检测列
	{
		if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) && (arr[2][i] != ' '))
		{
			return 1;
		}
	}

	if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]) && (arr[0][0] != ' '))
	{
		return 1;
	}
	if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]) && ((arr[0][2] != ' ')))
	{
		return 1;
	}
	return 0;
}

八:若游戏没有结束,是不是得有一个电脑下棋的函数,此时则需要引入随机数的生成来完成电脑的下棋步骤---------代码八------------test.c

void play_computer(char arr[ROW][CLO])
{
	while (1)
	{
		int row = rand() % 3;
		int clo = rand() % 3;
		if (arr[row][clo] == ' ')
		{
			arr[row][clo] = '1';
			break;
		}
	}
}

九:(重点)上面二到八介绍了每一个步骤所需要的函数模块,此时,我们需要写一个playgame()函数来将二到八所有代码衔接到一起,来完成:
                                                                                while(1)
<><><><><>打印棋盘------判断满盘------玩家输入------判断输赢、判断满盘-----电脑输入------判断输赢<><><><><><>
                                                                            这样一个大循环
同样放入game.c文件中

void playgame()
{
	char arr[ROW][CLO] = { 0 };  
	arr_init(arr,ROW,CLO);
	int flag = 0;
	print(arr, 3, 3);
	while (1)
	{
		if (judge_full(arr, 3, 3))
		{
			printf("平局\n");
			break;
		}

		play_man(arr);
		print(arr, 3, 3);
		flag = judge(arr);
		if (flag)
		{
			printf("玩家赢\n");
			break;
		}

		else if (judge_full(arr, 3, 3))
		{
			printf("平局\n");
			break;
		}

		play_computer(arr);
		Sleep(2000);
		print(arr, 3, 3);
		flag = judge(arr);
		if (flag)
		{
			printf("电脑赢\n");
			break;
		}
			
	}
}

最后,完成game.h头文件,提供每个函数的原型(声名)

#include<stdio.h>
#include<Windows.h>
#include<string.h>
#define ROW 3
#define CLO 3
void playgame();
void arr_init(char arr[ROW][CLO], int row, int clo);
void print(char arr[ROW][CLO], int row, int clo);       //打印棋盘
void menu();                                            //打印菜单
void play_man(char arr[ROW][CLO]);                      //人类下棋
int judge(char arr[ROW][CLO]);                          //判断输赢
void play_computer(char arr[ROW][CLO]);                 //电脑下棋           都可以写成char arr[][3],但不能写成char arr[][];
int judge_full(char arr[ROW][CLO], int row, int clo);   //判断棋盘是否已满

嘿,大功告成,三子棋小游戏基础版ok啦!!!!
嘿,当然有人会想这要是我来玩一局,那不稳赢嘛,呵呵,所以电脑下棋那一块可以自己去添加一些小算法,形成简单、中等、困难多种模式!!这里就不再去一一分析了,下一章将引入

猜你喜欢

转载自blog.csdn.net/eternal_yangyun/article/details/83217541