童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作

这篇具有很好参考价值的文章主要介绍了童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作

  • 魔王的介绍:😶‍🌫️一名双非本科大一小白。
  • 魔王的目标:🤯努力赶上周围卷王的脚步。
  • 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥
    童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作
    ❤️‍🔥大魔王与你分享:人生人山人海人来人往,自己自尊自爱自由自在。

童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作


一、前言

小时候我们在家里刚买电脑的时候,网络还不是很发达(两三年纪吧),每次断网我们都除了电脑自带的那一点单机游戏外没什么玩的,其中最好玩的便是扫雷,那么你可以用代码实现扫雷吗?这里我们添加了两个功能:第一个是标记功能,如果确定为雷我们可以标记为!,如果不确定,我们可以标记为?,第二个功能是递归展开:我们知道如果我们我们所点的那个位置一周都不是雷,那么它会自动扩开,如果我们点的地方有雷,那么会显示出周围雷的个数,如果想尝试玩一下,点击扫雷可以跳转过去,那么接下来就学习以下如何代码实现吧!

二、文件介绍

test.c:测试文件
game.c:源文件,进行函数的定义
game.h:头文件(只进行声明)

我们用测试文件调用game.h声明、game.c文件中实现的函数,这就是三个文件的关系。

为了使三者联系起来,我们需要让两个源文件(.c)文件都包含头文件,这样他们中的函数就可以一起使用了。

三、代码实现

1.创建基本的框架

void menu()
{
	printf("************************\n");
	printf("******** 1.play ********\n");
	printf("******** 0.exit ********\n");
	printf("************************\n");
}
void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}

	} while (input);
	
}

int main()
{
	test();
	return 0;
}

2.#define定义常量

因为我们在点击一个位置后如果附近有雷,那么就需要显示周围有几个雷,所以我们需要访问这个位置一周的内容,所以如果我们创建的表格大小和玩的时候打印出来的一样大,那么当访问边上那些位置周围雷的个数时,就会数组越界,所以我们如果要下9×9雷盘,我们需要让行和列都宽一个位置,也就是创建11×11的雷盘,不过打印的话只打印中间的9×9格。所以为了方便我们先定义常量。

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

#define mine_num 10

3.创建和初始化二维数组

和三子棋一样,我们要实现选中那个位置出现什么效果,只能是通过二维数组,让二位数组里的元素发生变化,在玩家视角就是自己操作了这个地方,我们需要创建两个二维数组,一个是布置雷区的二维数组,只在后台存在,并不显示出来,另一个则是给玩家展示的二维数组,至于为什么是两个,有很多原因,最容易说的就是:总不能把布置的雷展示给玩家吧,这样还怎么玩,不就开挂了。所以规定:让埋雷区初始化为字符0,展示区初始化为字符*,字符0是因为我们想用一个函数来初始化这两个雷盘,传的参数只需要最后传的字符不一样(一个是字符0,一个是字符*),其他都是一样的,所以为了方便之后的操作(两个雷盘间的联系),我们把两个数组都定义为char类型。


//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = a;
		}
	}
}
char mine[ROWS][COLS];
char show[ROWS][COLS];
//初始化雷区
init_board(mine, ROWS,COLS,'0');
//初始化展示区
init_board(show,ROWS,COLS, '*');

4.埋雷

在上篇智能三子棋博客中已经用到了随机数生成函数,点击智能三子棋可以跳转到该博客,里面有随机数的讲解。雷盘里我们初始化的是字符0,我们把埋雷的地方初始化为字符1,到计算的时候只需要让某个位置一周(8个)的数字字符相加减去7个字符0即可得到表示该位置有多少个雷的数字字符。

//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
	int num = 0;
	for (num = 0; num < mine_num; num++)
	{
		while (1)
		{
			int i = rand() % ROW + 1;
			int j = rand() % COL + 1;
			if (mine[i][j] == '0')
			{
				mine[i][j] = '1';
				break;
			}
		}
	}
}
//埋雷
put_mine(mine,ROWS, COLS);

5.打印雷盘

做完这些操作,我们就需要让玩家看到雷盘了,打印的时候因为行与列比较多,所以我们进行了排序,让玩家一看就知道自己要选择的地方的坐标。

