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