【入门级C语言小游戏】——“三子棋(1)


2·棋盘的展现

在完成棋盘的初始化操作后,我们需要将初始化后的棋盘展现出来,以便玩家进一步的游戏。

在这里,我们使用**“BoardDisplay()”**这一函数来进行实现。

代码如下:

DisplayBoard(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++)
		{
			printf(" %c ", board[i][j]);
			if(j < col - 1)
			printf("|");
		}
		printf("\n");
		//打印分割行
		if (i < col - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}
}

运行效果:

tips:为了提高代码的健壮性,我们使用了全局变量 ROW 和 COL 来进行操作,通过改变这两个全局变量的值就可以操作棋盘的格局,方便了日后的进一步优化改进,提高游戏可操作性。


3·玩家下棋

接下来我们来实现玩家下棋这一功能。

为了完成这一功能,我们需要注意以下几点:

  1. 接收玩家所输入的地址位置(我们所判断的数组元素应该是玩家输入值-1
  2. 判断玩家所输入的地址所在是否已有落子
  3. 将玩家的棋子落入对应地

代码实现:

PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家走:>");

	int x = 0;
	int y = 0;
	printf("请输入坐标:>");
	scanf("%d %d", &x, &y);
	if (x >= 1 && x <= row && y >= 1 && y <= col)
	{
		if (board[x - 1][y - 1] == ' ')
		{
			board[x - 1][y - 1] = '*';
		}
		else
		{
			printf("坐标被占用,请重新输入\n");
		}
	}
	else
	{
		printf("坐标非法,超出范围");
	}
}

运行截图如下 :


4·电脑自动下棋

在实现电脑自动下棋这一功能时,我们需要创建随机数,这就需要调用以下头文件:

  1. <stdlib.h>
  2. <time.h>

同时,我们还需要使用:

  1. srand((unsigned int)time(NULL)); 来进行初始化
  2. x = rand() % row;
    y = rand() %  col;     来进行创建坐标的随机数

当然,与玩家下棋相一致,我们也需要判断电脑所下的地址是否被占用,以及将棋子落下

代码实现如下:

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走:>\n");

	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

运行截图如下:


5·游戏胜负的判断

在我们下棋的过程中,由于规则的特殊性,我们需要在玩家和电脑下的每一步后都对比赛的结果进行判断,确保程序的逻辑正确性。

在这里,我们使用Iswin()函数来实现这一功能。

在这一函数中,我们需要实现以下几个逻辑:

  1. 要返回四种不同的状态
  2. 玩家赢     -->  返回**‘*’**
  3. 电脑赢     -->  返回**‘#’**
  4. 平局         -->  返回**‘Q’**
  5. 游戏继续  -->  返回’C’

首先我们要确立判断函数再整个游戏主体中的位置和作用,逻辑如下:

void game()
{
	//三子棋的过程
	char board[ROW][COL];   //棋盘数组的创建
	InitBoard(board,ROW,COL);

	//打印棋盘
	DisplayBoard(board, ROW, COL);

	char ret = 0;
	//下棋
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Iswin(board,ROW,COL);
		if (ret != 'C'
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		if (ret != 'C'
		{
			break;
		}
		else if (ret == '*')
		{
			printf("玩家赢\n");
		}
		else if(ret == '#')
		{
			printf("电脑赢\n");
		}
		else
		{
			printf("平局\n");
		}
		
	}

我们在实现Iswin()这一函数时,需要注意以下几点:

  1. 判断行
  2. 判断列
  3. 判断对角线
  4. 判断棋盘是否已经放满   – >  确认游戏是否继续(需要一个Is_full()函数来实现这一功能)

以下是Iswin()函数的实现

char Iswin(char board[ROW][COL], int row, int col)
{
	//1,判断输赢

	//2,判断平局

	//3,游戏继续

	//行
	int i = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' ')
		{
			return board[i][0];
		}
	}

	//列
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
		{
			return board[0][i];
		}
	}

	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];

	//判断平局
	if (Is_full(board, row, col) == 1)
	{
		return 'Q';
	}

	return 'C';
}

接着是Is_full()函数的实现

Is_full(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;     //棋盘未满
		}
	}
	return 1;   //棋盘慢

}

最后是游戏整体逻辑的实现:

void game()
{
	//三子棋的过程
	char board[ROW][COL];   //棋盘数组的创建
	InitBoard(board,ROW,COL);

	//打印棋盘
	DisplayBoard(board, ROW, COL);

	char ret = 0;
	//下棋
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);


# 最后

![腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行](https://img-blog.csdnimg.cn/img_convert/6028323752075cb1a5cfca7682238604.webp?x-oss-process=image/format,png)

![腾讯T3大牛总结的500页MySQL实战笔记意外爆火,P8看了直呼内行](https://img-blog.csdnimg.cn/img_convert/2e1a429c8eed714892e53209bdee26f6.webp?x-oss-process=image/format,png)

/打印棋盘
	DisplayBoard(board, ROW, COL);

	char ret = 0;
	//下棋
	while (1)
	{
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		ret = Iswin(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);


# 最后

[外链图片转存中...(img-BLNbwM2J-1714523008078)]

[外链图片转存中...(img-NBUxIMHF-1714523008078)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值