C语言三子棋游戏详解(保姆级教学)

三子棋游戏演示

这里是b站视频的链接(本人上传的),因为在CSDN上上传视频有点麻烦。

C语言三子棋演示

三子棋设计思路

接下来将会分成三个文件来讲述,分别是
游戏头文件,游戏的逻辑运行思路源代码,和游戏函数代码

游戏逻辑运行思路源代码

#include "game.h"

void game()
{
	char arr[Line][Row] = { 0 };
	// 初始化棋盘
	Init_board(arr, Line, Row);
	// 打印棋盘
	Display_board(arr, Line, Row);
	while (1)
	{
		// 玩家下棋
		Player(arr, Line, Row);
		Display_board(arr, Line, Row);
		
		// 判断输赢
		If_win(arr, Line, Row);
		if (If_win(arr, Line, Row) == '*')
		{
			printf("玩家获胜\n");
			break;

		}
		else if(If_win(arr, Line, Row) == '#')
		{
			printf("电脑获胜\n");
			break;

		}
		else if(If_win(arr, Line, Row) == ' ')
		{
			printf("平局\n");
			break;

		}
		else
		{
			printf("游戏继续\n");
		}
		


		// 电脑下棋
		Computer(arr, Line, Row);
		Display_board(arr, Line, Row);
		
		// 判断输赢
		If_win(arr, Line, Row);
		if (If_win(arr, Line, Row) == '*')
		{
			printf("玩家获胜\n");
			break;

		}
		else if (If_win(arr, Line, Row) == '#')
		{
			printf("电脑获胜\n");
			break;

		}
		else if (If_win(arr, Line, Row) == ' ')
		{
			printf("平局\n");
			break;

		}
		else
		{
			printf("游戏继续\n");
		}

	}

}

