简易小游戏——三子棋

你好,我是L-may

点我码云 提取代码

  • 游戏介绍

三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。

  • 成品展示

短暂加载后,进入游戏菜单

选择1进入游戏,选择0退出游戏

玩家输入合适的坐标,选择落子,随后电脑落子 

直到一方获胜

不过瘾选择1,再来一把,选择0推出游戏

  • 制作

1.设计思路

  •   创建一个二维数组,用于存放每个坐标的子,无子设置为 ' '(空格),玩家落子为’x’,电脑落子为 'o'。

  • 打印9*9棋盘

  • 玩家落子,电脑随机落子

  • 判断胜负

  • 包装,打印菜单

2.步骤详解

一个好的项目,往往是由多个源文件,头文件组合而成

这样的项目,就有分块管理、隐私性的好处。

  • 首先我们先创建

Test.c   (用于存放各个模块) 

game.c   (用于存放游戏的主体)

game.h   (用来存放声明) 

(1).定义宏 设置棋盘的长*宽,并且包含需要的头文件

#define ROW 3
#define COL 3

不建议使用全局变量,因为全局变量在任何时候都有可能被修改。

(2).初始化函数,将数组的每个元素初始化为 ‘  ’ 空格。

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

利用初始化函数 memset 

memset(void *s,  int ch ,size_t n )三个参数分别为 指针对象,初始化内容,初始化的大小

注意:要调用头文件 cstring

(3).打印棋盘(难点)

思路:

分成俩部分

第一部分: 空格 字符 空格 前俩个有|  最后一个没有

第二部分: --- 前俩个有 |         最后一个没有 

每次打印完一部分换行     打印三次第一部分 两次第二部分

void ShowBoard(char board[ROW][COL], int row, int col)
{
	int i = 0;
	int j = 1;
	printf("***三子棋***\n");
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{

			printf(" %c ", board[i][j]);
			if (j < col - 1)
			{
				printf("|");
			}

		}
		printf("\n");
		if (i < row - 1)
		{
			for (j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
		}
		printf("\n");
	}
}

(4).玩家落子

  • 玩家落子标志为 ' x ' 
  • 每次落子需要检查落子的合法性,不能超出边界,不能下在有子的格子上
void PlayerMove(char board[ROW][COL], int row, int col)
{
	printf("玩家落子\n");
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:>");
		scanf("%d%d", &x, &y);
		if (x <= col && x >= 1 && y <= row && y >= 1)
		{
			if (board[y - 1][x - 1] == ' ')
			{
				board[y - 1][x - 1] = 'x';
				break;
			}
			else
			{
				printf("已经落子\n");
			}
		}
		else
			printf("坐标非法\n");
	}
}

(5).电脑落子

电脑随机落子,生成随机数

  • 生成随机数的方法,调用rand函数,调用rand函数要先定义srand  
  • srand((unsigned int)time(NULL))

电脑落子为 ‘ o ',落子要检查为空 ’  ’,才能落子

void ComputerMove(char board[ROW][COL], int row, int col)
{
	printf("电脑落子o\n");
	while (1)
	{
		int x = rand() % col;
		int y = rand() % row;
		if (board[y][x] == ' ')
		{
			board[y][x] = 'o';
			printf("电脑落子(%d,%d)\n", x + 1, y + 1);
			break;
		}
	}
}

(6).判断输、赢、平局、继续

定义:

  • 返回 ‘x’ 玩家赢 
  • 返回 'o' 电脑赢
  • 返回‘C'平局
  • 返回'Q' 继续

赢&输:

  • 8种情况
  • 列全相同
  • 行全相同
  • 主对角线相同
  • 副对角线相同

平局:

棋盘上没有空子

int IsFull(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int k = 0; k < col; k++)
		{
			if (board[i][k] == ' ')
				return 0;
		}
	}
	return 1;
}

继续游戏:

不是赢或输或平局

char IsWin(char board[ROW][COL], int row, int col)
{
	//判断列三子
	for (int 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 (int i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] &&
			board[1][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[0][0] != ' ')
		return board[0][0];

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

	//判断是否平局
	if (IsFull(board, ROW, COL))
	{
		return 'Q';
	}

	return 'C';
}

到这里游戏的主体就完成

(7).简单写个菜单完善一下

void menu()
{
	//设置加载
	char a1[] = "*********************";
	char a2[] = "    loading.......**";
	for (int i = 0; i < strlen(a1); i++)
	{
		a1[i] = a2[i];
		printf("%s", a1);
		Sleep(100);
		system("cls");
	}
	//打印菜单
	printf("****************************\n");
	printf("********   1.play  *********\n");
	printf("********   0.exit  *********\n");
	printf("****************************\n");
}

备注:

Sleep函数表示静止

system("cls”)表示清屏

最后一步,将各个部分完善一下

每次先打印菜单,供玩家选择,然后展示棋盘,玩家选择落子,落完子判断输赢,平局,进行游戏

电脑落子,落完子判断输赢,平局,进行游戏

————编程没有捷径

猜你喜欢

转载自blog.csdn.net/m0_73299809/article/details/128707933