//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	printf("   ");//为了对其每行,因为每行的开头加了下标,所以要先空出来下标所占的位置
	for (i = 1; i < cols-1; i++)//打印每列的下标
	{
		printf("%d ", i);
	}
	printf("\n");
	printf("   ");//为了对其每行,因为每行的开头加了下标,所以要先空出来下标所占的位置
	for (i = 1; i < cols-1; i++)//让每列的下标和其下面的元素隔开
	{
		printf("- ");
	}
	printf("\n");
	for (i = 1; i < rows-1; i++)
	{
		printf("%d| ", i);//标记每行
		int j = 0;
		for (j = 1; j < cols-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}
//打印雷盘
//print_board(mine, ROWS, COLS);//上帝视角,打印雷区
//printf("\n");
print_board(show, ROWS, COLS);

6.玩家标记

显示出展示区后玩家就开始下棋了,每次玩家在下棋前,我们都要问是否进行标记,然后标记一次后继续问是要标记还是要退出标记进行扫雷。标记的时候我们需要先判断玩家选择的位置是否在范围内(1~9),然后还要判断是否该位置已经被扫过了(如果没被扫过,该位置坐标只能是’*‘,’!‘,’?')

//玩家标记
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
	int flag = 0;
	while (1)
	{
		printf("选择标记方式:按1标记为雷(!),按2标记为不确定(?),按3取消标记(*),选择4进入排雷环节\n");
		printf("请玩家选择标记方式:> ");
		scanf("%d", &flag);
		if (flag == 1)
		{
			int i = 0;
			int j = 0;
			printf("玩家选择标记位置:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*'&&show[i][j]!='?')
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
				show[i][j] = '!';
			}
		}
		else if (flag == 2)
		{
			int i = 0;
			int j = 0;
			printf("玩家选择:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*' && show[i][j] != '!')
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
				show[i][j] = '?';
			}
		}

		else if (flag == 3)//取消标记,变为原来的*
		{
			int i = 0;
			int j = 0;
			printf("玩家选择:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] == '?' || show[i][j] == '!')
				{
					show[i][j] = '*';
				}
				else
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
			}
		}

		else if (flag == 4)
			return;
		else
			printf("选择错误,请重新选择\n");
		system("cls");
		print_board(show, ROWS, COLS);
	}
}
mark_board(show, ROWS, COLS);//每次输入前的标记环节

7.玩家下棋

因为玩家下棋和递归展开、判断周围雷个数以及输赢是连起来的,所以这个部分比较多。

  • 当扫的雷的个数等于(玩家看到的整个雷盘的个数减去雷的个数)的时候,如果程序还没有结束(也就是这期间没被炸死),那么就说明玩家扫雷成功,游戏胜利。
  • 玩家在进行选择排雷位置时,选择的位置需要合理(1~9),然后还需要没被扫过。
  • 当玩家选择的位置一周都没有雷时,该位置由*变为空格(也就是说只有这个位置一周都没有雷,才变为空格,并且展开一周,否则变为周围雷的个数),并且周围全部展开(每展开一个都要让扫雷的个数+1,否则就不能胜利了),然后继续判断,直到附近有雷时,显示出雷的个数。
  • 当玩家选择的坐标正好是雷时,游戏结束,扫雷失败。
  • 我们第三个所提到的展开一片所用到的就是递归:当我们输入的坐标周围不是雷时,展开周围的全部然后再在周围的这八个里面依次判断是否符合,如果符合就变为空格并且继续展开一篇,如果周围有雷,就不再展开,该位置变为周围雷的个数。
  • 上面的这个如果不经处理就会导致死循环,因为我们选的这个如果周围没雷,就会展开一片,那么这一片又与我们选的这个相邻,那么又会回去判断我们选择的这个位置,然后就这样重复,最终会导致内存崩了。所以我们在进行递归时加一个限制条件,它必须是!、?或*才可以,因为如果是数字字符或空格,说明这个地方已经判断过了,那么就不能再判断这个位置。
    判断周围雷的个数时,因为我们最终想要的是一个数字字符形式,所以我们在让要判断的这个位置周围雷的个数时,我们需要让周围相加减去7个字符0,而不是8个。
  • 我们在表达某个位置一周的坐标的时候,采取的是遍历法,用两个for循环找到这个位置一周的坐标并判断他们是显示数字还是再展开一片。
  • 递归展开是根据安 度 因的扫雷博客自己写出来的,点击安度因可以跳转过去。

//周围雷个数
char around_mine(char mine[ROWS][COLS], int i, int j)
{
	return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
	//一共是8个字符0,但因为我们要用到一个,所以减掉7个,用的那一个是因为我们想以字符数字的形式赋过去,因为数组是字符类型的
}

//递归展开
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
	int x = 0;
	int y = 0;
	for (x = -1; x <= 1; x++)
	{
		for (y = -1; y <= 1; y++)
		{
			if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
			{
				if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
				{
					(*p)++;
					if (around_mine(mine, i + x, j + y) == '0')
					{
						show[i + x][j + y] = ' ';
						recursion(mine, show, i + x, j + y, p);
					}
					else
					{
						show[i + x][j + y] = around_mine(mine, i + x, j + y);
						//recursion(mine, show, i + x, j + y, p);
					}
				}
				else
					continue;

			}
		}
	}
}

