用C++写一个小游戏——扫雷(1)

这篇具有很好参考价值的文章主要介绍了用C++写一个小游戏——扫雷(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、项目准备

1、安装VS2022

(1)从官网下载Visal Studio(Community 2022):

Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com)https://visualstudio.microsoft.com/zh-hans/vs/扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

(2)安装Visal Studio

 下载完成后,启动下载的 VisualStudioSetup.exe

  • 工作负荷 选择 “使用C++的桌面开发” 即可,其他看个人需求。

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  •  在 安装位置 将位置改为D盘(C盘充足的可忽略这步)

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  •  点击安装

2、安装Easyx库

(1)从官网下载Easyx库
EasyX Graphics Library for C++https://easyx.cn/

        进入官网后点击 “下载EasyX” 即可下载扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

(2)安装EasyX库

双击下载的程序会进入安装导向

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

选择 下一步,找到刚刚下载的VS2022,点击 安装 即可

 扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

3、准备好游戏需要用到的图片

图片压缩包
提取码:3mp1 

将下载完的图片文件夹 images,复制到 与扫雷.cpp同一级 的目录下

 二、项目的编写

1、创建项目

  • 双击安装好的VS2022,进入以下界面,点击 创建新项目 

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  • 选择 空项目 ,点击 下一步

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  •  将项目名称改为你想要的名字,位置选择平常放置代码的位置即可,点击 创建 扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏
  •  项目创建成功

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  • 在右边的源文件中右击->添加->新建项 ,进入下面界面

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

  • 选择 C++文件(.cpp),名称改为 扫雷.cpp
  • 添加成功

 扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

 2、编写项目

 (1)包含头文件

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>
#include<graphics.h>

using namespace std;

 (2)宏定义游戏的参数

#define		ROW		10										// 地图的行
#define		COL		10										// 地图的列
#define		BOOM	10										// 雷的个数
#define		IMGW	40										// 图片的宽度

(3)声明函数所调用的函数

void showMap	(int map[ROW][COL]);						// 打印地图数据
void initMap	(int map[ROW][COL]);						// 初始化地图
void mouseEvent	(int map[ROW][COL]);						// 鼠标操作
void drawMap	(int map[ROW][COL], IMAGE img[]);			// 绘制地图
void openNull	(int map[ROW][COL], int row, int col);		// 炸开空白格子周围的非雷格子
void judge		(int map[ROW][COL], int row, int col);		// 判断是否点到雷
void judge_game(int map[ROW][COL]);							// 判断游戏是否结束、胜利

(4)定义游戏所需的标志位

bool	isOver = false;										// 游戏结束标志位
int		flag = 0;											// 已经点开的非雷格子数,如果格子数达到(ROW*COL-BOOM)(这里是90),就胜利

(5)打印游戏的数据

//打印游戏的数据
void showMap(int map[ROW][COL])
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			printf("%2d ",map[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

(6)初始化地图:在地图中100个格子里随机埋下10个雷,并将雷所在九宫格的所有格子的数值+1,雷除外

void initMap(int map[ROW][COL])
{
	//给地图埋10个雷,雷用-1表示
	for (int i = 0; i < BOOM; )
	{
		
		int r = rand() % ROW;
		int c = rand() % COL;
		if (map[r][c] == 0)
		{
			map[r][c] = -1;
			i++;		//只有成功设置了雷,才自增
		}
	}
	//雷所在的九宫格所有的格子的数值都+1,雷除外
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < COL; j++)
		{
			if (map[i][j] == -1)	
			{
				//遍历雷所在的九宫格
				for (int r = i - 1; r <= i + 1; r++)
				{
					for (int c = j - 1; c <= j + 1; c++)
					{
						//除了雷之外的格子,数值都+1
						if ((r >= 0 && r < ROW && c >= 0 && c < COL) && map[r][c] != -1)
						{
							map[r][c] ++;
						}
					}
				}
			}
		}
	}
	//把所有的格子都用遮图盖起来,给每个格子都加密,比如都加上20
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < ROW; j++)
		{
			map[i][j] += 20;
		}
	}
}

(7)绘制地图

void drawMap(int map[ROW][COL],IMAGE img[])
{
	//把数组里的数据转换成对应的图片,贴图贴到图形窗口上面
	for (int i = 0; i < ROW; i++)
	{
		for (int j = 0; j < ROW; j++)
		{
			//空白格子和数字
			if (map[i][j] >= 0 && map[i][j] <= 8)
			{
				putimage(j * IMGW, i * IMGW, img + map[i][j]);
			}
			//雷,贴上雷图
			else if (map[i][j] == -1)
			{
				putimage(j * IMGW, i * IMGW, img + 9);
			}
			//没被点开的格子,贴上遮盖图
			else if (map[i][j] >= 19 && map[i][j] <= 28)
			{
				putimage(j * IMGW, i * IMGW, img + 10);
			}
			//右键标记,贴上标记图
			else if (map[i][j] == -2)
			{
				putimage(j * IMGW, i * IMGW, img + 11);
			}
		}
	}
}

