Freerefill 发表于 2022-7-6 11:53:20

网格上的路径

所以我的一个同事要求我写另一个AutoCAD游戏,这次是一个防御游戏。对于那些不熟悉这个概念的人来说,这很简单:通过将防御结构(墙壁、炮塔等)放置在网格中,来保护你的塔楼免受敌人的入侵。
 
这样的挑战不容忽视!
 
建造导弹炮塔很容易,我的导弹防御演示已经练得够多了。移动实体以及创建实体和防御结构也很容易。我意识到困难的部分是给敌人提供必要的人工智能,以便在网格上找到通往目标区域的理想路径。
 
我费了好大劲,在谷歌上搜索了一下物流方面的灵感,终于找到了我要找的东西。通过创建概念网格并在网格上选择目标位置(我称之为种子),我可以确定初始种子的所有相邻单元的移动成本为1,以便到达目标区域。向外工作,我可以在这些相邻的细胞上执行相同的任务;称它们为“种子”,忽略目标,它们的所有相邻单元的移动成本为2,以此类推。
 
现在,由于这最终将成为游戏的一部分,移动成本将必须动态更新。这意味着,确定单元成本的函数必须高效,能够非常快速地计算整个电网的成本。对于30 x 20网格,时间约为0.6秒(对于我的计算机)。这并不坏,但也不太好。然而,我知道我在这方面不是最好的,所以说正题,有什么方法可以提高效率吗?
 
以下是目前为止的代码:
 
(defun make\u screw\u数组(/i cost\u数组);主函数(setq i(getvar“cdate”))(setq cost\u array(get\u cell\u cost’((1 1)0))(make\u level\u array 30 20 nil));(if(apply’and(mapcar’cadr cost_array))(princ“\n成功!:D”)(princ“\n失败!D:);(show_cost cost数组)(princ(*((((getvar“cdate”)i)1000000))(princ))(defun show_cost(listy/)(mapcar’(lambda(x)(vl cmdf“text”“j”“MC”(car x)0.30(cond((numberp(cadr x))(itoa(cadr x)))((cadr x)“x”)((not(cadr x))“D:)))listy);放置表示每个单元格旅行成本的文本实体(defun get\u cell\u cost(seeds level/cost leaves flowers i)(setq cost(1+(cadar seeds)));植物种子(foreach forVar种子(setq水平(subst forVar(assoc(car forVar)水平))水平);Get LEVES(相邻单元格)(setq LEVES(apply‘append(mapcar’(λ(x)(Get_相邻_单元格x))(mapcar‘car seeds)));花(相邻细胞的,所有有效细胞;水平内,未占用和零成本)(setq花(vl remove if not’(λ(x)(和(setq i(vl位置x(mapcar‘car水平))))(not(cadr(nth i水平)k)'))));花卉产生种子(具有相关状态和更新成本的所有花卉列表)(如果花卉(get_cell_cost(mapcar)(lambda(x)(list x cost))(remDups Flowers 0))级别);计算每个单元的成本(defun get\u相邻单元(cell/)(list(list(1+(car cell))(cadr cell))(list(1-(car cell))(cadr cell))(list(car cell)(1+(cadr cell)))(list(car cell)(1-(cadr cell)))(defun make\u level\u array(totX totY useCel/i j retn);其中是已使用单元格的列表(setq i 1 j 1)(而(

Lee Mac 发表于 2022-7-6 12:10:46

伙计,
 
看看这个
 
http://www.theswamp.org/index.php?topic=31050.0

Freerefill 发表于 2022-7-6 12:21:49

很酷的东西,李,非常感谢。我注意到Kerry与我使用的逻辑技术几乎相同,但我在他的代码中没有看到递归函数(发布在这里:http://www.theswamp.org/index.php?topic=31050.msg366308#msg366308). 我会仔细看看。他的代码似乎运行得很快,但很难用所有的矩形绘制等等来判断。
 
总的来说,在可能的情况下使用递归函数还是使用while循环更好?或者,这在很大程度上取决于形势吗?

Lee Mac 发表于 2022-7-6 12:29:31

 
尽管递归循环很优雅,但它的唯一优点是减少了代码量。
 
递归方法速度较慢,因为它们必须在堆栈上运行,并且使用更多内存。

Freerefill 发表于 2022-7-6 12:52:45

 
啊,我明白了。我将尝试使用循环重写它。再次感谢。^。^

Lee Mac 发表于 2022-7-6 13:00:13

 
不客气,伙计,祝你好运
页: [1]
查看完整版本: 网格上的路径