//玩家选择坐标
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
	int i = 0;
	int j = 0;
	printf("玩家选择:> ");
	scanf("%d %d", &i, &j);
	if (i > 0 && i <= ROW && j > 0 && j <= COL)
	{
		if (mine[i][j] == '1')
		{
			return 0;
		}
		if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
		{
			(*p)++; 
			show[i][j] = around_mine(mine, i, j);
			if (show[i][j] == '0')
			{
				show[i][j] = ' ';
				recursion(mine, show, i, j, p);//递归展开
			}
			/*else
				recursion(mine, show, i, j, p);*/
			return 1;
		}
		else
		{
			printf("该位置已经排过,请重新选择位置\n");
			Sleep(1500);
			return 1;
		}
	}
}

//玩家进行标记和排雷
int num = 0;
int ret = 0;
while (num<ROW*COL-mine_num)//当重复的次数为所有非雷个数后跳出循环,胜利
{
	mark_board(show, ROWS, COLS);//每次输入前的标记环节
	ret = player_option(mine, show, ROWS, COLS, &num);
	system("cls");
	print_board(show, ROWS, COLS);
	if (ret == 0)
	{
		printf("很遗憾,你被炸死了,雷区如下:\n");
		print_board(mine, ROWS, COLS);//让玩家死后看到这盘扫雷游戏中雷都在哪里
		break;
	}
	//print_board(show, ROWS, COLS);
}
if (num == ROW * COL - mine_num)
	printf("恭喜你扫除了全部的雷!!!\n");

四、总代码如下

game.h

#pragma once

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

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

#define mine_num 10

//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a);

//埋雷
void put_mine(char mine[ROWS][COLS],int rows, int cols);

//打印
void print_board(char board[ROWS][COLS], int rows, int cols);

//玩家选择坐标
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols);

//玩家标记
void mark_board(char show[ROWS][COLS], int rows, int cols);

game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

//初始化
void init_board(char board[ROWS][ROWS], int rows, int cols, char a)
{
	int i = 0;
	for (i = 0; i < rows; i++)
	{
		int j = 0;
		for (j = 0; j < cols; j++)
		{
			board[i][j] = a;
		}
	}
}

//放雷
void put_mine(char mine[ROWS][COLS], int rows, int cols)
{
	int num = 0;
	for (num = 0; num < mine_num; num++)
	{
		while (1)
		{
			int i = rand() % ROW + 1;
			int j = rand() % COL + 1;
			if (mine[i][j] == '0')
			{
				mine[i][j] = '1';
				break;
			}
		}
	}
}

