【QT】迷宫寻宝

0. 设计要求

设计一个迷宫寻宝游戏的程序,实现以下功能:

  1. 设计一个迷宫地图,包含墙壁、通道、宝藏和敌人。可以使用不同的字符表示地
    图的各个元素。
  2. 程序随机生成迷宫地图,并在地图上随机放置宝藏和敌人。
  3. 玩家通过控制字符移动,尝试找到宝藏。玩家可以使用上、下、左、右四个方向
    键控制移动。
  4. 程序判断玩家的移动,检测是否撞墙、走出地图边界、找到宝藏、碰到敌人。
  5. 程序根据玩家的移动情况给出相应的提示,如撞墙、走出边界、找到宝藏或继续
    寻找宝藏。
  6. 敌人会随机移动并阻碍玩家的前进,玩家如果与敌人相撞,游戏失败。
  7. 提供计分功能,记录玩家寻找宝藏的次数,并在找到宝藏后展示最终结果。
  8. 玩家可以选择重新开始游戏或退出游戏。
    要求:
  9. 提供迷宫地图的大小自定义功能。可以设置为不同的行数和列数。
  10. 提供难度级别选择功能。提供不同的难度级别,如简单、中等和困难,难度级别
    会影响迷宫的复杂度和敌人的行为。
  11. 敌人每次只能并且必须随机移动一个位置,但是敌人不能穿墙、不能走出边界、
    不能触碰宝藏、不能与其他敌人相撞。
  12. 提供游戏存档和读档功能。玩家可以在游戏进行中保存进度,并在下次继续游戏
    时加载之前的存档。

1. 程序设计

1)设计思想:

系统设计使用了QT来进行界面可视化,设计了三个界面分别作为程序的开始界面、难度选择界面和游戏界面,界面的类beginGame、choose、Map类继承自QDialog类。

beginGame类是开始界面的类,包括了两个行为,新创建一个游戏和读取存档两个功能,通过槽函数分别和界面中的两个QPushButton进行连接,当用户点击开始游戏界面中的“开始游戏”按钮时调用startGame函数打开选择游戏界面大小和难度的界面;当用户点击“读取存档”按钮时程序会从默认的位置处读取指定的txt文件,文件中包含了一个矩阵以及最后一行的难度。

choose主要实现从界面中读取用户设置的游戏界面的大小和难度,在构造函数中对界面中的QPushButton和QSpinBox进行了设置,设置了两个QSpinBox的范围在5~50之间,QPushButton中给出了可供选择的难度简单、中等、困难,获取设置后将这些参数传给游戏界面的Game类。

Game类是游戏的类,包括Map类的一个对象,Game类主要将参数传递给Map类的对象实现对游戏地图的初始化。

Map类中的generateMap函数完成了对存储游戏地图的字符型数组matrix的实时更新,游戏地图中的每个格子分别用矩阵中的一个元素来表示,字符型数组matrix分别字符类型的0表示通道,1表示墙壁,2表示敌人,3表示宝藏,4表示用户,在generateMap函数中根据设置的难度和地图大小来随机生成了相应的墙壁和敌人,简单难度时墙壁数量为所有格子的25%,敌人为4%,中等难度时墙壁数量为所有的30%,敌人为8%,困难难度时墙壁数量是所有的35%,敌人为12%,函数中使用了rand函数进行了随机生成。

在displayMap函数中使用了QGraphicView作为画部,结合数组的大小计算每个格子的大小cellSize,每次清楚绘制内容后再进行重绘,结合字符型数组matrix判断相应位置是什么后通过QGraphicsRectItem添加边界和相应的内部填充的图片。

saveGame函数和loadGame分别实现了存储游戏和读取游戏的功能,即存储数组matrix和难度到txt文件中以及读取。txt文件中先存储了二维数组,最后一行单独存储了难度仅一个值。

isWall、isOutside、isEnemy、isTreasure、isPlayer五个函数分别传入用户或者敌人下一步将运动到的格子后判断是否为墙壁、出界、敌人、宝藏、玩家,返回对应的布尔值,在用户或是敌人的运动过程中帮助判断是否能够运动。

keyPressEvent函数是QT的键盘事件,判断用户在键盘中按下的按键后,判断是否能够移动以及通过statusGame函数判断是否赢得或者输掉了比赛,在statusGame函数中判断了下一个位置是否为宝藏,是否为敌人,当都不是时返回3表示游戏继续,如果能够移动且游戏继续则调用movePlayer函数对matrix数组进行调整,将用户现在的位置设置为通道,移动的下一位置设置为字符4。当用户赢得游戏或是失败时调用generateMap函数和displayMap函数重新生成和绘制地图。

moveEnemy函数进行了随机移动敌人,在1~4中随机生成了一个数表示一个方向,再通过judgeMoveEnemy函数判断该方向是否能够移动,即没有出界、不是墙壁、宝藏和敌人,如果能够移动则将下一个位置设置为字符2,现在的位置设置为通道;如果不能移动则重新随机生成一个数,直到能够移动。

Map类有两个构造函数,可以通过获取用户设置的地图大小和难度来初始化地图或者读取存档来初始化地图,在两个构造函数中均通过QTimer对象设置了间隔一段时间来循环敌人个数次来调用moveEnemy函数来移动每一个敌人,根据难度不同设置了不同的间隔时间。

设计表示:
程序设计的UML类图如下图所示:
在这里插入图片描述

【调试报告】

运行结果:

游戏的开始界面:
在这里插入图片描述

游戏选择地图大小和难度的界面:
在这里插入图片描述

当用户找到宝藏时提示游戏成功,找到宝藏。
在这里插入图片描述

当用户遇到敌人游戏失败,弹出提示:
在这里插入图片描述

存储的游戏格式如下图:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值