三子棋的实现--详解

目录

 游戏第一步:初始化棋盘​编辑

游戏第二步:打印棋盘

游戏第三步:玩家走

游戏第四步:电脑走

游戏第五步:判断输赢


实现类型三子棋这种代码比较多的小游戏,建议采用模块化实现,所以我们首先创建两个.c文件和一个.h文件

 创建完成之后,分别对两个.c文件包含头文件,这样子在头文件中直接包含各类C语言自带头文件时两个.c文件都可以使用,可以减少繁琐包含。

 创建完之后,就可以在test.c中开始我们的游戏实现了。

因为我们是要玩一次不过瘾时可以继续玩的,对于这种情况我们可以运用do.....while();循环语句实现。

开始游戏之时,我们需要先打印一个简单的菜单供玩家选择,然后根据玩家选择的数字进行判断,这里用input去接受1和0,这样子可以把input直接放在switch()和while()里面进行判断。 

写这种代码量比较大的文件,最忌从头写到尾中间不去一步步检查,写完一个步骤之后就进行一次检查可以避免发生多错误和方便更改错误。

 当检查无错时就可以开始实现我们的小游戏了。

我们把函数的主要功能放在game()函数里,然后函数的主要内容放在game.c里面实现,函数声明则在game.h里面实现。

 

这是我们要打印的菜单,可以看出其实就是一个二维数组通过打印空格和打印---|这种方式实现的,所以首先要创建一个二维数组,并对这个棋盘进行初始化。 

我们可以通过两个宏定义行和列,这样子以后我们想修改其他行数列数时可以从这里修改就可以修改整个游戏了。

 游戏第一步:初始化棋盘

游戏第二步:打印棋盘

 

分析一下棋盘的打印:看图,我们可以把打印分为两部分,一部分是打印数据,也就是"空格数据空格"+ "|";一部分是打印分割线:"---"+"|",由这两部分组成,该打印有多种方法,以上方法通用于各种行列棋盘的打印。

游戏第三步:玩家走

对于该步骤,我们都让玩家输入坐标并判断坐标是否合法且该位置不能被占用,否则就重新选择坐标。

 注意:我们程序员都知道数组下标从0开始,但是玩家不一定是程序员,所以输入坐标的时候要减一。

这样子可以在玩家和电脑每走一步就把棋盘打印出来。

因为我们是玩家和电脑下完一步之后继续下下一步的,所以这应该是一个循环。

游戏第四步:电脑走

玩家走的这一步,需要电脑自成随机数,这个时候可以用我们的rand()函数去形成随机数,使用rand()函数的时候,还需要运用srand()这个函数作为前提,具体在这里不阐述, 需要应用<stdlib.h>以及<time.h>两个源文件。

游戏第五步:判断输赢

判断输赢,对于三子棋来说,就是列全部相等,行全部相等或者对角线相等,而判断的结果有三种,分别是玩家赢,电脑赢,平局。

以下是判断的代码。

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;
		}
	}
	return 1;
}
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	//判断输赢
	//行
	for (i = 0; i < row; i++)
	{
		int tmp = 0;
		int ret = tmp;

		while ((board[i][ret] == board[i][tmp]) && (board[i][ret] != ' '))
		{
			ret = tmp;
			tmp++;
			if (ret == col - 1)
			{
				return board[i][ret];
			}
		}
	}
	//列
	for (i = 0; i < col; i++)
	{
		int tmp = 0;
		int ret = tmp;

		while ((board[ret][i] == board[tmp][i]) && (board[ret][i] != ' '))
		{
			ret = tmp;
			tmp++;
			if (ret == row - 1)
			{
				return board[ret][i];
			}
		}
	}
	//对角线
	int tmp = 0;
	int ret = tmp;
	while ((board[ret][ret] == board[tmp][tmp]) && (board[ret][ret] != ' '))
	{
		ret = tmp;
		tmp++;
		if (ret == col - 1)
		{
			return board[ret][ret];
		}
	}
	ret = row - 1;
	tmp = 0;
	int tmp_vry1 = ret;
	int tmp_vry2 = tmp;
	while ((board[tmp_vry1][tmp_vry2] == board[ret][tmp]) && (board[tmp_vry1][tmp_vry2] != ' '))
	{
		tmp_vry1 = ret;
		tmp_vry2 = tmp;
		ret--;
		tmp++;
		if (tmp_vry1 == 0)
		{
			return board[tmp_vry1][tmp_vry2];
		}
	}
	//if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')

	//平局
	if (IsFull(board, row, col) == 1)
	{
		return 'Q';
	}
	return 'C';

}

game()函数的代码如下。

void game()
{
	char board[ROW][COL] = { 0 };
	int ret = 0;
	//初始化棋盘
	Initboard(board, ROW, COL);
	Dispaly(board, ROW, COL);
	while (1)
	{
		//玩家下棋
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	if (ret == '#')
		printf("电脑赢\n");
	if (ret == 'Q')
		printf("平局\n");
}

本文是自己对三子棋的理解,如若读者看了哪个地方不能理解,可以私聊我,有问必回!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值