武汉理工大学数据结构综合实验——连连看游戏综合实践

该实验旨在通过实现连连看游戏,掌握数据结构,特别是非线性结构如图的应用。实验要求包括主界面设计、消子判断、胜负判断等功能,涉及C++编程和MFC框架。实验中设计了数据结构,核心算法包括一条、两条和三条直线消子,以及地图初始化和路径搜索。测试用例和实际效果确保了游戏的正确性和趣味性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


实验目的

(1)线性结构实验目的
调研连连看游戏,了解连连看游戏的功能和规则等
掌握集成开发工具VS2019的使用和C++的基础编程
了解MFC框架
了解线性结构,掌握数组的遍历、消子和胜负判断等算法
了解企业软件开发过程,应用迭代开发思路进行项目开发,养成良好的编程习惯和培养软件工程化思维

(2)非线性结构实验目的
调研连连看游戏,了解连连看游戏的功能和规则等 掌握集成开发工具VS2019的使用和C++的基础编程
了解MFC框架
掌握图的数据结构和应用,图的常用算法,能够利用图的算法实现游戏连通判断和胜负判断
了解企业软件开发过程,应用迭代开发思路进行项目开发,养成良好的编程习惯和培养软件工程化思维

主要仪器设备及耗材

1.安装了Windows 10操作系统的PC机1台
2.PC机系统上安装了Microsoft Visual Studio 2019开发环境


以下是本篇文章正文内容,下面案例可供参考

一、实验要求

(1)线性结构实验要求
连连看游戏是对一堆图案中的相同图案进行配对的简单游戏,在一定的规则之内对相同的图案进行消除处理,在规定时间内消除所有图案后玩家就获胜。
主界面,进行各项操作的入口;
开始游戏,系统根据设置的主题风格生成一个图片布局,以供玩家点击消除
消子,对玩家选中的两种图片进行判断,判断是否符合消除规则;
判断胜负,当游戏完成后,需要判断游戏胜负;
提示,显示界面上能够消除的一对图片;
重排,根据随机数,重新排列游戏地图上的图片;
计时,设定一定时间来辅助游戏是否结束;
游戏模式,有基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进行设置,增强趣味性。

(2)非线性结构实验要求
与线性结构中的功能完全相同,不同点在于游戏数据存储结构和算法。

二、分析与设计(非线性结构)

依据上述的实验目的与要求,可导出实现的连连看游戏的流程为:

① 主界面设计(主界面布局,背景图片绘制)
② 开始游戏(添加游戏对话框,绘制游戏界面背景,游戏界面布局,加载游戏元素图片,绘制游戏地图)
③ 消子判断(添加鼠标事件,选择图片,消除相同元素图片,一条直线消子,两条直线消子,三条直线消子)
④ 判断胜负(判断胜负,控制开始游戏按钮状态)
⑤ 扩展功能(提示,重排)

1.数据结构的设计

代码如下(示例):

//保存游戏地图中的点
typedef struct tagVertex
{
   
	int row;     //行
	int col;     //列
	int info;    //信息类
}Vertex;

图存储结构
AdjMatrix m_AdjMatrix;	//边数组  
	Vertices m_Vertices;//顶点数组
	int m_nVexnum;		//顶点数
	int m_nArcnum;		//边数量

2.核心算法设计

一条直线消子

代码如下(示例):

//连通判断
bool CGameLogic::IsLink(int anMap[][4], Vertex v1, Vertex v2) {
   

	//一条直线消子
	int nRow1 = v1.row;
	int nCol1 = v1.col;
	int nRow2 = v2.row;
	int nCol2 = v2.col;

	//把第一个点保存到数组
	AddVertex(v1);

	//判断能否横向连通
	if (nRow1 == nRow2)
	{
   
		if (LinkInRow(anMap, v1, v2))
		{
   
			AddVertex(v2);       //把第二个点保存到数组
			return true;
		}
	}

	//判断能否纵向连通
	if (nCol1 == nCol2)
	{
   
		if (LinkInCol(anMap, v1, v2) == true)
		{
   
			AddVertex(v2);       //把第二个点保存到数组
			return true;
		}
	}

	//两条直线消子
	if (OneCornerLink(anMap, v1, v2) == true)
	{
   
		AddVertex(v2);
		return true;
	}


	//三条直线消子
	if (TwoCornerLink(anMap, v1, v2) == true)
	{
   
		AddVertex(v2);
		return true;
	}

	DeleteVertex();

	return false;
}

//行号相同时,判断横向是否连通
bool CGameLogic::LinkInRow(int anMap[][4], Vertex v1, Vertex v2) {
   
	int nCol1 = v1.col;
	int nCol2 = v2.col;
	int nRow = v1.row;
	//保证nCol1的值小于nCol2
	if (nCol1 > nCol2) {
   
		//数据交换
		int nTemp = nCol1;
		nCol1 = nCol2;
		nCol2 = nTemp;
	}

	//直通
	for (int i = nCol1 + 1; i <= nCol2; i++)
	{
   
		if (i == nCol2)return true;
		if (anMap[nRow][i] != BLANK)break;
	}//判断这条直线上是否都为空白区域,如果全为空白区域,则横向连通
	return false;
}