(8)鼠标操作

void mouseEvent(int map[ROW][COL])
{
	//定义消息结构体(鼠标、按键、字符消息)
	ExMessage msg;
	//如果有消息,会返回真,并且会给msg设置值
	if (peekmessage(&msg,EM_MOUSE))
	{
		//把鼠标的坐标转换成下标
		int c = msg.x / IMGW;
		int r = msg.y / IMGW;
		if (msg.message == WM_LBUTTONDOWN)	//如果鼠标左击,
		{
			if (map[r][c] >= 19 && map[r][c] <= 28)	//	如果该格子没有点开,则允许点开格子
			{
				flag++;
				map[r][c] -= 20;
				openNull(map, r, c);
				judge(map, r, c);
				showMap(map);
			}
			else if (map[r][c] == -2)	//如果已经被标记为雷,还左击则游戏结束
			{
				flag++;
				map[r][c] = -1;
				judge(map, r, c);
				showMap(map);
			}
		}
		else if (msg.message == WM_RBUTTONDOWN)	//如果鼠标右击,则显示标记图
		{
			if (map[r][c] >= 19 && map[r][c] <= 28)
			{
				map[r][c] = -2;
				showMap(map);
			}
		}
	}
}

(9)打开空白格子时炸开空白格子周围的非雷格子

void openNull(int map[ROW][COL], int row, int col)
{
	//判断当前点击的是否为空白
	if (map[row][col] == 0)
	{
		//遍历周围九宫格
		for (int i = row - 1; i <= row + 1; i++)
		{
			for (int j = col - 1; j <=col + 1; j++)
			{
				//如果有没点开的非雷格子,就把它炸开(显示出来)
				if ((i >= 0 && i< ROW && j >= 0 && j < COL) && map[i][j] >= 19 && map[i][j] <= 28)
				{
					map[i][j] -= 20;
					flag++;
					openNull(map, i, j);	//如果炸开的是空白格子,递归实现连续炸开
				}
			}
		}
	}
}

(10)判断是否点到雷

void judge(int map[ROW][COL], int row, int col)
{
	//如果点到雷,就game over ,点一个雷其他的雷都显示出来
	if (map[row][col] == -1)
	{
		//遍历显示地图中的所有的雷
		for (int i = 0; i < ROW; i++)
		{
			for (int j = 0; j < COL; j++)
			{
				if (map[i][j] == 19)
				{
					map[i][j] -= 20;
					flag = 0;
				}
					
			}
		}
		isOver = true;
	}
}

(11)判断游戏是否结束

void judge_game(int map[ROW][COL])
{
	//输了,点到雷
	if (isOver)
	{
		int ret = MessageBox(GetHWnd(), "你已经输了,是否继续游戏?", "hit", MB_OKCANCEL);	//显示提示窗口:已经输了,是否继续游戏
		if (ret == IDOK)					//如果左击确定,重新初始化地图
		{
			//把map清零
			memset(map, 0, ROW * COL * sizeof(int));
			initMap(map);
			showMap(map);
			isOver = false;
		}
		else if (ret == IDCANCEL)			//如果左击退出,退出程序
		{
			exit(666);
		}
	}
	//赢了,点了所有非雷的点就赢了
	if (flag == (ROW * COL - BOOM))						
	{
		int ret = MessageBox(GetHWnd(), "你已经赢了,是否继续游戏?", "666", MB_OKCANCEL);	//显示提示窗口:已经赢了,是否继续游戏
		if (ret == IDOK)					//如果左击确定,重新初始化地图
		{
			//把map清零
			flag = 0;
			memset(map, 0, ROW * COL * sizeof(int));
			initMap(map);
			showMap(map);
			isOver = false;
		}
		else if (ret == IDCANCEL)			//如果左击退出,退出程序
		{
			exit(666);
		}
	}
}

(12)主函数

int main()
{
	IMAGE img[12];									// 定义图片数组
	int map[ROW][COL] = { 0 };						// 定义游戏的地图

	initgraph(COL*IMGW, ROW*IMGW, EW_SHOWCONSOLE);	// 创建图形窗口
	srand((unsigned)time(NULL));					// 设置随机数种子
	initMap(map);									// 初始化地图
	
	for (int i = 0; i < 12; i++)					// 加载图片
	{
		char fileName[50] = { 0 };
		sprintf_s(fileName,"./images/%d.png", i);
		loadimage(img + i, fileName, IMGW, IMGW);
	}

	while (1)
	{
		mouseEvent(map);							//鼠标操作
		drawMap(map, img);							//绘制地图
		judge_game(map);							//判断游戏是否结束、胜利
	}

	return 0;
}

