Проверьте каждое значение в списке в TI-Basic - PullRequest
3 голосов
/ 03 сентября 2010

Я пишу игру со змеями в 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 ]

2 голосов
/ 02 мая 2014

Весь блок:

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 на пересечении двух списков.

2 голосов
/ 03 сентября 2010

Никогда не использовал TI-Basic ...

но как насчет хранения двумерного массива игрового поля? Каждый элемент в этом массиве указывает, присутствует ли змея. Когда вы двигаетесь вперед, установите значение массива в начальной точке и очистите значение в старой конечной точке. Затем, чтобы проверить наличие столкновений, вы можете просто выполнить один просмотр в двумерном массиве.

1 голос
/ 18 мая 2012

Когда я программировал 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

Гораздо больше памяти, чем двумерный массив.

...