//列号相同时,判断纵向是否连通
bool CGameLogic::LinkInCol(int anMap[][4], Vertex v1, Vertex v2) {
   
	int nRow1 = v1.row;
	int nRow2 = v2.row;
	int nCol = v1.col;
	//保证nRow1的值大于nRow2
	if (nRow1 > nRow2)
	{
   
		//数据交换
		int nTemp = nRow1;
		nRow1 = nRow2;
		nRow2 = nTemp;
	}
	//直通
	for (int i = nRow1 + 1; i <= nRow2; i++)
	{
   
		if (i == nRow2)return true;
		if (anMap[i][nCol] != BLANK)break;
	}//判断这条直线上是否都为空白区域,如果全为空白区域,则纵向连通
	return false;
}

两条直线消子

代码如下(示例):

// 判断(nRow1,nCol1)到(nRow2,nCol2)能否连通(两条直线消子)
bool CGameLogic::OneCornerLink(int anMap[][4], Vertex v1, Vertex v2)
{
   
	//直角能够消子,那么顶点一定在与两个点的行和列相交的点,只有这两个点为空,才有可能实现两条直线消子
	int nRow1 = v1.row;
	int nCol1 = v1.col;
	int nRow2 = v2.row;
	int nCol2 = v2.col;
	//确保nRow1<nRow2
	if (nRow1 > nRow2)
	{
   
		int nTemp = nRow1;
		nRow1 = nRow2;
		nRow2 = nTemp;

		nTemp = nCol1;
		nCol1 = nCol2;
		nCol2 = nTemp;
	}

	if (nCol1 > nCol2)
	{
   
		//判断(nRow1 + 1, nCol1)到(nRow2,nCol2 + 1)能否连通
		if (LineY(anMap, nRow1 + 1, nRow2, nCol1) && LineX(anMap, nRow2, nCol1, nCol2 + 1))
		{
   
			Vertex v = {
    nRow2,nCol1,BLANK };
			AddVertex(v
1.实验目的 通过“图片压缩编码”的编程实践,学习树、遍历二叉树、哈夫曼树、哈夫曼编码和他们的编程应用。 (1)掌握树的存储结构 (2)掌握二叉树的三种遍历方法 (3)掌握并理解Huffman树、Huffman编码等知识和应用 (4)掌握文件的操作 (5)使用Huffman算法实现图像压缩程序 2.实验内容 使用Huffman压缩算法,对一幅BMP格式的图片文件进行压缩。图片文件名为“Pic.bmp”,压缩后保存为“Pic.bmp.huf”文件。使用VS2010作为开发工具,开发一个控制台程序,使用Huffman压缩算法对图片文件“Pic.bmp”进行压缩。具体要求如下: (1)读取原文件,统计权值: 运行程序,输入文件名。 以“Pic.bmp”文件为例。若文件存放在F盘根目录下,输入文件完整路径“F:\Pic.bmp”。按回车结束。以字节流的方式,只读打“Pic.bmp”文件。 逐字节读取文件,统计文件中256种字节重复的次数,保存到一个数组中int weight[256]中。 (2)生成Huffman树 根据(1)中统计的结果,构建Huffman树。定义一个结构体来记录每个节点的权值、父节点、左孩子和右孩子。使用结构体数组来存储这个Huffman树。 (3)生成Huffman编码 遍历(2)中生成的Huffman树,记录256个叶子节点的Huffman编码,保存在字符串数组中。 (4)压缩原文件 使用Huffman编码对原文件中的字节重新编码,获得压缩后的文件数据。 (5)保存压缩文件 将编码过的数据,保存到文件“Pic.bmp.huf”中。
武汉理工大学的学生或研究人员开发了多款基于连连看规则的游戏项目,这些项目通常结合教学实践或者科研需求完成。以下是关于如何在武汉理工大学背景下开发连连看游戏的一些常见方法和技术建议: --- ### 方法一:选择合适的编程语言和框架 对于初学者来说,可以采用Python配合Pygame库来实现连连看游戏的基础功能。这种组合简单易上手,适合学生学习阶段使用。例如,利用Pygame绘制游戏界面、处理鼠标点击事件以及判断两个元素是否能够消除。 ```python import pygame pygame.init() # 初始化窗口大小和其他参数 screen = pygame.display.set_mode((800, 600)) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False screen.fill((255, 255, 255)) # 填充背景颜色 pygame.display.flip() # 更新屏幕显示 pygame.quit() ``` --- ### 方法二:设计游戏逻辑算法 连连看的核心在于路径检测算法,确保玩家选中的两块方块可以通过至多三次转弯相连才能被移除。一种常见的解决方案是使用广度优先搜索(BFS),遍历网格寻找符合条件的连接路径。 具体步骤如下: - 创建一个二维数组表示游戏棋盘状态。 - 对每次点击的位置执行BFS检查是否存在合法路径。 独立公式用于计算两点之间的曼哈顿距离以辅助验证: $$ \text{distance} = |x_1 - x_2| + |y_1 - y_2| $$ --- ### 方法三:优化用户体验与美术表现 为了提升游戏吸引力,在基础玩法之上还可以加入动画效果、音效支持以及计时器模块等功能点。比如加载图片素材替换默认图标样式;设置不同难度等级调整初始布局复杂程度等等。 此外,也可以考虑将作品上传到学校官网或者其他公开平台上分享给更多人体验交流反馈意见从而进一步完善产品细节之处。 --- ### 注意事项 由于涉及到版权问题,在制作过程中尽量避免直接复制已有知名版本的画面风格而是创造独特的主题形象如校园风景名胜古迹等特色元素融入其中既体现了本地文化又规避侵权风险同时还能增加趣味性吸引更多目标群体参与进来享受乐趣的同时也能学到知识技能一举两得何乐而不为呢? ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值