Vérifiez chaque valeur dans une liste en TI-Basic
-
26-09-2019 - |
Question
J'écris un jeu de serpent dans TI-Basic, et chaque fois que je passer Je dois voir si la tête du serpent a frappé un point quelconque dans la queue. La queue est stockée sous la forme d'une file d'attente sur la base de la liste circulaire, et je peux ajouter le début et la fin en temps constant.
La seule partie difficile est que je dois faire quelque chose de semblable à ce à chaque itération: (S = Taille de la liste)
For(I,1,S)
If X=LX(I) and Y=LY(I)
Then
Disp "GAME OVER"
Return
End
End
Il est une boucle assez court, mais il faut toujours, même sur une liste de 10 articles. J'ai essayé la voie de séquence:
If sum(seq(X=LX(I) and Y=LY(I),I,1,S))
...
La seule autre optimisation que je peux penser est de ne pas vérifier les valeurs de N à N + 2 (parce que la première partie de votre queue qui est possible de frapper est à N + 3), mais que seulement met hors le problème après 4 points, et ayant le jeu injouable avec 14 points est pas mieux que d'être injouable après 10 points.
L'utilisation est l'assemblage pas une option parce que je n'ai pas un câble de liaison (ou le désir d'écrire l'assemblage).
La solution
Jamais utilisé ... TI-Basic
mais comment sur le stockage aussi un tableau 2D de la carte de jeu. Chaque élément de ce tableau indique si le serpent est présent. Lorsque vous avancez, définissez la valeur du tableau au point de la tête, et effacer la valeur à l'ancien point d'extrémité de la queue. Ensuite, pour tester la collision, vous pouvez juste faire une recherche dans le tableau 2D.
Autres conseils
Le bloc entier:
For(I,1,S)
If X=LX(I) and Y=LY(I)
Then
Disp "GAME OVER"
Return
End
End
peut être remplacé par:
If sum(X=LX and Y=LY)
Then
Disp "Game Over"
Return
End
X=LX
applique par morceaux de test à chaque élément de LX
, et la même chose pour Y=LY
. Les contrôles de sum()
s'il y a un 1
à l'intersection des deux listes.
Ce que je faisais, quand je programmais serpent, était de vérifier si le pixel devant le serpent était. Si c'était, je vérifie si ce pixel est le pixel « alimentaire », sinon, le jeu s'arrêterait.
Exemple, avec I et J étant des positions de tête et de queue, (F, G) étant la direction du serpent, et (M, N) étant la nourriture.
if Pxl-Test(I+F, J+G) #pixel in front of snake
then
if I+F=M and J+G=N
stop
end
Beaucoup plus que la mémoire-conservant un tableau 2D.