3

我正在用 TI-Basic 编写蛇游戏,每次移动时,我都需要查看蛇的头部是否碰到了尾部的任何一点。尾部存储为基于循环列表的队列,我可以在恒定时间内添加开始和结束。

唯一困难的部分是我必须在每次迭代中做类似的事情:(S = 列表的大小)

For(I,1,S)
    If X=LX(I) and Y=LY(I)
    Then
        Disp "GAME OVER"
        Return
    End
End

这是一个相当短的循环,但即使在 10 个项目的列表上也需要很长时间。我尝试了顺序方式:

If sum(seq(X=LX(I) and Y=LY(I),I,1,S))
...

我能想到的唯一其他优化是不检查 N 到 N+2 的值(因为可能命中的尾巴的第一部分是 N+3),但这只会在 4 点之后推迟问题,并且14分无法玩的游戏并不比10分后无法玩好。

使用汇编不是一种选择,因为我没有链接电缆(或编写汇编的愿望)。

4

3 回答 3

2

没用过TI-Basic...

但是如何也存储游戏板的 2D 数组。该数组中的每个元素都指示蛇是否存在。向前移动时,将数组的值设置在头点处,并清除旧尾点处的值。然后为了测试碰撞,您只需对 2D 数组进行一次查找。

于 2010-09-03T01:26:53.487 回答
2

整个区块:

For(I,1,S)
    If X=LX(I) and Y=LY(I)
    Then
        Disp "GAME OVER"
        Return
    End
End

可以替换为:

If sum(X=LX and Y=LY)
Then
    Disp "Game Over"
    Return
End

X=LX将测试分段应用于 的每个元素LX,同样适用于Y=LY. 检查两个列表的交集中sum()是否存在 a 1

于 2014-05-02T17:02:29.760 回答
1

当我对 Snake 进行编程时,我所做的是检查蛇前面的像素是否打开。如果是,我会检查这个像素是否是“食物”像素,否则游戏会停止。

例如,I 和 J 是头尾位置,(F, G) 是蛇的方向,(M, N) 是食物。

if Pxl-Test(I+F, J+G) #pixel in front of snake
then
if I+F=M and J+G=N
stop
end

比二维数组更节省内存。

于 2012-05-18T04:52:42.180 回答