在很多生存 / 沙盒类游戏中,地图往往是随机生成的,例如:饥荒、我的世界等。那我们该如何在scratch中实现这一点呢?
在scratch中有两种办法可以实现——画笔和克隆体。我们这次先聊克隆体。
我们可以先将克隆体设置为方形的,再由一个个方形相互连接形成一个方形的大地图,这些克隆体可以改变颜色来模拟不同的地形(沙漠、森林、平原......),仔细想想,这些方形是不是和我的世界中的方块很像?没错,这和我的世界原理差不多,只是我们的是2D的而已。
提示:编写此程序需开启无限复制
下面我们进入到实践环节:
1.绘制克隆体
我们先绘制一个没有边框的正方形,边长15格(一格4个坐标,边长也就是60个坐标)。当然,你也可以设置成其它大小,只不过这样是整数,方便计算。(正方形可以略大一点点,不然运行放大时会有一丝丝缝隙)
如图所示
2.编写程序
我们先设置几个变量:行数、列数、克隆数、私有克隆数(私有变量)。
行数和列数就是指地图的尺寸,十行十列的地图就有100个格子。而克隆数和私有克隆数就是帮克隆体弄清楚自己的编号,是第几个,以此来知道自己该在第几列第几行,知道自己的坐标在哪儿。
程序部分最开始是设置初始变量(这里尺寸设置的是10*10),然后隐藏本体,再将克隆数加一,克隆一次自己。都好理解,难的部分在克隆体的程序。
本体的程序
下面再看克隆体的程序,先是显示,再将私有克隆数设置为当前的克隆数(这一步就不用多说了,私有变量是可以让克隆体自己拥有的,相当于给自己编了个号)。
由于让本体一个个复制克隆体太慢了,不如让克隆体复制克隆体,再让被克隆的克隆体复制出一个新的克隆体......这样克隆体的数量就成倍增长,速度翻了几十倍,就连复制一万个也是眨眼间的事。只要让克隆体重复执行复制直到总数量等于行数成列数就行了。
运行上面的程序后如果发现克隆数瞬间到了100,就成功了。下一步就是要让这些克隆体各归其位,排列成一个正方形了。(为了方便观察效果,我们先把行列数改成3*3的,另外,如果你不想让电脑卡死,最好别超过100*100)
我们先设置两个私有变量给克隆体用,分别是x和y。这两个变量是赋予克隆体自己的坐标的。
那怎么才能让克隆体各归其位呢?原理很简单,就跟小学学的列队做早操或排方阵的题差不多,无非就是把让你根据总人数算行列数变成了让你算是第几列第几行的。
具体公式如下:
上面是x坐标,下面是y坐标
前面挺简单的,但后面乘以60是什么意思呢?前面我们提到过,克隆体的边长是60个坐标,乘60就是为了让克隆体之间隔开一定距离。
我们再将这个公式套入程序里:
这时那两个变量便派上用场了,"移到x:x y:y"再让克隆体移到对应位置,因为地图是要实时移动的,需要再加一个重复执行。
试着运行一下:
没错,程序出错了。右边那一列竟然向上窜出了一格,但是问题出在哪儿呢?
这一看就是y坐标的问题,所以我们将刚才的公式再验算一下:
设克隆体编号为1: 1/3=0……1 (1-1)/3*60=0
设克隆体编号为2: 2/3=0……2 (2-2)/3*60=0
设克隆体编号为3: 3/3=1……0 (3-0)/3*60=60
设克隆体编号为6: 6/3=2……0 (6-0)/3*60=120
最终我们发现如果克隆体的编号是列数的倍数,他就会多出60个坐标。
所以我们要判断这个克隆体的编号是否是列数的倍数,如果是,就要减去60个坐标。