Programmeren in TI-Basic/Mijnenveger

Uit Wikibooks
Naar navigatie springen Naar zoeken springen

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
Informatie afkomstig van http://nl.wikibooks.org Wikibooks NL.
Wikibooks NL is onderdeel van de wikimediafoundation.