用easyX制作一个胀!棋
引言
为什么叫胀!棋
说来话长,长话短说就是高中班主任姓张,我们喜欢戏称他为胀老师。而且胀老师本人比较有特色,执教了我和魏旭三年,教了鱿鱼两年,回忆起高中往事时,难免不喊一句:噫嘘唏,胀!。
如标题所见,这个游戏是使用easyX制作的。笔者第一次正式用多文件来写项目,依稀记得上一次的python项目一个文件写了几千行。
多文件的好处显而易见,使我的代码逻辑清晰。
游戏玩法
借鉴了《无人深空》的玩法,棋盘上每一个棋格起初都是未知的,棋子通过移动来探索未知棋格。
棋盘分成四个区域,每次游戏开始区域随机分配。每个区域能爆出来的东西不一样,包括资源星球,虫洞和什么都没有。虫洞可以随机传送,两个大炮都是用来进攻的(选中己方棋子后,点击对方棋子),中子大炮更厉害,能穿过护盾。飞船推进器用来增加飞行距离(曼哈顿距离),修复套件回复生命。
遇到的问题
随机数生成
1 | srand((unsigned)time(0)); |
这样的随机数生成会莫名其妙出现报错,报错信息在time.h里。本以为是同一时间调用了太多次rand()导致的(要生成坐标(x, y),且不能重复)。然后改进了一下,每一次只调用一次rand(),发现还是会产生这样的问题,而且数字的随机性也会有所降低。
于是在bilibili上得知了这样一种获取随机数的方法:
1 |
|
非常好用 :)
这下可以实现全地图乱飞了
wchar_t造成的各种问题
easyX函数使用的字符串都是宽字符问题的,然而如果要将char转wchar_t又会很麻烦。并且我还要把飞船的各种信息(包括int类型)用wchar_t表示出来。中间涉及的类型转换折磨了我很久,最终我找到了一个解决方案。
那就是使用wstring类型
1 |
|
跨文件访问变量
当你想要使用另一个文件中的变量时,函数传输太过于繁琐,这时候extern 声明便可以派上用场。只要在声明前加上一个extern,你就可以访问到其他文件的同名变量。
1 | a.cpp |
而且变量的变化是全局的
心得
多文件固然好,但是如果是做一步算一步,就会导致整个代码逻辑混乱,变量声明不规范。
这些意识只有多做一些项目才能积累起来。以后写项目时,应该先想好项目逻辑,将其中的对象封装为struct;以及将一些UI和操作批量封装。比如按钮绘画,按钮判定,文字输出等等。
四种棋盘区域
炙热空间
颜色为红色。
找到资源星球的权重为50/100。
- 资源星球上发现熔岩(血量或护盾减少)权重为1
- 光子大炮:4
- 中子大炮:2
- 飞船修复套件:1
- 护盾:1
- 飞船推进器:3
- 资源星球上发现熔岩(血量或护盾减少)权重为1
找到虫洞的概率为5/100。
生命空间
颜色为绿
找到资源星球的权重为60/100。
- 光子大炮:3
- 中子大炮:1
- 飞船修复套件:3
- 护盾:2
- 飞船推进器:3
- 光子大炮:3
找到虫洞的概率为3/100。
海洋空间
颜色为蓝
- 找到资源星球的权重为65/100
- 光子大炮:2
- 中子大炮:3
- 飞船修复套件:2
- 护盾:1
- 飞船推进器:2
- 光子大炮:2
- 找到虫洞概率为3/100
矿物空间
颜色为蓝
找到资源星球的权重为55/100
- 光子大炮:3
- 中子大炮:3
- 飞船修复套件:2
- 护盾:4
- 飞船推进器:1
- 光子大炮:3
找到虫洞概率为6/100