Проверьте каждое значение в списке в TI-Basic.
-
26-09-2019 - |
Вопрос
Я пишу игру «Змея» на 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 очков.
Использование ассемблера не вариант, потому что у меня нет соединительного кабеля (или желания писать ассемблер).
Решение
Никогда не использовал TI-Basic...
а как насчет хранения 2D-массива игрового поля.Каждый элемент этого массива указывает, присутствует ли змея.При движении вперед установите значение массива в начальной точке и очистите значение в старой конечной точке.Затем, чтобы проверить наличие коллизий, вы можете просто выполнить один поиск в 2D-массиве.
Другие советы
Весь блок:
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
на пересечении двух списков.
Когда я программировал 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-массив.