本帖最后由 寒冷魔王 于 2015-7-24 15:33 编辑
路路 发表于 2015-7-24 09:57
没有看代码,范围的形状是什么?
十字形,以点为中心,上下左右四周扩散。
如图,上面是传入的移动力消耗地图,下面是生成的结果地图。
代码:map = Map.new(10,10,1) route = Route.new(map,*[5,5]) route.search(3) prints(map);puts prints(route.movmap)
map = Map.new(10,10,1)
route = Route.new(map,*[5,5])
route.search(3)
prints(map);puts
prints(route.movmap)
移动力消耗地图表示在当前点移动时消耗的移动力(增加的移动步数)。
对于空地图来说,每一个点的移动力消耗均为1。
我们可以通过设定将某一个点变为其他值,用以表示阻碍。
表示0为不能到达此处的点,正数为可以到达此处但是移动后会消耗一定移动力;ZOC由于消耗移动力过大(为最大允许移动力Route::MaxMoves+1),所以导致能到达此处不能继续通行。(关于负数的情况由于比较复杂将在后续版本研究)
我们假定起始消耗移动力为0,他的移动力为3,那么他最多消耗3点移动力。
因此会出现如图情况。
移动力消耗地图我们是可以手动更改的。
比如我们获取了某地图的地图分布情况。
data = [
[0,0,0,0,0],
[0,0,3,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,1,0,0],
].faltten
其中3表示敌人,我们需要在3的上下左右点设置为ZOC。由于Map传递的是引用,想要更改data,这种时候只需方便的调用Map书写:
data = [ [0,0,0,0,0], [0,0,3,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,1,0,0], ].flatten map = Map.new(5,5,data) map[2,0] = 6 // 在外面建议使用比较安全的[x,y]方法,而不是get(x,y) map[1,1] = 6 map[3,1] = 6 map[2,2] = 6 p data
data = [
[0,0,0,0,0],
[0,0,3,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,1,0,0],
].flatten
map = Map.new(5,5,data)
map[2,0] = 6 // 在外面建议使用比较安全的[x,y]方法,而不是get(x,y)
map[1,1] = 6
map[3,1] = 6
map[2,2] = 6
p data
我们可以看到data被完美地更改了。
关于支持的形状,SMRC允许地图分割。
data = [ [0,0,0,0,0], [0,0,3,0,0], [0,0,0,0,0], [0,0,0,0,0], [0,0,1,0,0], ].flatten
data = [
[0,0,0,0,0],
[0,0,3,0,0],
[0,0,0,0,0],
[0,0,0,0,0],
[0,0,1,0,0],
].flatten
如图地图,我们的1左面和右面希望是不同的,两个有着不同的移动力
只需分来,设置为不可移动即可。
data1 = [ [0,0,0,4,4], [0,0,3,4,4], [0,0,0,4,4], [0,0,0,4,4], [0,0,1,4,4], ].flatten data2 = [ [4,4,4,0,0], [4,4,4,0,0], [4,4,4,0,0], [4,4,4,0,0], [4,4,1,0,0], ].flatten
data1 = [
[0,0,0,4,4],
[0,0,3,4,4],
[0,0,0,4,4],
[0,0,0,4,4],
[0,0,1,4,4],
].flatten
data2 = [
[4,4,4,0,0],
[4,4,4,0,0],
[4,4,4,0,0],
[4,4,4,0,0],
[4,4,1,0,0],
].flatten
分别传给Route,然后将两个运算结果合并就行了。
由于传入参数为数组,我们可以方便地修改Ruby中便利的Array以达到修改数据的目的。
同时,由于传入为引用,我们可以方便地利用Map修改这一数据。 |