栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
#include 
#include 

// 游戏菜单
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);

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867313.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号