Проверьте каждое значение в списке в TI-Basic.

StackOverflow https://stackoverflow.com/questions/3632412

  •  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=LYsum() проверяет, есть ли 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-массив.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top