用easyX制作一个胀!棋

用easyX制作一个胀!棋

代码

引言

为什么叫胀!棋

说来话长,长话短说就是高中班主任姓张,我们喜欢戏称他为胀老师。而且胀老师本人比较有特色,执教了我和魏旭三年,教了鱿鱼两年,回忆起高中往事时,难免不喊一句:噫嘘唏,胀!。


如标题所见,这个游戏是使用easyX制作的。笔者第一次正式用多文件来写项目,依稀记得上一次的python项目一个文件写了几千行。

多文件的好处显而易见,使我的代码逻辑清晰。

游戏玩法

借鉴了《无人深空》的玩法,棋盘上每一个棋格起初都是未知的,棋子通过移动来探索未知棋格。

棋盘分成四个区域,每次游戏开始区域随机分配。每个区域能爆出来的东西不一样,包括资源星球,虫洞和什么都没有。虫洞可以随机传送,两个大炮都是用来进攻的(选中己方棋子后,点击对方棋子),中子大炮更厉害,能穿过护盾。飞船推进器用来增加飞行距离(曼哈顿距离),修复套件回复生命。

遇到的问题

随机数生成

1
2
srand((unsigned)time(0));
return rand();

这样的随机数生成会莫名其妙出现报错,报错信息在time.h里。本以为是同一时间调用了太多次rand()导致的(要生成坐标(x, y),且不能重复)。然后改进了一下,每一次只调用一次rand(),发现还是会产生这样的问题,而且数字的随机性也会有所降低。

于是在bilibili上得知了这样一种获取随机数的方法:

1
2
3
4
5
6
7
#include<random>
int generateRondom(int low, int high)
{
std::random_device rd;
std::uniform_int_distribution<int> dist(low, high);
return dist(rd);
}

非常好用 :)

这下可以实现全地图乱飞了

wchar_t造成的各种问题

easyX函数使用的字符串都是宽字符问题的,然而如果要将char转wchar_t又会很麻烦。并且我还要把飞船的各种信息(包括int类型)用wchar_t表示出来。中间涉及的类型转换折磨了我很久,最终我找到了一个解决方案。

那就是使用wstring类型

1
2
3
4
5
6
#include<wchar.h>

int num;
std::wstring sInfo = std::to_wstring(num);//int转wstring
sInfo = L"other information" + sInfo;//string就好在可以直接连接
const wchar_t* wInfo = sInfo.c_str();//wstring转wchar_t

跨文件访问变量

当你想要使用另一个文件中的变量时,函数传输太过于繁琐,这时候extern 声明便可以派上用场。只要在声明前加上一个extern,你就可以访问到其他文件的同名变量。

1
2
3
4
5
a.cpp
int a = 1;
b.cpp
extern int a;
cout << a << endl; //结果为1

而且变量的变化是全局的

心得

多文件固然好,但是如果是做一步算一步,就会导致整个代码逻辑混乱,变量声明不规范。

这些意识只有多做一些项目才能积累起来。以后写项目时,应该先想好项目逻辑,将其中的对象封装为struct;以及将一些UI和操作批量封装。比如按钮绘画,按钮判定,文字输出等等。

四种棋盘区域

炙热空间

颜色为红色。

生命空间

颜色为绿

海洋空间

颜色为蓝

矿物空间

颜色为蓝