详解!C语言编程实现小游戏“三子棋”

今天我们来编程实现一个充满童趣的小游戏“三子棋”
先来说一下三子棋的规则:

三子棋又叫九宫棋、圈圈叉叉、一条龙等。
将正方形对角线连起来,或相对两边依次摆上三个双方棋子,
总之只要将自己的三个棋子走成一条线,
对方就算输了。

详解!C语言编程实现小游戏“三子棋”_第1张图片
不用再过多解释了,相信大家一定都玩过!

那么,该如何用编程的方式实现它呢?
首先,我们创建项目后,要建立三个文件
详解!C语言编程实现小游戏“三子棋”_第2张图片
分别是头文件game.h,用来声明库函数,存储我们在编程中所自定义函数的函数名,以及宏定义棋盘的宽高。
源文件game.c文件用于储存我们所编写的游戏中所要用到的自定义的函数体。
test.c中包含的是整个游戏程序的大框架和游戏菜单程序。

我们先在test.c文件中定义菜单函数,并在主函数中调用

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
void menu()
{
	printf("***********************************\n");
	printf("************   1.play  ************\n");
	printf("************   0.exit  ************\n");
	printf("***********************************\n");
}
int main()
{
	int input = 0;
	printf("欢迎启动三子棋!\n");
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} 
	while (input);
	return 0;
}

调试成功后是这样子的:
详解!C语言编程实现小游戏“三子棋”_第3张图片
接下来就是最重要的game()程序体了
首先要展出棋盘,
我们知道三子棋的棋盘是一个3x3的正方形格子,即九宫格。
在程序执行后可以是这样子
详解!C语言编程实现小游戏“三子棋”_第4张图片
我们在game.h文件中定义宽高

#define ROW 3
#define COL 3

接下来再game.c中写出初始化数组的程序,在游戏一开始时将数组中的所有元素初始为“ ”(空格)

void InitBoard(char board[ROW][COL], int row, int col)
{
	memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));
}

这里我们使用memset函数,记得加上声明

#include 

接着写出展出棋盘的函数

void DisplayBoard(char  board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i

这样就可以实现上图的效果,
棋盘的展出与初始化完成

接下来我们定义让玩家先走,于是写出玩家走棋的函数
玩家走的棋用’X’来表示

void PlayerMove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走:\n");
	while (1)
	{
		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] = 'X';
				break;
			}
			else
			{
				printf("抱歉,坐标已经被占用,请重新输入!\n");
			}
		}
		else
		{
			printf("输入的坐标有误,请重新输入!\n");
		}
	}
}

接着写出电脑走棋的函数
电脑走的棋用’O’来表示

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] = 'O';
			break;
		}
	}
}

这里我们用到了rand函数,令电脑在没占用的位置随机走一步棋
需要进行声明

#include 

并且需要在主函数下调用srand函数
同时声明

#include 

最后,需要定义一个函数来判断输赢或平局
我们在构成获胜条件时让函数的返回值为棋子所用的字符
在函数的末尾我们还需要一个用于判断棋盘是否被占满的函数IsFull(在下方说明),
占满时返回’Q’否则返回‘ ’
当返回值为‘ ’时未出现获胜方,则应继续游戏
当返回‘Q’时意味着没有一方获胜,而棋盘已被占满,即为平局

char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i

IsFull函数用于判断棋盘是否被占满,未被占满返回值为0,占满时返回1

int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 0;
	for (i = 0; i

(以上函数均写在文件game.c中)

这时我们就可以写出game函数了
每当完成一步棋后都需要调用IsWin函数来进行一次判断

void game()
{
	char board[ROW][COL] = { 0 };
	char ret = 0;
	InitBoard(board, ROW, COL);
	DisplayBoard(board, ROW, COL);
	while (1)
	{
		PlayerMove(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != ' ')
			break;
		DisplayBoard(board, ROW, COL);
		ComputerMove(board, ROW, COL);
		ret = IsWin(board, ROW, COL);
		if (ret != ' ')
			break;
		DisplayBoard(board, ROW, COL);
	}
	if (ret == 'X')
		printf("玩家赢!\n");
	else if (ret == 'O')
		printf("电脑赢!\n");
	else if (ret == 'Q')
		printf("平局\n");
	DisplayBoard(board, ROW, COL);
}

三子棋函数完成!
你是否找回了童趣呢?

完整代码:https://github.com/Yubao-wss/Game/tree/master/Sanzi Chess/Sanzi Chess

你可能感兴趣的:(日常学习)