2010-09-03 2 views
3

Я пишу змею в 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 очков.

Использование сборки не является вариантом, потому что у меня нет соединительного кабеля (или желания написать сборку).

+0

Просто любопытство .... На какой машине вы работаете? –

+0

@belisarius, я использовал TI-84 –

+0

. Вы можете написать ассемблер Z80 на этом! –

ответ

2

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

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

+0

Это действительно хорошая идея, мне придется попробовать это завтра. –

+0

На самом деле просто написал его, и он отлично работает. Большое спасибо. –

1

Что я делал, когда я программировал Змею, было проверить, включен ли пиксель перед змеей. Если бы это было так, я бы проверял, является ли этот пиксель пикселем «еда», иначе игра остановится.

Пример: 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 

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

+0

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

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=LY. sum() проверяет наличие 1 на пересечении двух списков.

+0

Я предлагаю использовать 'max (', который быстрее, а не 'sum ('. – lirtosiast