# 汇编小游戏——黄金矿工
## 1.项目介绍
若要开始游戏,请运行./Release/GAME.exe。
若上述方法无法开始游戏,可以在visual studio中切换到Debug模式下手动编译运行。编译前请先修改链接器中的附加库目录和属性页最下方MS Assembly中的IncludePath。分别添加masm32的目录和项目的目录。
### 1.1.项目结构
项目文件夹的结构如下:
```
Gold-Miner
├─Release
│ ├─GAME.exe
├─Gold-Miner
│ ├─include
│ ├─main.asm
│ ├─vars.asm
│ ├─controller.asm
│ ├─model.asm
│ ├─view.asm
├─lib
└─resource
├─icon
└─music
```
- ./Release/GAME.exe:生成的可执行文件,点击即可直接开始游戏
- ./Gold-Miner/main.asm:程序入口,包含main子函数,即程序开始运行的地方。
- ./Gold-Miner/vars.asm:定义的全局变量
- ./Gold-Miner/controller.asm:控制器模块,负责捕获用户的鼠标和键盘事件
- ./Gold-Miner/model.asm:以不同方式响应用户的不同事件,根据游戏逻辑调用函数,修改全局变量
- ./Gold-Miner/view.asm:根据当前的全局变量,绘制游戏界面
- ./Gold-Miner/include:包含所有.inc文件
- ./lib 包含图形库acllib,以及自己手写的c语言库
- ./resource:游戏的图片和音乐素材
### 1.2.游戏操作
鼠标左键点击:
- 在欢迎界面点击任意位置,开始游戏
- 在游戏界面点击地下部分区域,释放钩索
- 在游戏界面点击menu,回到欢迎界面并重新开始游戏
- 在商店界面点击道具,购买道具
键盘:
- 空格,释放鞭炮
- `←`键和`→`,操作电动勾
### 1.3.游戏描述
不同物体的半径、重量、价值:
| 类别 | 半径 | 重量 | 价值 |
| :-------: | :-------------------: | :-----------: | :-----: |
| 0(石头) | 20像素 | 80像素/秒 | 10 |
| 0(石头) | 35像素 | 40像素/秒 | 20 |
| 1(金块) | 20像素 | 120像素/秒 | 50 |
| 1(金块) | 35像素 | 80像素/秒 | 100 |
| 1(金块) | 50像素 | 30像素/秒 | 500 |
| 2(钻石) | 20像素 | 120像素/秒 | 600 |
| 3(福袋) | 20像素 | 30~120像素/秒 | 10~1200 |
| 4(TNT) | 35像素(爆炸半径200) | 无 | 无 |
不同物体在各关的出现概率:
| 类别 | 出现概率(1~2关\3~4关\5关及以后) |
| :--: | :-----------------------------: |
| 石头 | 0.1\0.2\0.2 |
| 金块 | 0.4\0.4\0.3 |
| 钻石 | 0.2\0.1\0.1 |
| 福袋 | 0.2\0.1\0.1 |
| TNT | 0.1\0.2\0.3 |
道具功能介绍:
| 道具 | 效果 |
| :--------: | :--------------------------------------: |
| 石头收藏书 | 提高石头价值(石头价值*2) |
| 鞭炮 | 不必多说,空格释放 |
| 神水 | 提高拉回速度(拉回速度*2) |
| 幸运草 | 提高福袋出现概率(由10%提升为33%) |
| 磁铁 | 可以吸住金子(金子的判定半径增加30) |
| 电动勾 | 可以控制钩子下降角度(使用←、→控制方向) |
## 2.程序设计描述
这部分玩家不用看,只是为了向老师证明我们是自己做的
### 2.1.概述
采用MVC架构,model负责根据游戏逻辑维护游戏的全局变量,view负责根据全局变量绘制界面,controller负责响应用户事件。
### 2.2.全局变量
#### 窗口
当前窗口`curWindow`:DD,指示当前所在的游戏界面。0为欢迎界面,1为游戏界面,2为过关界面,3为失败界面。
#### 窗体
游戏有效区域的高度和宽度`gameX` `gameY`:DD。
#### 时间
本关卡剩余时间`restTime`:DD。以s为单位。
定时器`timer`:每10ms为一个时间片,为游戏的最小时间单元。在每个时间片开始或结束时触发定时器,model维护全局变量,且view根据维护后的全局变量重绘界面。
#### 得分
目标得分`goalScore`:DD,本局游戏的目标得分。
当前得分`playerScore`:DD,当前得分。在各关卡累加。仅当用户主动返回菜单或游戏未过关被动结束时清零。
#### 矿工
`minerPosX`:DD,矿工位置X坐标。
`minerPosY`:DD,矿工位置Y坐标。
#### 物体
`lastHit` DD,上一次命中的物体的下标。(注意是28的倍数)
`itemNum` DD,物体数量。
为方便起见,认为物体的**逻辑形状**是圆心位置固定的圆,**视觉形状**是不规则的图形(加载素材)。
描述一个物体的结构体`Item`定义如下:
* 存在`exist`:DD,1存在,0不存在。
* 类型`type`:DD,枚举值,{石头,金块,钻石,福袋,TNT}。
* X位置`posX`:DD,物体的圆心位置X坐标。
* Y位置`posY`:DD,物体的圆心位置Y坐标。
* 半径`radius`:DD,物体的半径。
* 重量`weight`:DD。
* 价值`value`:DD。
#### 钩索
当前钩索状态`hookStat`:DD,当前钩索是否被释放。1时释放,表现为下一次触发时间片时钩索位置变化,钩索角度不变;0时不释放,表现为下一次触发时间片时钩索角度变化,钩索位置不变。
当前钩索角度移动方向`hookODir`:DD,**仅当hookStat为false时有意义。**为0时向右转,为1时向左转。
当前钩索位置移动方向`hookDir`: DD,**仅当hookStat为true时有意义。**为0时向下移动(回收),为1时向上移动(下放)。
钩索角速度`hookOmega`,DD,常量。
钩索线速度`hookV`,DD,有一基础值(下放和未命中回收时),命中回收时依赖于抓到的物体类型。
---
钩索角度`hookDeg`:DD,取值范围为180~360度。
钩索位置`hookPosX` `hookPosY`:DD。
不同hookStat和hookDir(或hookODir)组合的含义如下:
| hookStat | hook(O)Dir | 含义 |
| -------- | ------------ | -------- |
| 0 | 0(ODir) | 向右转 |
| 0 | 1(ODir) | 向左转 |
| 1 | 0 | 向下移动 |
| 1 | 1 | 向上移动 |
### 2.3.控制器
#### 用户事件回调函数:释放钩索
; @brief: 鼠标点击游戏区域时,释放钩索。
; @read: 无
; @write: 写`hookStat`为1,写`hookDir`为0,写`hookV`为默认值(120),写`lastHit`为-1。
### 2.4. 模型
触发定时器时,依次调用以下函数。
#### 函数:钩索移动
根据`hookStat`,计算并更新`hookPos`或`hookDeg`。
#### 函数:判断钩索是否命中物体
; @brief: 判断钩索是否命中物体。遍历items中所有物体的位置(posX、posY),判断钩索位置与物体位置的距离是否小于物体半径。
; @read: hookPosX,hookPosY,Items
; @write: lastHit,hookDir,hookV。若命中,写lastHit为命中物体的下标,写hookDir为1,写hookV为f(Items[lastHit].weight)。
#### 函数:判断钩索是否出界
; @brief: 判断钩索是否出界或回到矿工手中。
; @read: hookPosX,hookPosY,lastHit
; @write: hootDir,hookStat,Items,playerScore。若出界,写hookDir为1;若回到矿工手中,写hookStat为0,写Items[lastHit].exist为0,写playerScore+=Items[lastHit].value
### 2.5.问题与解决方法
1. 离散刷新问题。在刷新间隔长且物体半径小的情况下可能“掠过”物体,即未响应应该响应的isHit。解决方法:缩短刷新间隔,增大物体的半径。
2. 计算机坐标系与常规坐标系不一致。计算机坐标系$(x,y)$ = 常规坐标系$(-y',x')$。`hookDeg`在常规坐标系上定义,取值范围$[180,360]$。故当调用moovHook改变钩索位置时,移动增量$(Δx,Δy) = (-ρsinθ, ρcosθ)$,其中 $θ$ �
实现汇编小游戏黄金矿工【100012756】
版权申诉
5星 · 超过95%的资源 23 浏览量
2023-06-20
14:25:52
上传
评论
收藏 9.29MB ZIP 举报
神仙别闹
- 粉丝: 2687
- 资源: 7642
最新资源
- 抽取地下水对加州约塞米蒂国家公园山地湿地复合体可持续性的影响
- C++vector介绍及详细使用示例(源代码)
- java基于GUI的简单记事本
- 指纹识别-基于OpenCV实现的指纹识别算法-附项目源码.zip
- 206693250008_R01C02_Grn.idat
- 瞳孔跟踪-基于OpenCV+网络摄像头的瞳孔跟踪算法实现-附项目源码+流程教程-优质项目分享.zip
- ModStartCMS v8.4.0 框架稳定性持续迭代,修复部分已知问题
- bleder 教室学校学生教育室办公室考试
- 人脸检测-使用OpenCV实现的动漫+漫画人脸检测算法-附项目源码-优质项目实战.zip
- 道路贴图,材质材料免费
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