一、前言
有了地图,那么接下来我们要做的就是控制角色在这张地图上进行移动。
而且仅移动还不行,我们还得根据情况移动,比如左面是墙,那你就不能再继续向左移动人物了。
当然,每次移动完成,我们都得重新绘制地图,因为只有这样,才能让游戏有“动起来”的感觉。
二、游戏运行框架
想要控制角色移动的想法应该是很简单的:
- 得到当前角色的位置
- 根据用户按键来决定下一步角色的移动方向。
对于第一步来说,一般有两个解决方案:
- 只在第一次加载地图的时候遍历记录一下当前角色在地图中的坐标。
- 每次需要的时候都遍历一次地图,得到角色在地图中的坐标。
凭你直觉对比一下这两个方案就能很容易发现,明显第二个方案会比较耗时,因为第二个方案每次都要遍历地图来找角色。
而第一个方案只需要在加载地图的时候,用变量来记录下角色的初始位置,后面移动就只需要按着这个初始位置直接移动角色就行了,而不用每次都去遍历地图。
如果你有这种想法,那么恭喜你,你已经有了优化程序的思想,这就是用空间(变量记录角色坐标)换时间(遍历)的思想,在当代内存价格日渐便宜的情况下,用空间换时间是一种很值得的方式。
只不过呢,由于我们这个游戏计算量太小,10*12的地图每次最多也就120次,在计算机眼里可能就几毫秒的功夫,我们人根本感受不到这种差距。
因此在这种情况下,两种方式都是可行的。
但为了尽量简化代码,我这里首先采用第二种方式,即:在需要的时候遍历找到角色位置即可。
一般来说,只要涉及到空间换时间的性能优化问题,程序复杂度就会瞬间上升,程序难度就会开始变大,这也是算法工程师薪资普遍偏高的原因。
而第二步,就用到了前面说过的接收按键输入的知识了,倒也没啥可说的,直接往下看吧!
紧接前文的代码,由于我们需要每次移动人物都打印地图,复制一大堆代码实在很麻烦,这个时候一般就会考虑将代码进行封装,就像下面这样:
void print_map(int map[10][12]) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 12; j++) {
if (map[i][j] == 0) { //如果为0,代表是空格
printf(" ");
}
else {
printf("%d ", map[i][j]); //否则,将其打印出来
}
}
printf("\n"); //没打印完一行,需要换行