3、运行项目

(1)在VS2022的上方,点击 本地Windows 调试器 运行项目

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

 (2)运行结果

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

 扫雷c++,小游戏,C++,microsoft,c++,visual studio,游戏

这样,一个简单的扫雷小游戏就完成了。文章来源地址https://www.toymoban.com/news/detail-791237.html

到了这里,关于用C++写一个小游戏——扫雷(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 前端技术搭建扫雷小游戏

    要搭建一个扫雷小游戏,你可以使用以下前端技术: HTML:用于创建游戏界面的结构和布局。 CSS:用于美化游戏界面,包括样式、布局和动画效果。 JavaScript:用于实现游戏逻辑和交互功能。 以下是一个简单的扫雷小游戏的前端技术搭建步骤: 创建HTML结构: 创建一个包含游

    2024年02月13日
    浏览(42)
  • C语言扫雷小游戏

    扫雷的玩法:在一个9×9(初级)、16×16(中级)、16×30(高级)或自定义大小的方块矩阵中随机布置一定量的地雷(初级为10个,中级为40个,高级为99个),再由玩家逐个翻开方块,翻开的地方将显示周围八个雷的个数。以找出所有地雷为最终游戏目标。如果玩家翻开的方块

    2024年02月05日
    浏览(61)
  • 扫雷小游戏【C语言】

    目录 前言 一、基本实现逻辑 二、实现步骤 1. 我们希望在进入游戏时有一个菜单让我们选择 2. 我们希望可以重复的玩(一把玩完了还可以接着玩) 3. 采用多文件形式编程  4.要扫雷先得有棋盘(创建棋盘R*N) 5.初始化棋盘  6.打印棋盘 7.设置雷 8.排查雷 三、全部源码: 上期

    2024年02月11日
    浏览(62)
  • 小游戏扫雷实现教学(详解)

    目录  【前言】 一、模块化程序设计(多文件编程)介绍 1.概述 2.传统编程的方式 3.模块化程序设计的方法 二、扫雷代码设计思路 三、扫雷代码设计 1.创建菜单函数  2.实现9x9扫雷 3.初始化棋盘  4.打印棋盘  5.随机布置雷的位置 6.排查雷的信息  7.回到步骤1,重新选择进入

    2024年02月12日
    浏览(36)
  • C语言:扫雷小游戏

    文接上一篇博文C语言:三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频,所以这里实现的扫雷完全是博主的原生思路,具有逻辑性。下面详细介绍一

    2024年02月09日
    浏览(62)
  • C语言小游戏——扫雷

            结合前边我们所学的C语言知识,本期我们将使用C语言实现一个简单的小游戏——扫雷 目录 前言 总体框架设计 多文件分装程序 各功能模块化实现 初始化棋盘  棋盘打印 埋雷  判赢与排雷 游戏逻辑安排 总结         和三子棋相同,游戏开始时不需要任何判

    2024年02月06日
    浏览(54)
  • 原生JS手写扫雷小游戏

    实现一个完整的扫雷游戏需要一些复杂的逻辑和界面交互。我将为你提供一个简化版的扫雷游戏示例,帮助你入门。请注意,这只是一个基本示例,你可以根据自己的需求进行扩展和改进。 创建游戏板(Grid): 创建一个二维数组来表示游戏板格子,每个格子包含信息如是否

    2024年02月13日
    浏览(35)
  • c语言小游戏之扫雷

    目录 一:游戏设计理念及思路 二:初步规划的游戏界面 三:开始扫雷游戏的实现 注:1.创建三个文件,test.c用来测试整个游戏的运行,game.c用来实现扫雷游戏的主体,game.h用来函数声明和包含头文件 2.为方便定位坐标,在展示数组时添加行号和列号 四:谢谢观看  听说看到

    2024年01月23日
    浏览(57)
  • C语言:轻松实现扫雷小游戏

    目录 一、前言 二、扫雷步骤 1.创建项目 2.设计整体框架 1.定义数组长度和雷的个数 2.game函数功能 三、头文件game.h代码实现  四、测试文件test.c代码实现 五、game函数功能实现 1.初始化棋盘 2.打印棋盘  3.布置雷 4. 获得雷的个数  5.排查雷 6.game函数实现代码 六、总结 大家好

    2024年02月03日
    浏览(56)
  • 前端技术搭建扫雷小游戏(内含源码)

    上周我们实通过前端基础实现了贪吃蛇游戏,今天还是继续按照我们原定的节奏来带领大家完成一个游戏,功能也比较简单简单,也是想借助这样一个简单的功能,然后来帮助大家了解我们JavaScript在前端中的作用, 在前面的文章当中我们也提及到我们在本系列的专栏是循序

    2024年02月07日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包