代码之家  ›  专栏  ›  技术社区  ›  Brendan Long

在ti basic中检查列表中的每个值

  •  3
  • Brendan Long  · 技术社区  · 14 年前

    我正在用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 回复  |  直到 10 年前
        1
  •  2
  •   Detmar    14 年前

    从未使用过Ti-Basic…

    但是,还可以存储一个游戏板的二维数组。该数组中的每个元素指示是否存在蛇。向前移动时,在头部点设置数组的值,并清除旧尾部端点的值。然后,为了测试碰撞,您只需对二维数组进行一次查找。

        2
  •  2
  •   Vaelus    11 年前

    整个街区:

    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() 检查是否有 1 在两个列表的交叉处。

        3
  •  1
  •   beary605    12 年前

    我在编程Snake时所做的就是检查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
    

    比二维数组节省更多的内存。

    推荐文章