检查TI-Basic列表中的每个值

时间:2010-09-03 01:15:40

标签: optimization ti-basic

我正在用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分之后无法比赛更好。

使用程序集不是一种选择,因为我没有链接电缆(或者想要编写程序集)。

3 个答案:

答案 0 :(得分:2)

从未使用过TI-Basic ...

但是如何存储游戏板的2D阵列呢。该数组中的每个元素都表明蛇是否存在。向前移动时,在头部点设置数组的值,并清除旧尾端点的值。然后,为了测试碰撞,你可以只对2D数组进行一次查找。

答案 1 :(得分: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=LYsum()检查两个列表的交集中是否有1

答案 2 :(得分: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

比2D阵列更具记忆力。