int main()
{
	// 初始化变量
	
	int input = 1;

	do
	{	
		// 打印游戏菜单
		menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("进入游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);
		
	return 0;
}

游戏函数代码

  1. 初始化棋盘, 打印棋盘
    根据视频中可以看到,既然下棋就要先打印一个棋盘,并且里面要存入空格,这样的话,就可以方便后期将电脑和玩家的下的棋放入到里面。

当然,在初始化棋盘之前要打印一个游戏菜单

代码实现(初始化棋盘,打印棋盘)

// 初始化棋盘
void Init_board(char arr[Line][Row], int line, int row)
{
	int i = 0;
	for (i = 0; i < line; i++)
	{
		int j = 0;
		for (j = 0; j < row; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

// 打印棋盘
void Display_board(char arr[Line][Row], int line, int row) {
	int i = 0;
	for (i = 0; i < line; i++) {
		// 打印数据
		int j = 0;
		for (j = 0; j < row; j++) {
			printf(" %c ", arr[i][j]);
			if (j < row - 1) {
				printf("|");
			}
		}
		printf("\n");


		// 打印分割行
		if (i < line - 1) {
			int j = 0;
			for (j = 0; j < line; j++) {
				printf("---");
				if (j < row - 1) {
					printf("|");
				}

			}
			printf("\n");
		}
	}
}

对代码的一些注释和打印棋盘函数的说明:
Line表示行,头文件中宏定义为3,Row表示列,头文件中也宏定义为3
打印棋盘函数的说明:这样写的话,如果需要打印5行5列的棋盘或者是要改为更多行列的棋盘,就只需要在头文件中修改Line和Row的值就可以,不需要对源代码进行修改。

  1. 玩家下棋
    按照视频中的做法,首先玩家输入坐标,然后再赋到数组中去

当然,玩家需要输入正确的坐标,如果坐标错误就要提醒

代码实现

// 玩家下棋
void Player(char arr[Line][Row], int line, int row)
{
	while (1)
	{
		printf("玩家下棋:\n");
		int a = 0, b = 0;
		// 输入坐标
		scanf("%d %d", &a, &b);
	
		// 判断是否为空
	
		if (arr[a][b] != ' ' || ( (a < 0 || a > Line) || (b < 0 || b > Row) )   )
		{
			printf("输入错误\n");
		}
		else
		{
			arr[a][b] = '*';
			break;
		}
	}
	
}
  1. 电脑下棋
    与玩家下棋不同的地方:
    1.就是需要随机生成代码,所以就需要用到rand(具体用法这里就不再解释,在之前的文章中都有提到)
    2.需要判断该坐标是否已经被使用
    ** 代码实现**
// 电脑下棋
void Computer(char arr[Line][Row], int line, int row)
{
	printf("电脑下棋\n");
	while (1)
	{
		// 生成随机坐标
		srand((unsigned)time(NULL));
		line = rand() % Line;
		row = rand() % Row;

		//判断是否被占用

		if (arr[line][row] == ' ')
		{
			arr[line][row] = '#';
			break;
		}
	}
	
}
  1. 判断输赢

一共就四种情况
横着赢,竖着赢,对角线赢,平局(先给出前三种情况)

// 判断输赢
char If_win(char arr[Line][Row], int line, int row)
{
	int i = 0, j = 0;
	// 横着赢
	for (i = 0; i < Line; i++)
	{
		if (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2] && arr[i][j] != ' ')
		{
			return arr[i][j];
		}
	}
	
	// 竖着赢
	i = 0;
	for (j = 0; j < Row; j++)
	{
		if (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j] && arr[i][j] != ' ')
		{
			return arr[i][j];
		}
	}
	// 对角线赢
	if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ')
	{
		return arr[0][0];
	}
	else if (arr[2][0] == arr[1][1] && arr[2][0] == arr[0][2] && arr[2][2] != ' ')
	{
		return arr[2][2];
	}
	// 判断平局

}

相信也不难看懂,最后就是平局代码的实现。
平局就是棋盘所有的格子都满了,所以就需要一个判断是否棋盘满了的函数

// 判断是否满了
int If_full(char arr[Line][Row], int line, int row)
{
	int flag = 0;
	int i = 0, j = 0;
	for (i = 0; i < Line; i++)
	{
		for (j = 0; j < Row; j++)
		{
			if (arr[i][j] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
			}
		}
	}
	return flag;
}

相当于就是遍历一遍数组,然后判断是否满了。

** 代码实现**

// 判断是否满了
int If_full(char arr[Line][Row], int line, int row)
{
	int flag = 0;
	int i = 0, j = 0;
	for (i = 0; i < Line; i++)
	{
		for (j = 0; j < Row; j++)
		{
			if (arr[i][j] != ' ')
			{
				flag = 1;
			}
			else
			{
				flag = 0;
			}
		}
	}
	return flag;
}

// 判断输赢
char If_win(char arr[Line][Row], int line, int row)
{
	int i = 0, j = 0;
	// 横着赢
	for (i = 0; i < Line; i++)
	{
		if (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2] && arr[i][j] != ' ')
		{
			return arr[i][j];
		}
	}
	
	// 竖着赢
	i = 0;
	for (j = 0; j < Row; j++)
	{
		if (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j] && arr[i][j] != ' ')
		{
			return arr[i][j];
		}
	}
	// 对角线赢
	if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] != ' ')
	{
		return arr[0][0];
	}
	else if (arr[2][0] == arr[1][1] && arr[2][0] == arr[0][2] && arr[2][2] != ' ')
	{
		return arr[2][2];
	}
	// 判断平局
	if (If_full(arr, Line, Row))
	{
		return ' ';
	}
	return 0;
}

所以到了这里,发现三子棋对初学者并不难写,只是时间会耗费的多一点,最后给出头文件代码

游戏头文件

#define Line 3
#define Row 3

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 游戏菜单
void menu();

// 初始化棋盘
void Init_board(char arr[Line][Row], int, int);

// 打印棋盘
void Display_board(char arr[Line][Row], int, int);

// 玩家下棋
void Player(char arr[Line][Row], int, int);

// 电脑下棋
void Computer(char arr[Line][Row], int, int);

// 判断输赢
char If_win(char arr[Line][Row], int, int);

// 是否满了
int If_full(char arr[Line][Row], int, int);

最后想说的是,希望大家自己完完全全的写一遍,不要觉得麻烦,收获还是很大的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值