12.控制角色移动

一、前言

有了地图,那么接下来我们要做的就是控制角色在这张地图上进行移动。

而且仅移动还不行,我们还得根据情况移动,比如左面是墙,那你就不能再继续向左移动人物了。

当然,每次移动完成,我们都得重新绘制地图,因为只有这样,才能让游戏有“动起来”的感觉。

二、游戏运行框架

想要控制角色移动的想法应该是很简单的:

  1. 得到当前角色的位置
  2. 根据用户按键来决定下一步角色的移动方向。

对于第一步来说,一般有两个解决方案:

  1. 只在第一次加载地图的时候遍历记录一下当前角色在地图中的坐标。
  2. 每次需要的时候都遍历一次地图,得到角色在地图中的坐标。

凭你直觉对比一下这两个方案就能很容易发现,明显第二个方案会比较耗时,因为第二个方案每次都要遍历地图来找角色。

而第一个方案只需要在加载地图的时候,用变量来记录下角色的初始位置,后面移动就只需要按着这个初始位置直接移动角色就行了,而不用每次都去遍历地图。

如果你有这种想法,那么恭喜你,你已经有了优化程序的思想,这就是用空间(变量记录角色坐标)换时间(遍历)的思想,在当代内存价格日渐便宜的情况下,用空间换时间是一种很值得的方式。

只不过呢,由于我们这个游戏计算量太小,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"); //没打印完一行,需要换行
作者:余识
全部文章:0
会员文章:0
总阅读量:0
c/c++pythonrustJavaScriptwindowslinux