Programmeren in TI-Basic/Mijnenveger
Om een spel te maken moet je een goede planning hebben, hieronder de onderdelen waar het spel uit bestaat:
Code
[bewerken]Hier is eerst de code, en dan de uitleg.
0→Xmin 94→Xmax 0→Ymin 62→Ymax ClrDraw AxesOn AxesOn For(A,1,6 Horizontal 1+8A End For(A,1,10 Vertical 1+8A End Text(–1,0,0," Text(–1,5,0," For(A,0,5 Text(–1,13+8A,82," End 0→dim(⌊MINE 60→dim(⌊MINE Input "Mijnen:",A If A≠iPart(abs(A)) or A>50 Then Disp "Geef een Disp "positief geheel Disp "getal, lager dan Disp "50. Return End 0→θ For(B,1,60 If randInt(1,50)<A and θ<A Then 9→⌊MINE(B θ+1→θ End End Text(0,0,θ," Mijnen. For(Z,0,59 If ⌊MINE(Z+1)=9 Then 9→W Else 0→W 10fPart(Z/10)→X (Z-X)/10→Y Z+1→Z If X≠0 Then If ⌊MINE(Z-1)=9 W+1→W If Y≠0 Then If ⌊MINE(Z-11)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+9)=9 W+1→W End End If X≠9 Then If ⌊MINE(Z+1)=9 W+1→W If Y≠0 Then If ⌊MINE(Z-9)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+11)=9 W+1→W End End If Y≠0 Then If ⌊MINE(Z-10)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+10)=9 W+1→W End Z-1→Z End W→⌊MINE(Z+1 End 1→θ 0→dim(⌊MINE2 60→dim(⌊MINE2 0→K randInt(0,59→L While K<15 and ⌊MINE(L+1)≠0 randInt(0,59→L K+1→K End If ⌊MINE(L+1)=0 Then 1→⌊MINE2(L+1) iPart(L/10)→Y L-10Y→X Text(14+8Y,4+8X,0 End 0→Q 0→X 0→Y Text(6,4+8X,"v Text(14+8Y,82,"{ Repeat Q getKey→K If (K=25) and (Y≠0) Then Text(14+8Y,82," Y-1→Y Text(14+8Y,82,"{ End If (K=34) and (Y≠5) Then Text(14+8Y,82," Y+1→Y Text(14+8Y,82,"{ End If (K=24) and (X≠0) Then Text(6,4+8X," X-1→X Text(6,4+8X,"v End If (K=26) and (X≠9) Then Text(6,4+8X," X+1→X Text(6,4+8X,"v End If (K=105) and (⌊MINE2(10Y+X+1)=0) Then 1→⌊MINE2(10Y+X+1) If ⌊MINE(10Y+X+1)≠9 Text(14+8Y,4+8X,⌊MINE(10Y+X+1 If ⌊MINE(10Y+X+1)=9 Then Text(–1,0,15,"GAME OVER! For(D,0,5 For(E,0,9 If ⌊MINE(10D+E+1)≠9 Text(14+8D,4+8E,⌊MINE(10D+E+1) If ⌊MINE(10D+E+1)=9 Text(14+8D,3+8E,"* End End Return End End If (K=21) and (⌊MINE2(10Y+X+1)≠1) Then If ⌊MINE2(10Y+X+1)=0 Then 3→⌊MINE2(10Y+X+1 Text(14+8Y,3+8X,"π 1→O 1→P While O and P≤60 If ⌊MINE2(P)=0 0→O P+1→P End If O Then Text(–1,0,10,"YOU WON! For(D,0,5 For(E,0,9 If ⌊MINE(10D+E+1)=9 Then Text(14+8D,3+8E,"* Else Text(14+8D,4+8E,⌊MINE(10D+E+1 End End End Return End Else If ⌊MINE2(10Y+X+1)=3 Then 0→⌊MINE2(10Y+X+1 Text(14+8Y,3+8X," End End End End
Een veld genereren
[bewerken]Om een veld te maken gebruik ik een lijst, maar je zou op zich ook een matrix kunnen gebruiken. Ik maak een speelveld van 10x6, dit is makkelijker in verband met de grootte van het scherm.
Om te beginnen maak ik een lijst die 60 lang is (10x6).
0→dim(⌊MINE 60→dim(⌊MINE
Hierna ga wordt de lijst random gevuld met mijnen.
Input "Mijnen:",A If A≠iPart(abs(A)) or A>50 Then Disp "Geef een Disp "positief geheel Disp "getal, lager dan Disp "50. Return End 0→θ For(B,1,60 If randInt(1,50)<A and θ<A Then 9→⌊MINE(B θ+1→θ End End Text(0,0,θ," Mijnen.
Dit kost niet veel tijd, in tegenstelling tot het berekenen van de nummers. Hierna tekenen we het speelveld.
Speelveld genereren
[bewerken]Ik zet de instellingen zo dat elke pixel 1 x en 1 y is. Hierna teken ik vakjes die ik weer uitwis met spaties.
0→Xmin 94→Xmax 0→Ymin 62→Ymax ClrDraw AxesOn For(A,1,6 Horizontal 1+8A End For(A,1,10 Vertical 1+8A End Text(–1,0,0," Text(–1,5,0," For(A,0,5 Text(–1,13+8A,82," End
Getallen berekenen
[bewerken]Hiermee bereken ik hoeveel mijnen er om een bepaald vakje zit. Maar omdat er fouten komen als je niet rekening houd met randen waren er veel ifjes nodig. Als iemand dit efficienter kan, verander dit dan.
For(Z,0,59 If ⌊MINE(Z+1)=9 Then 9→W Else 0→W 10fPart(Z/10)→X (Z-X)/10→Y Z+1→Z If X≠0 Then If ⌊MINE(Z-1)=9 W+1→W If Y≠0 Then If ⌊MINE(Z-11)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+9)=9 W+1→W End End If X≠9 Then If ⌊MINE(Z+1)=9 W+1→W If Y≠0 Then If ⌊MINE(Z-9)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+11)=9 W+1→W End End If Y≠0 Then If ⌊MINE(Z-10)=9 W+1→W End If Y≠5 Then If ⌊MINE(Z+10)=9 W+1→W End Z-1→Z End W→⌊MINE(Z+1 End
Een open plek vinden
[bewerken]Om ervoor te zorgen dat je niet meteen af gaat bij het eerste vakje wordt er alvast een open plek opengemaakt. De lijst MINE2 is om bij te houden waar de vlaggetjes staan en welke nummers al zijn bekeken.
1→θ 0→dim(⌊MINE2 60→dim(⌊MINE2 0→K randInt(0,59→L While K<15 and ⌊MINE(L+1)≠0 randInt(0,59→L K+1→K End If ⌊MINE(L+1)=0 Then 1→⌊MINE2(L+1) iPart(L/10)→Y L-10Y→X Text(14+8Y,4+8X,0 End
De spelloop
[bewerken]Repeat Q getKey→K If (K=25) and (Y≠0) Then Text(14+8Y,82," Y-1→Y Text(14+8Y,82,"{ End If (K=34) and (Y≠5) Then Text(14+8Y,82," Y+1→Y Text(14+8Y,82,"{ End If (K=24) and (X≠0) Then Text(6,4+8X," X-1→X Text(6,4+8X,"v End If (K=26) and (X≠9) Then Text(6,4+8X," X+1→X Text(6,4+8X,"v End If (K=105) and (⌊MINE2(10Y+X+1)=0) Then 1→⌊MINE2(10Y+X+1) If ⌊MINE(10Y+X+1)≠9 Text(14+8Y,4+8X,⌊MINE(10Y+X+1 If ⌊MINE(10Y+X+1)=9 Then Text(–1,0,15,"GAME OVER! For(D,0,5 For(E,0,9 If ⌊MINE(10D+E+1)≠9 Text(14+8D,4+8E,⌊MINE(10D+E+1) If ⌊MINE(10D+E+1)=9 Text(14+8D,3+8E,"* End End Return End End If (K=21) and (⌊MINE2(10Y+X+1)≠1) Then If ⌊MINE2(10Y+X+1)=0 Then 3→⌊MINE2(10Y+X+1 Text(14+8Y,3+8X,"π ... (win controle) Else If ⌊MINE2(10Y+X+1)=3 Then 0→⌊MINE2(10Y+X+1 Text(14+8Y,3+8X," End End End End
Win controle
[bewerken]Dit is waar het spel uiteindelijk om draait, winnen of verliezen.
1→O 1→P While O and P≤60 If ⌊MINE2(P)=0 0→O P+1→P End If O Then Text(–1,0,10,"YOU WON! For(D,0,5 For(E,0,9 If ⌊MINE(10D+E+1)=9 Then Text(14+8D,3+8E,"* Else Text(14+8D,4+8E,⌊MINE(10D+E+1 End End End Return End
Mogelijke verbeteringen
[bewerken]Dit spel zou kunnen worden verbeterd met:
- Een tijd
- Een highscore
- Automatische open plek herkenning (automatisch openen)
- Groter speelveld
- Geoptimaliseerde code