//打印
void print_board(char board[ROWS][COLS], int rows, int cols)
{
	int i = 0;
	printf("   ");//为了对其每行,因为每行的开头加了下标,所以要先空出来下标所占的位置
	for (i = 1; i < cols-1; i++)//打印每列的下标
	{
		printf("%d ", i);
	}
	printf("\n");
	printf("   ");//为了对其每行,因为每行的开头加了下标,所以要先空出来下标所占的位置
	for (i = 1; i < cols-1; i++)//让每列的下标和其下面的符号隔开
	{
		printf("- ");
	}
	printf("\n");
	for (i = 1; i < rows-1; i++)
	{
		printf("%d| ", i);//标记每行
		int j = 0;
		for (j = 1; j < cols-1; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
}

//周围雷个数
char around_mine(char mine[ROWS][COLS], int i, int j)
{
	return mine[i][j - 1] + mine[i][j + 1] + mine[i + 1][j] + mine[i - 1][j] + mine[i - 1][j - 1] + mine[i + 1][j + 1] + mine[i - 1][j + 1] + mine[i + 1][j - 1] - 7 * '0';
	//一共是8个字符0,但因为我们要用到一个,所以减掉7个,用的那一个是因为我们想以字符数字的形式赋过去,因为数组是字符类型的
}

//递归展开
void recursion(char mine[ROWS][COLS], char show[ROWS][COLS], int i, int j, int* p)
{
	int x = 0;
	int y = 0;
	for (x = -1; x <= 1; x++)
	{
		for (y = -1; y <= 1; y++)
		{
			if (x + i > 0 && x + i <= ROW && y + j > 0 && y + j <= COL)//防止越界
			{
				if (mine[i + x][j + y] == '0' && (show[i + x][j + y] == '*' || show[i + x][j + y] == '?' || show[i + x][j + y] == '!'))
				{
					(*p)++;
					if (around_mine(mine, i + x, j + y) == '0')
					{
						show[i + x][j + y] = ' ';
						recursion(mine, show, i + x, j + y, p);
					}
					else
					{
						show[i + x][j + y] = around_mine(mine, i + x, j + y);
						//recursion(mine, show, i + x, j + y, p);
					}
				}
				else
					continue;

			}
		}
	}
}


//玩家选择坐标
int player_option(char mine[ROWS][COLS], char show[ROWS][COLS], int rows, int cols,int* p)
{
	int i = 0;
	int j = 0;
	printf("玩家选择:> ");
	scanf("%d %d", &i, &j);
	if (i > 0 && i <= ROW && j > 0 && j <= COL)
	{
		if (mine[i][j] == '1')
		{
			return 0;
		}
		if (show[i][j] == '*'||show[i][j]=='!'||show[i][j]=='?')
		{
			(*p)++; 
			show[i][j] = around_mine(mine, i, j);
			if (show[i][j] == '0')
			{
				show[i][j] = ' ';
				recursion(mine, show, i, j, p);//递归展开
			}
			/*else
				recursion(mine, show, i, j, p);*/
			return 1;
		}
		else
		{
			printf("该位置已经排过,请重新选择位置\n");
			Sleep(1500);
			return 1;
		}
	}
}

//玩家标记
void mark_board(char show[ROWS][COLS], int rows, int cols)
{
	int flag = 0;
	while (1)
	{
		printf("选择标记方式:按1标记为雷(!),按2标记为不确定(?),按3取消标记(*),选择4进入排雷环节\n");
		printf("请玩家选择标记方式:> ");
		scanf("%d", &flag);

		if (flag == 1)
		{
			int i = 0;
			int j = 0;
			printf("玩家选择标记位置:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*'&&show[i][j]!='?')
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
				show[i][j] = '!';
			}
		}
		else if (flag == 2)
		{
			int i = 0;
			int j = 0;
			printf("玩家选择:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] != '*' && show[i][j] != '!')
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
				show[i][j] = '?';
			}
		}

		else if (flag == 3)
		{
			int i = 0;
			int j = 0;
			printf("玩家选择:> ");
			scanf("%d %d", &i, &j);
			if (i > 0 && i <= ROW && j > 0 && j <= COL)
			{
				if (show[i][j] == '?' || show[i][j] == '!')
				{
					show[i][j] = '*';
				}
				else
				{
					printf("该位置已经扫过或者已经被标记了该种符号,请重新选择\n");
					continue;
				}
			}
		}

		else if (flag == 4)
			return;
		else
			printf("选择错误,请重新选择\n");
		system("cls");
		print_board(show, ROWS, COLS);
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("************************\n");
	printf("******** 1.play ********\n");
	printf("******** 0.exit ********\n");
	printf("************************\n");
}
void game()
{
	char mine[ROWS][COLS];
	char show[ROWS][COLS];

	//初始化雷区
	init_board(mine, ROWS,COLS,'0');
	//初始化展示区
	init_board(show,ROWS,COLS, '*');
	
	//埋雷
	put_mine(mine,ROWS, COLS);

	//打印雷盘
	//print_board(mine, ROWS, COLS);//上帝视角,打印雷区
	//printf("\n");
	print_board(show, ROWS, COLS);

	//玩家进行标记和排雷
	int num = 0;
	int ret = 0;
	while (num<ROW*COL-mine_num)//当重复的次数为所有非雷个数后跳出循环,胜利
	{
		mark_board(show, ROWS, COLS);//每次输入前的标记环节
		ret = player_option(mine, show, ROWS, COLS, &num);
		system("cls");
		print_board(show, ROWS, COLS);
		if (ret == 0)
		{
			printf("很遗憾,你被炸死了,雷区如下:\n");
			print_board(mine, ROWS, COLS);//让玩家死后看到这盘扫雷游戏中雷都在哪里
			break;
		}
		//print_board(show, ROWS, COLS);
	}
	if (num == ROW * COL - mine_num)
		printf("恭喜你扫除了全部的雷!!!\n");
}

void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("输入错误,请重新输入\n");
		}

	} while (input);
	
}

int main()
{
	srand((unsigned int)time(NULL));
	test();
	return 0;
}

效果展示图

童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作

五、总结

童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作

