Programmeren in TI-Basic/Snake

Uit Wikibooks

Hier het TI-Basic programma voor het spel Snake. Eerst het programma zelf, dat kun je overtypen op je GR, daarna nogmaals het programma, dan met uitleg.

Let op!

Op een net nieuw gekocht TI 84 Plus (SE) vertoont het programma soms kuren, de nieuwe software van de GR voert het programma namelijk net iets anders uit!
Om dit te controleren bij je TI 84 Plus (SE), druk op [2nd], op [MEM] (+), en kies optie 1. Ergens bovenaan staat de softwareversie, dit kan bijvoorbeeld 2.40 of 2.53 zijn. T/m 2.43 werkt dit spel goed, daarboven niet meer!
Als het programma namelijk een ° tekent, een stukje van de slang, wist het een stukje van de ° die er onder staat of, als de 'snake' onderaan het speelveld is, de onderste lijn. Dit is natuurlijk erg vervelend. Bovendien herkent het programma de 'snake' niet meer, en tekent hij soms per ongeluk een 'hapje' over zichzelf heen.

Besturing[bewerken]

pijltje boven   ↔ de 'snake' gaat naar boven
pijltje onder   ↔ de 'snake' gaat naar beneden
pijltje links   ↔ de 'snake' gaat naar links
pijltje rechts  ↔ de 'snake' gaat naar rechts
2ND             ↔ het spel stopt voortijdig
ENTER           ↔ pause

Het programma[bewerken]