✨请点击下面进入主页关注大魔王
如果感觉对你有用的话,就点我进入主页关注我吧!文章来源地址https://www.toymoban.com/news/detail-413157.html

到了这里,关于童年回忆--扫雷(包括标记功能和递归展开)--万字讲解让你学会扫雷制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言实现扫雷(包含递归展开)

    目录 一:扫雷游戏的基础逻辑 二:关于扫雷相关的信息存储 三:游戏大体实现逻辑 四:具体实现 (1)初始化 (2)打印 (3)布置雷 (4)查雷 五:全部代码 (1)game.h (2)game.c (3)test.c 六:实际效果演示 扫雷游戏逻辑如下: 1. 游戏开始时,玩家将看到一个方格棋盘,每个方格上有一个数

    2024年02月05日
    浏览(34)
  • C语言——扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月03日
    浏览(34)
  • 【C语言】扫雷小游戏(递归展开版)

    哈喽,大家好,上次我们已经学习了三子棋小游戏,今天我们来学习扫雷小游戏了。 目录 1.游戏介绍 2.函数部分 2.1菜单 2.2game()函数 2.3mian()函数 2.4初始化棋盘 2.5打印棋盘 2.6布置雷 2.7排查雷 2.8统计雷 2.9递归,展开一片区域 3.完整代码展示  想必大家都玩过扫雷这款小游戏吧

    2024年02月12日
    浏览(29)
  • C语言300行代码实现扫雷(可展开+可标记+可更改困难级别+内附图形界面版本)

    扫雷是一个经典的游戏,是一个益智类小游戏,在80、90年代曾风靡一时,当然现在也是十分受欢迎; 废话不多说; 让我们来了解一下如何用C语言去实现它吧!!!(❁´◡`❁) 运行环境:VS2019 图形化界面版本 先实现一个初级版本的: 1、我们得有一个9*9的棋盘; 2、我们在棋

    2024年01月25日
    浏览(29)
  • C语言之扫雷小游戏的实现【含递归展开】

    扫雷游戏是1992年发行的一款大众类益智游戏,对于许多80后、90后来说都是童年的回忆。如今三十年过去了,这款游戏依旧受到很多网友的喜爱,今天我们一起来模拟实现一下扫雷游戏。 本文所用的编译器是VS2022 这里我们使用模块化设计,模块化设计就是把各个模块的代码分

    2024年02月02日
    浏览(33)
  • C语言初阶之扫雷代码详解(含递归展开)

    主要分为下面几个过程: 1、建立棋盘 2、初始化棋盘 3、设置棋盘雷数 4、打印棋盘 5、玩家找雷 6、判定胜负 文件名:game.h 代码如下: 在game头文件中,首先包含会使用到的库头文件,这里的ROW以及COL是雷区的行和列大小,也就是说这是玩家实际能看到的行数及列数,而RO

    2024年02月03日
    浏览(26)
  • 【C语言】万字教学,带你分步实现扫雷游戏(内含递归函数解析),剑指扫雷,一篇足矣

    君兮_的个人主页 勤时当勉励 岁月不待人 C/C++ 游戏开发 Hello,这里是君兮_,今天更新一篇关于利用C语言实现扫雷游戏的博客。对于初学者来说,这也是一个非常容易上手的小项目,看完不妨自己试试哦! 废话不多说,我们直接开始吧! 相信很多人在小时候都玩过扫雷游戏,但

    2024年02月11日
    浏览(28)
  • 【六一儿童节】回忆一下“童年的记忆”

    我们都有过童年,并且从现在看来,童年是我们最希望可以回去的那段时光,那时候的我们傻傻的,并且很天真可爱,我们在这个世界上充满了生机活力,在这里要蟹蟹CSDN能够出这个六一儿童节活动,让我在这个快节奏的时代去思考与回忆自己的过去。 第一次接触EasyX是前三

    2024年02月08日
    浏览(35)
  • 火山引擎边缘云,助你沉浸式回忆童年

    发现了吗?在抖音、西瓜视频上能观看4K修复的经典港片了!得益于抖音、中国电影资料馆、火山引擎共同发起的“经典香港电影修复计划”,我们童年时期看过的《大话西游之大圣娶亲》《武状元苏乞儿》等22部港片以更清晰、流畅、颜色饱满的状态回归了! 画面来自《武

    2024年02月11日
    浏览(37)
  • python实现超级马里奥,回忆童年+边学边玩

    完整代码和素材戳我 主代码 main setup tools 运行成果 好了,被忘了在GitHub里面点star喔。 关于Python技术储备 学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,希望提供给想学习 Python 的小伙伴们一

    2024年02月04日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包