:ClrDraw
:Axesoff
:FnOff
:ZStandard
:0→Xmin
:94→Xmax
:0→Ymin
:62→Ymax
:Line(6,49,89,49
:Line(89,49,89,2
:Line(89,2,6,2 // Original was Line (89,2,6,65. Lijn ging diagonaal in plaats van horizontaal.
:Text(4,38,"SNAKE
:5→L
:5→P
:{1,2,3,4,5}→L1
:{5,5,5,5,5}→L2
:1→X
:0→Y
:8→U
:3→V
:0→S
:Text(24,43,"*
:While 1
:P-L+1→T
:T+85(T≤0)→T
:Text(L2(T)*5+9,L1(T)*5+3,"            ← ← Let op! Vier spaties achter <">!
:Text(4,8,S
:If pxl-Test(L2(P)*5+11,L1(P)*5+6)=1
:Goto 0
:Text(L2(P)*5+9,L1(P)*5+3,"°
:getKey→G
:If G=21
:Goto 2
:If G=105
:Pause
:If G=24 and Y≠0
:Then
:-1→X
:0→Y
:End
:If G=26 and Y≠0
:Then
:1→X
:0→Y
:End
:If G=25 and X≠0
:Then
:0→X
:-1→Y
:End
:If G=34 and X≠0
:Then
:0→X
:1→Y
:End
:If L1(P)=U and L2(P)=V
:Then
:L+1→L
:S+5→S
:If L=85
:Goto 1
:Lbl A
:randInt(1,16→U
:randInt(1,9→V
:If pxl-Test(5*V+10,5*U+5)=1
:Goto A
:Text(V*5+9,U*5+3,"*
:If pxl-Test(V*5+10,U*5+10)=1
:Text(V*5+9,U*5+8,"°
:End
:P+1→P
:If P=86
:Then
:1→P
:L1(85)+X→L1(P)
:L2(85)+Y→L2(P)
:Else
:L1(P-1)+X→L1(P)
:L2(P-1)+Y→L2(P)
:End
:If L1(P)=0
:16→L1(P)
:If L1(P)=17
:1→L1(P)
:If L2(P)=0
:9→L2(P)
:If L2(P)=10
:1→L2(P)
:End
:Lbl 0
:Text(27,30," GAME OVER!
:Goto 2
:Lbl 1
:Text(27,28," YOU'VE WON!
:Lbl 2
:Text(33,30," SCORE:
:Text(33,53,S
:Pause
:ClrDraw
:ClrHome
:ClrList L1,L2
:ZStandard
:AxesOn
:FnOn
:Disp

Uitleg[bewerken]

Het spel bestaat uit drie delen:

- Het 'start'gedeelte, hierin wordt alle instellingen 'klaargezet'
- De While-loop, dit gedeelte wordt elke keer herhaald, per herhaling verschuift de 'snake' 1 stukje
- Het 'einde', hierin wordt de score getoond en worden de instellingen teruggezet

Hieronder nogmaals het programma, ditmaal is met spaties gewerkt en staat overal uitleg bij. De coördinaten van elk 'stukje' van de 'snake' worden opgeslagen in twee lijsten, L1 en L2. In L1 staan de X-coördinaten, in L2 de Y-coördinaten. Om niet heel veel opslagruimte te gebruiken, worden de lijsten maximaal 85 cijfers lang, daarna begint het programma opnieuw met becijferen.

ClrDraw
Axesoff
FnOff
ZStandard
0→Xmin
94→Xmax
0→Ymin
62→Ymax
Line(6,49,89,49
Line(89,49,89,2
Line(89,2,6,2
Line(6,2,6,49
Text(4,38,"SNAKE
5→L
5→P
{1,2,3,4,5}→L1
{5,5,5,5,5}→L2
1→X
0→Y
8→U
3→V
0→S
Text(24,43,"*

Dit is het eerste gedeelte. Achtereenvolgens wordt het tekenscherm leeg gemaakt, de grafiekassen en eventuele grafieken uitgeschakelt, daarna worden de schermcoördinaten ingesteld, elke pixel één eenheid. Dit is handig voor het verloop van het programma. Daarna wordt het speelveld getekend en het bovenschrift geschreven. Vervolgens worden de variabelen klaargezet. L staat voor de lengte van de 'snake', P voor de positie van de coördinaten van het voorste stukje van de 'snake' in de 2 lijsten, X en Y zijn respectievelijk de X en Y beweegrichting van de 'snake', U en V zijn de begincoördinaten van het 'hapje', en S is de score. In de laatste regel staat de opdracht om het 'hapje' te tekenen.

While 1
  P-L+1→T
  T+85(T≤0)→T                          
  Text(L2(T)*5+9,L1(T)*5+3,"            ← ← Let op! Vier spaties achter <">!
  Text(4,8,S
  If pxl-Test(L2(P)*5+11,L1(P)*5+6)=1
    Goto 0
  Text(L2(P)*5+9,L1(P)*5+3,"°
  getKey→G
  If G=21
    Goto 2
  If G=105
    Pause
  If G=24 and Y≠0
    Then
      -1→X
      0→Y
    End
  If G=26 and Y≠0
    Then
      1→X
      0→Y
    End
  If G=25 and X≠0
    Then
      0→X
      -1→Y
    End
  If G=34 and X≠0
    Then
      0→X
      1→Y
    End
  If L1(P)=U and L2(P)=V
    Then
      L+1→L
      S+5→S
      If L=85
        Goto 1
      Lbl A
      randInt(1,16→U
      randInt(1,9→V
      If pxl-Test(5*V+10,5*U+5)=1
        Goto A
      Text(V*5+9,U*5+3,"*
      If pxl-Test(V*5+10,U*5+10)=1
        Text(V*5+9,U*5+8,"°
    End
  P+1→P
  If P=86
    Then
      1→P
      L1(85)+X→L1(P)
      L2(85)+Y→L2(P)
    Else
      L1(P-1)+X→L1(P)
      L2(P-1)+Y→L2(P)
    End
  If L1(P)=0
    16→L1(P)
  If L1(P)=17
    1→L1(P)
  If L2(P)=0
    9→L2(P)
  If L2(P)=10
    1→L2(P)
End

Dit is het tweede gedeelte. Hierin gebeurt het volgende: eerst worden de coördinaten van het laatste 'stukje' bepaald, en wordt dit stukje gewist met vier spaties, daarna wordt gecontroleerd of de 'snake' tegen zichzelf 'aanbotst', zo ja, dan gaat het programma verder bij Lbl 0. Als het programma dit gedaan heeft bekijkt hij op welke toets eventueel is gedrukt, en voert hij eventuele richtingswijzigingen door. Als het programma ook dit heeft uitgevoerd gaat het verder met het bepalen of de 'snake' een 'hapje' is tegengekomen, zo ja, dan verhoogt hij de score en de lengte, en tekent hij een nieuw 'hapje'. Daarna wordt met behulp van de richting (X en Y) de nieuwe coördinaten van het 'beginstukje' bepaald en opgeslagen in de lijst, op de juiste plek. Als ook dit gebeurd is, gaat het programma weer opnieuw het tweede gedeelte uitvoeren, en opnieuw, en opnieuw, en opnieuw...

Lbl 0
Text(27,30," GAME OVER!
Goto 2
Lbl 1
Text(27,28," YOU'VE WON!
Lbl 2
Text(33,30," SCORE:
Text(33,53,S
Pause
ClrDraw
ClrHome
ClrList L1,L2
ZStandard
AxesOn
FnOn
Disp

In dit derde en laatste gedeelte staan een aantal dingen te wachten: als je 'game over' bent kom je in Lbl 0 terecht, en daarna bij Lbl 2, als je een score van 400 hebt bereikt kom je in Lbl 1 terecht, en daarna bij Lbl 2. Als je het programma eerder beëindigde, door op 2ND te drukken, kom je direct bij Lbl 2 uit. Hier, in Lbl 2 wordt de score getoond, en als je daarna op ENTER drukt verwijderd het programma de coördinaten in de lijsten, worden de instellingen m.b.t. de grafiekassen e.d. teruggezet, wordt het programma afgesloten en keert het terug naar het basisscherm.

Informatie afkomstig van https://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.