yab - Spiel Tutorial
System: BeOS, Haiku, Zeta
Inhalt
1. Wir erstellen ein Spiel
In diesem Tutorial werden wir uns mit dem erstellen eines einfachen Spiels befassen. Hierbei geht es nicht unbedingt nur um das
Spiel, sondern um die komplexe Struktur die für so ein Programm erforderlich ist. Natürlich werden wir am Ende ein
lauffähiges Spiel haben, jedoch sind nicht alle Aspekte die für die Idee des Spiels interessant sind berücksichtigt.
Dies gibt Anreiz sich selber an diesen zu versuchen.
Bei dem Spiel handelt es sich um eine Umsetzung des "Memory" Spiels. Hier gilt es alle zusammengehörigen
Spielkarten zu finden, welche verdeckt vor dem Spieler liegen. Gesucht werden Spielkartenpaare, die wenn diese gefunden wurden,
aufgedeckt liegen bleiben. Es dürfen immer nur zwei Karten zur selben Zeit aufgedeckt werden. Sind die Karten unterschiedlich,
werden diese wieder verdeckt.
Bevor man beginnt ein Spiel zu schreiben, sollte man sich darüber genaue Gedanken machen. Einfach nur das Spiel vor Augen
haben reicht nicht immer aus, zumal viele Abhängigkeiten erst beim Ausprobieren wirklich zum tragen kommen. Gedanken
darüber, ob es überhaupt möglich ist mit der verwendeten Programmiersprache dieses umzusetzen oder ob die eigene
Programmierkenntnis ausreicht ein solches Spiel umzusetzen. Daher kommt es öfters vor das man sich verrennt und dann
demotiviert aufgibt.
Auch bei diesem Spiel, welches wir hier für das Tutorial erstellt haben um es anschließend zu beschreiben, hat sich der genaue
Umfang der Abläufe erst im Laufe der Programmierung entwickelt. Dies ist ein ganz normaler Vorgang, denn man kann nie von
vornherein ganz genau wissen, was man alles beachten muss. Jedoch war uns klar, dass wir dieses Spiel so wie wir es uns gedacht haben,
umsetzen können.
Was immer hilfreich ist, ist sich die Abläufe einmal grafisch aufzumalen. Das gibt im Laufe der Entwicklung immer die Möglichkeit
seine Arbeitsschritte zu kontrollieren und etappenweise abzuhaken.
Darstellung des Programmfensters mit den Spielkarten
Auswahl zweier Spielkarten und dessen Überprüfung.
Sind die Karten identisch werden diese dauerhaft aufgedeckt dargestellt.
Sind die Karten unterschiedlich werden diese wieder verdeckt.
Sind alle Spielkarten aufgedeckt, werden die Spieler Informationen abgefragt.
Die Spielerdaten werden gespeichert.
Darstellung der Hightscore
Wird im Spielmenü die Option "Neues Spiel" aufgerufen, werden alle gespeicherten Informationen zurückgesetzt und das
Programmfenster mit Spielkarten wieder angezeigt.
Wird gleich nach dem Programmstart im Spielmenü die Option "Hightscore" ausgewählt, wird diese dargestellt.
Wenn Sie genau hingucken, werden sie sehen, dass es keine Option gibt für das aufrufen der Hightscore aus der Hightscore Darstellung.
Dies ist zum Beispiel einer der Abhängigkeiten, die oben erwähnt wurden. Außerdem enthält diese Darstellung keine
Informationen über die weiteren Abhängigkeiten, wie zum Beispiel die Anzahl der Spielzüge, die wiederum in die Hightscore
einfließen werden.
Aber wir wollen Sie jetzt nicht mit diesen eventuell auftretenden Problemen demotivieren oder abschrecken, sondern im Allgemeinen einfach
darauf hinweisen, dass das entwickeln eines Spiel doch aufwendiger sein kann als man es sich vielleicht vorgestellt hat.
zurück zur Übersicht
2. Die Spielkarten
Bevor wir mit der Programmierung anfangen, beschäftigen wir uns mit dem Erstellen der Spielkarten. Es ist immer einfacher bei einem Spiel
wie diesem zuerst die Spielkarten zu erstellen, da man sich nicht unbedingt immer die wirkliche Größe dieser vor Augen halten kann.
Es kommt dabei natürlich auch immer auf die Motive an, welche man darstellen möchte. Sind es zum Beispiel Landschaften, die man auf
den Spielkarten zeigen möchte, sollten diese größer sein, damit diese auch richtig zur Geltung kommen.
Die richtigen Grafiken für ein solches Spiel zu wählen ist auch nicht immer einfach, zumal wir für dieses Tutorial acht verschiedene
Motive benötigen, die themenbezogen zueinander passen sollten. Dazu kann man sich auch nicht einfach irgendwelche Grafiken nehmen, die
man zum Beispiel im Internet gefunden hat, weil diese oftmals mit einem Kopierrecht (Copyright) versehen sind. Diese sieht man in vielen
Fällen nicht einmal, da diese durch Wasserzeichen gekennzeichnet sind, welche man auch nicht mit jedem Grafikprogramm sehen kann.
Um solchen Schwierigkeiten aus dem Weg zu gehen, haben wir für dieses Tutorial Bilder aus unserem privaten Fotoalbum verwendet. Für
die Spielkarten brauchen wir jeweils zwei Motive, eines für die die Rückseite und eines für die Vorderseite. Die Vorderseite sollte
bei allen gleich sein, damit ein finden der richtigen Motive am Ende nicht zu einfach wird. Wir haben uns für Spielkarten mit Tiermotiven in einer
Größe von 100 mal 100 Pixeln entschieden:
Für die Bilder haben wir ein Verzeichnis im Programmordner angelegt mit dem Namen gfx. In diesem Ordner werden alle Bilder abgelegt
und von 0 bis 8 nummerriert. Dabei ist Bild0 die Vorderseite der Spielkarte und Bild1 bis Bild8 die Rückseiten.
zurück zur Übersicht
3. Das Grundgerüst
Wir beginnen mit dem Grundgerüst für unser Spiel. Folgender Soucecode beinhaltet einige Dunkelrote
markierungen, diese dienen dazu das einfügen von Programmkodes im laufe des Tutorials zu erleichtern. Kommt zum Beispiel im laufe des
Tutorials die Aufforderung, einen case Eintrag zu tätigen, fügen Sie diesen einfach unterhalb der
//cases Markierung ein. Dies erleichtert mir das Erklären und Ihnen das Verstehen.
#!/boot/home/config/bin/yab
//get infos
B_Breite = peek("desktopwidth")
B_Hoehe = peek("desktopheight")
//yab info
if (peek("isbound")) then
Programmordner$ = peek$("directory")
else
Programmordner$=system$("pwd")
Programmordner$ = left$(Programmordner$, len(Programmordner$)-1)
fi
//variable
Grafikordner$=Programmordner$+"/gfx/"
klicks=0
spielzug=0
status=0
//program window
WINDOW OPEN B_Breite/2-250,B_Hoehe/2-250 to B_Breite/2+250,B_Hoehe/2+250, "Hauptfenster", "Memory Game"
WINDOW SET "Hauptfenster", "Flags", "Not-Resizable,Not-Zoomable"
MENU "File", "Quit", "Q", "Hauptfenster"
MENU "Game", "New Game", "N", "Hauptfenster"
MENU "Game", "Hightscore", "H", "Hauptfenster"
//call function
//main loop
dim part$(1)
inloop = true
while(inloop)
msg$ = message$
if (split(msg$, part$(), ":|") > 2) then
PartOne$=part$(1)
PartTwo$ = part$(2)
PartThree$ = part$(3)
fi
if (msg$ <> "") print msg$
switch msg$
//cases
default:
end switch
if(window count<1) inloop = false
sleep 0.1
wend
//sub routines
|
Wie Sie sehen können, beinhaltet dieses Sourcecode im Grunde genommen für sie nichts neues, denn gleiches haben wir
bereits in den beiden ersten Einsteigertutorials kennen gelernt.
Wir ermitteln im Bereich //get infos die Größe der Bildschirmauflösung des Rechners
auf dem das Spiel ausgefürt wird (B_Breite$ = Bildschirm Breite und
B_Hoehe = Bildschirm Höhe).
Dann folgt die bekannte Abfrage bei //yab info, welche ermittelt, ob das Programm gebunden ist oder
nicht.
Danach werden bestimmte im Programm vorkommende Variablen vordifiniert bei //variable.
Dann wird im Bereich //program window das Programmfenster angegeben. Dabei werden die Werte
der Bildschirmgröße durch zwei geteilt und die jeweiligen Werte angegeben, um das Fenster in einer Größe von
500 Pixeln in der Breite und 500 Pixeln in der Höhe anzugeben.
Wir addieren drei Menüoptionen, dies ist einmal das Schließen ("Quit") des Programms im Menübereich
"File", die Auswahloption eines neuen Spiels (New Game) im Breich "Game" und die Auswahloption zur
Darstellung der Hightscore, ebenfalls im Bereich "Game".
Darauf folgt der Mainloop mit den Splitoptionen für das ermitteln von Programmaufrufen.
zurück zur Übersicht
4. Das Spielfeld
Da dies ein einfaches Spiel werden soll, bedienen wir uns einer einfacher Methode, die Spielkarten darzustellen. Die einfachste Methode die
Spielkarten darzustellen ist das Verwenden des Button Befehls von yab.
Fügen Sie folgenden Kode im Bereich //sub routines ein:
sub Program_Window()
View$="GameTable"
VIEW 0,15 TO 500, 495, "GameTable", "Hauptfenster"
VIEW 10,10 TO 120,120, "Button1", "GameTable"
BUTTON IMAGE 5,5, "B_1", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button1"
VIEW 130,10 TO 240,120, "Button2", "GameTable"
BUTTON IMAGE 5,5, "B_2", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button2"
VIEW 250,10 TO 360,120, "Button3", "GameTable"
BUTTON IMAGE 5,5, "B_3", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button3"
VIEW 370,10 TO 480,120, "Button4", "GameTable"
BUTTON IMAGE 5,5, "B_4", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button4"
VIEW 10,130 TO 120,240, "Button5", "GameTable"
BUTTON IMAGE 5,5, "B_5", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button5"
VIEW 130,130 TO 240,240, "Button6", "GameTable"
BUTTON IMAGE 5,5, "B_6", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button6"
VIEW 250,130 TO 360,240, "Button7", "GameTable"
BUTTON IMAGE 5,5, "B_7", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button7"
VIEW 370,130 TO 480,240, "Button8", "GameTable"
BUTTON IMAGE 5,5, "B_8", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button8"
VIEW 10,250 TO 120,360, "Button9", "GameTable"
BUTTON IMAGE 5,5, "B_9", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button9"
VIEW 130,250 TO 240,360, "Button10", "GameTable"
BUTTON IMAGE 5,5, "B_10", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button10"
VIEW 250,250 TO 360,360, "Button11", "GameTable"
BUTTON IMAGE 5,5, "B_11", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button11"
VIEW 370,250 TO 480,360, "Button12", "GameTable"
BUTTON IMAGE 5,5, "B_12", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button12"
VIEW 10,370 TO 120,480, "Button13", "GameTable"
BUTTON IMAGE 5,5, "B_13", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button13"
VIEW 130,370 TO 240,480, "Button14", "GameTable"
BUTTON IMAGE 5,5, "B_14", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button14"
VIEW 250,370 TO 360,480, "Button15", "GameTable"
BUTTON IMAGE 5,5, "B_15", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button15"
VIEW 370,370 TO 480,480, "Button16", "GameTable"
BUTTON IMAGE 5,5, "B_16", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button16"
end sub
|
Wir erstellen eine Variable View$ und speichern in Ihr den Names des Views, welcher angezeigt werden soll
("GameTable"). Näheres dazu später.
Wir erstellen einen View "GameTable", welchen wir auf das Hauptfenster platzieren.
Auf dem View "GameTable" erstellen wir weitere Views, für jede Spielkarte einen. Wir verwenden für dieses Tutorial
2 x 8 Spielkarten mit der Größe von 100 x 100 Pixeln. Weil es schöner aussieht, wenn die Spielkarten einwenig Abstand
zueinander haben, erstellen wir die Views 10 Pixel größer als die Spielkarten.
In jeden der Views erstellen wir einen Image Button und geben bei beiden Grafiken (eine für den unbetätigten
und einer für den betätigten Zustand) die selbe Grafik an. Das wir hier beide Grafiken gleich wählen liegt daran, daß beim
Programmieren dieses Tutorials, dieses die schönere Variante ist. Zuerst hatte das Bild für den gedrückten Button das Aussehen
der aufgedeckten Spielkarte, dabei entstand aber ein unschöner Nebeneffekt, denn immer wenn man diesen gedrückt hatte und
danach die aufgedeckte Spielkarte dargestellt wurde, sah es so aus als wenn diese zweimal kurz hintereinander angezeigt wird.
Damit das Spielfeld nun angezeigt wird, müssen wir im oberen Bereich bei //call function die Subroutine
aufrufen. Dazu geben Sie einfach den namen der Subroutine Program_Window() an.
zurück zur Übersicht
5. Spielkartenfunktion
Nun kommen wir zum eigentlich interessanten Teil des Spielablaufes. Hier gilt es nicht nur das vergleichen zweier aufgedeckter Spielkarten zu
tätigen, sondern auch diverse dazu benötigter Daten zu ermitteln, bzw. an zu geben. Es werden mehrere Daten benötigt. Zum
einen den Namen des Views sowie des Buttons, die Position des Views und die Nummer des jeweiligen Bildes.
Fügen Sie folgenden Code in den Bereich //cases ein:
case "B_1|"
BuView$="Button1"
Button$="B_1"
horizontal1=10
vertikal1=10
horizontal2=120
vertikal2=120
BildNr=1
BildAuswahl()
break
|
BuView$="Button1": In dieser Variable wird der Name des Button Views angegeben, also der Name des Views, auf welchen wir den
ersten Button geleht haben
Button$="B_1": In dieser Variable wird der Name des Buttons angegeben.
horizontal1=10: In horizontal1 geben wir die linke Position des Buttons an.
horizontal2=120: In horizontal2 geben wir die rechte Position des Buttons an.
vertikal1=10: Mit vertikal1 geben wir die obere Position des Buttons an.
vertikal2=120: Mit vertikal2 geben wir die untere Position des Buttons an.
BildNr=1: In BildNr speichern wir die Nummer des Bildes (Bild1 -
Bild8)
BildAuswahl(): Am Ende wird die Subroutine BildAuswahl() aufgerufen, in welcher wir alle Daten verarbeiten.
Dies ist der erste von 16 Buttons, diese Angabe müssen nun anschließend für alle weiteren 15 Buttons erstellt werden. Alle
Informationen, über die Buttons, müssen Sie dabei von dem beim Spielfeld angegebenen nehmen (horizontale und vertikale
Position, Name von View und Button, Bild Nummer)
Kommen wir nun zur Subroutine. Fügen Sie dazu folgenden Code in den Bereich //sub routines ein:
sub BildAuswahl()
VIEW REMOVE BuView$
VIEW horizontal1,vertikal1 TO horizontal2,vertikal2, BuView$, "GameTable"
err = DRAW IMAGE 5,5 TO 105,105, Grafikordner$+"bild"+str$(BildNr)+".png", BuView$
klicks=klicks+1
if(klicks=1)then
Karte1$="bild"+str$(BildNr)+".png"
Karte_Button1$=Button$
Karte_horizontal1=horizontal1
Karte_vertikal1=vertikal1
Karte_horizontal2=horizontal2
Karte_vertikal2=vertikal2
KarteView1$=BuView$
elseif(klicks=2)then
Karte2$="bild"+str$(BildNr)+".png"
Karte_Button2$=Button$
Karte_horizontal3=horizontal1
Karte_vertikal3=vertikal1
Karte_horizontal4=horizontal2
Karte_vertikal4=vertikal2
KarteView2$=BuView$
fi
if(klicks=2)then
if(Karte1$=Karte2$)then
status=status+1
spielzug=spielzug+1
if(status=8)then
window open B_Breite/2-120,B_Hoehe/2-70 to
B_Breite/2+120,B_Hoehe/2+70, "Status", "Gewonnen"
WINDOW SET "Status", "Look", "Modal"
WINDOW SET "Status", "Flags",
"Not-Resizable,Not-Zoomable"
DRAW SET "system-bold", "Status"
DRAW TEXT 10,15, "Sie haben gewonnen!!!",
"Status"
DRAW SET "system-plain", "Status"
DRAW TEXT 10,45, "Runden: "+str$(spielzug),
"Status"
TEXTCONTROL 10,50 TO 230,40,
"Spieler_Name", "Enter Name:", "", "Status"
BUTTON 60,100 TO 180,110, "Speichern",
"Speichern", "Status"
fi
else
spielzug=spielzug+1
wait 0.5
VIEW REMOVE KarteView1$
VIEW REMOVE KarteView2$
VIEW Karte_horizontal1,Karte_vertikal1 TO
Karte_horizontal2,Karte_vertikal2, KarteView1$, "GameTable"
BUTTON IMAGE 5,5, Karte_Button1$,
Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, KarteView1$
VIEW Karte_horizontal3,Karte_vertikal3 TO
Karte_horizontal4,Karte_vertikal4, KarteView2$, "GameTable"
BUTTON IMAGE 5,5, Karte_Button2$,
Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, KarteView2$
fi
klicks=0
fi
end sub
|
Die Daten die wir vorher beim Button definiert haben, werden in der Subroutine verarbeitet. Dadurch das wir bei allen Buttons
die selben Variablennamen verwenden, können wir diese auch für alle gemeinsam nutzen. Dies spart eine Menge Zeilen,
was wiederum eine bessere Übersicht des Sourcecodes ergibt. Daher sollte man immer versuchen so viele Zeilen wie
möglich zu sparen.
Mit VIEW REMOVE BuView$ wird zuerst der View entfernt, auf dem der
angeklickte Button sitzt.
Danach wird mit VIEW... der View neu erstellt. Dabei bekommt er durch die vorher
definierten Variablen genau den selben Namen und Position wie der View der entfernt wurde.
Mit err = DRAW IMAGE... wird das Bild welches sich hinter dem Button
verbirgt angezeigt. Auch hier verwenden wir die vorher definierten Variablen indem wir bei
Grafikordner$+"bild"+str$(BildNr)+".png" nicht nur einfach das Bild angeben, sondern auch den im Vorfeld
angegebenen Grafikordner. Der Name des Bildes setzt sich aus dem Wort "bild" und der Nummer des Bildes
BildNr zusammen. Da BildNr eine Zahlenvariable ist, und wir sie so nicht an ein Wort anhängen
können, müssen wir diese vorher in eine Textvariable umwandeln. Dazu benutzen wir den String
str$(). Am Ende fügen wir dann noch den Suffix für die Grafik an (hier .png)
Mit klicks=klicks+1 zählen wir die Anzahl der vom Spieler durchgeführten Klicks
auf die Spielkarten. Dies ist wichtig, da wir nur so erfahren, wann dieser zwei Buttons gedrückt hat und wir die aufgedeckten
Bilder mit einander vergleichen müssen.
Mit der IF-Abfrage if(klicks=1)then wird die Zahlenvariable klicks
überprüft. Ist deren Zahl 1 wird diese IF-Abfrage ausgeführt. Daraufhin werden verschiedene Variablen definiert.
-In Karte1$ wird der Pfad und das Bild gespeichert welches beim ersten Klick dargestellt wird.
-In Karte_Button1$
wird der Button gespeichert, welcher beim ersten Klick verwendet wurde.
-Mit Karte_horizontal1, Karte_vertikal1 und Karte_horizontal2, Karte_vertikal2 werden die Angaben für den Button,
später das Bild, gespeichert. -In KarteView1$ wird der Name des Views gespeichert auf welchen der als erstes
geklickte Button liegt.
Mit der ELSEIF Abfrage elseif(klicks=2)then fügen wir innerhalb der IF-Schleife
eine weitere Ausführmöglichkeit ein. Ist hier der Wert klicks = 2 werden auch die gleichen Informationen gespeichert
wie beim Wert 1, nur daß diesmal die Informationen für den zweiten angeklickten Button gespeichert werden.
Die IF Abfrage wird mit fi (man kann hier auch endif benutzen)
beendet.
Durch die erste IF Abfrage werden alle zum Vergleich benötigten Angaben ermittelt. Die darauf folgende IF Abfrage
wird dazu verwendet, entweder die Karten, sollten diese gleich sein, aufgedeckt zu lassen, oder aber diese wieder zu verdecken.
Die IF Abfrage wird ausgeführt, sobald die Variable klicks den Wert 2 hat
(if(klicks=2)then).
Innerhalb dieser IF Abfrage beginnt eine weitere IF Abfrage: if(klicks=2)then. Hier
werden die beiden Kartenvariablen miteinander verglichen. Stimmen die beiden Variablen überein, wird diese ausgeführt.
Die Zahlenvariable status wird mit status=status+1 erhöht, sobald zwei gleiche Karten
gefunden wurden.
Mit spielzug=spielzug+1 zählen wir die Anzahl der Spielzüge (für die Hightscore).
Es folgt wiederum eine weitere IF Abfrage welche die Variable status überprüft. Ist der Wert der Variable
if(status=8)then sind alle Spielkartenpaare aufgedeckt und das Spiel damit gewonnen. In der If Abfrage wird dann
ein neues Fenster geöffnet, in welchen der Spieler aufgefordert wird seinen Namen einzutragen (für die Hightscore). Aber
dazu später mehr. Auch diese Abfrage wird mit fi beendet.
Kommen wir erst einmal zurück zur If Abfrage if(Karte1$=Karte2$)then. Stimmen die beiden
Variablen nicht überein, wird eine else aufgerufen.
In der else wird auch der Spielzug gezählt. Dann werden beide Views entfernt und neu erstellt. Auf
diesen Views werden dann die beiden Buttons wieder erstellt und mit der Vorderseite angezeigt, also die Spielkarten wieder verdeckt dargestellt.
Auch diese Abfrage wird mit fi beendet.
Da wir nie mehr als 2 Klicks haben dürfen, wird mit klicks=0 der Wert der Variablen klicks
wieder auf 0 gesetzt.
Anschließend wird auch die IF Abfrage if(klicks=2)then mit fi beendet.
Wir schließen die Subroutine mit end sub.
zurück zur Übersicht
6. Die Hightscore
Kommen wir zurück zu der kurz angsprochenen IF Abfrage bei der Spielkartenfunktion. Hier wurde die Abfrage begonnen, wenn die
Variable status eine Größe von 8 hat:
if(status=8)then
window open B_Breite/2-120,B_Hoehe/2-70 to B_Breite/2+120,B_Hoehe/2+70, "Status", "Gewonnen"
WINDOW SET "Status", "Look", "Modal"
WINDOW SET "Status", "Flags",
"Not-Resizable,Not-Zoomable"
DRAW SET "system-bold", "Status"
DRAW TEXT 10,15, "Sie haben gewonnen!!!",
"Status"
DRAW SET "system-plain", "Status"
DRAW TEXT 10,45, "Runden: "+str$(spielzug),
"Status"
TEXTCONTROL 10,50 TO 230,40,
"Spieler_Name", "Enter Name:", "", "Status"
BUTTON 60,100 TO 180,110, "Speichern",
"Speichern", "Status"
fi
|
Ist dies der Fall, wird ein neues Fenster in der mitte des Bildschirms geöffnet, hierbei werden wieder die beiden Variablen B_Breite
und B_Hoehe verwendet wie beim Programmfenster. Dazu kommt eine Textausgabe im Fenster, sowie eine Textcontrol und ein
Button. Hier wird der Spieler aufgefordert, seinen Namen in die Textcontrol zu schreiben um durch drücken des "Speichern"
Buttons, diesen in die Hightscore einzutragen. Dies kennen Sie aus dem zweiten Einsteigertutorial vom BFS Imagecreator.
Damit der Button funktionieren kann, fügen Sie folgenden Kode in den Bereich //cases ein:
case "Speichern|"
Spieler_Name$ = TEXTCONTROL GET$ "Spieler_Name"
anlegen=open(Programmordner$+"/Hightscore.data", "a")
print #anlegen str$(spielzug)+";"+Spieler_Name$
close(anlegen)
Output$=System$("sort -g "+Programmordner$+"/Hightscore.data > "+Programmordner$+"/Hightscore.temp")
Output$=System$("rm "+Programmordner$+"/Hightscore.data")
Output$=system$("cp "+Programmordner$+"/Hightscore.temp "+Programmordner$+"/Hightscore.data")
Output$=System$("rm "+Programmordner$+"/Hightscore.temp")
WINDOW CLOSE "Status"
VIEW REMOVE "GameTable"
Hightscore()
break
|
Mit Spieler_Name$ = TEXTCONTROL GET$ "Spieler_Name" lesen wir die Textcontrol "Spieler Name" aus
und speichern den eingegebenen Namen des Spieler in die Variable Spieler_Name$.
Danach wir mit anlegen=open(Programmordner$+"/Hightscore.data", "a") eine Textdatei zum speichern
geöffnet (sollte dieser nicht existieren, wird dieser erstellt). Die Datei heißt "Hightscore.data" und liegt im Programmordner$
vom Spiel. Das "a" steht dafür, daß nachträglich in die Datei geschreiben werden soll und diese nicht neu geschrieben
werden soll. Der Name der Zahlenvariable "anlegen" kann frei gewählt werden, es handelt sich dabei nicht um eine Systemvariable.
Mit print #anlegen str$(spielzug)+";"+Spieler_Name$ schreiben wir den Inhalt der beiden Variablen
spielzug und Spieler_Name$ in die Datei Hightscore.data. Dafür muß die Zahlenvariable in eine Textvariable
geändert werden, wofür wir wieder den String str$() verwenden. Wir tragen die Dasteien
hintereinader in die Datei ein und trennen diese mit einem ; Zeichen.
Mit close(anlegen) schließen wir den Speichervorgang.
Wenn man auf diese Weise die Daten speichert, werden einfach alle neu eingetragenen Spielerdaten hinten angefügt. Wir wollen aber das der
Inhalt der Datei nachher in der Hightscore in alphabetischer Reihenfolge angezeigt wird. Dazu muss man den Inhalt sortieren. Eine der einfachsten
Methoden dieses zu machen ist, den Shell Befehl sort zu nutzen.
Der sort Befehl benötigt folgende Angaben: sort -g /Pfad/zur/Quelldatei > /Pfad/zur/Ausgabedatei.
Für den "/Pfad/zur/Quelldatei" verwenden wir die für den "/Pfad/zum/Programmordner" angelegten Variable Programmordner$.
An diese fügen wir die beim Spielabschluß erstellte Hightscore.data Datei an: Programmordner$+"/Hightscore.data".
Danach folgte das vom sort Befehl verwendete Zeichen für die Ausgabedatei: ">" und die Pfadangabe mit Ausgabedatei
Hightscore.temp.
Danach verwenden wir das Shell Befehl rm (remove) und entfernen damit die Hightscore.data Datei: "rm /Pfad/zur/Zieldatei".
Dann wird die "Hightscore.temp" Datei mit Hilfe des Shell Befehls cp (copy) kopiert und als "Hightscore.data" gespeichert: "cp
/Pfad/zur/Quelldatei /Pfad/zur/Zieldatei".
Im Anschluß entfernen wir die Datei "Hightscore.temp".
Daraufhin schließen wir das Fenster "Status" und entfernen den View "GameTable".
Am Ende wird die Subroutine Hightscore() aufgerufen. Fügen sie folgenden Kode im Bereich //sub
routines ein:
sub Hightscore()
View$="Hightscore"
MENU SET "Game", "Hightscore", "Disable", "Hauptfenster"
VIEW 0,15 TO 500, 495, "Hightscore", "Hauptfenster"
DRAW SET "system-bold", "Hightscore"
DRAW TEXT 20,50, "Hightscore", "Hightscore"
DRAW SET "system-plain", "Hightscore"
Spielstaende$=Programmordner$+"/Hightscore.data"
x=0
auslesen=open(Spielstaende$, "r")
while (not EOF(auslesen))
line input #auslesen b$
dim elements$(1)
numElements = split(b$, elements$(), ";")
for i = 1 to numElements
x=x+1
dim d$(x)
d$(x) = elements$(i)
next i
wend
close(auslesen)
height=100
aa=1
for a = 1 to x/2
DRAW TEXT 20,height, d$(aa), "Hightscore"
aa=aa+2
height=height+20
next a
height=100
bb=2
for b = 1 to x/2
DRAW TEXT 120,height, d$(bb), "Hightscore"
bb=bb+2
height=height+20
next b
end sub
|
Wir speichern wieder den derzeit in gebrauch befindenen Namen des Views welcher dargestellt wird in der Variable View$
(View$="Hightscore").
Mit MENU SET "Game", "Hightscore", "Disable", "Hauptfenster" deaktivieren wir den Menüpunkt
"Hightscore". Diese Funktion ist deshalb Sinnvoll, da wir uns bereits in dieser befinden.
Dann erstellen wir einen neuen View mit dem Namen "Highscore" auf dem "Hauptfenster". Die Informationen der
Highscore sollen auf diesem View mit dem Befehl DRAW TEXT dargestellt werden. Um bestimmte Textbereiche hervorzuheben,
werden diese in "Fett Schrift" (Bold) geschrieben. Um dies zu machen, müssen Sie dieses vorher angeben. Dies gibt man mit
dem Befehl DRAW SET an und für nachher den DRAW TEXT Befehl aus. Die DRAW SET Angabe ist so lange aktiv, bis
diese wieder geändert wird. Dies machen wir hier, indem wir zuerst die Überschriften für die Ausgabe in "system-bold"
schreiben und dann die Schrift wieder auf das Standard- Format "system-plain" ändern.
Mit Spielstaende$=Programmordner$+"/Hightscore.data" erstellen wir eine Variable, in der die
Hightscoredatei mit Dateipfad enthalten ist. Dies erleichtert das spätere Verwenden dieser Angabe, da hier nur die Variable angegeben
werden muss.
Wir setzen eine im folgenden Ablauf verwendeten Zahlenvariable auf 0 (x=0). Dies machen wir, damit beim
wiederholten Aufruf der Hightscore keine falschen Werte verwendet werden.
Ähnlich wie beim schreiben einer Datei, lesen wir diese im System ein. Dies machen wir hier mit
auslesen=open(Spielstaende$, "r"). Der Name der Zahlenvariable "auslesen" kann frei gewählt
werden, es handelt sich dabei nicht um eine Systemvariable.
Wir starten eine WHILE Schleife, welche solange läuft, bis das Auslesen von der Variable Spielstaende$
beendet ist. Daher ist in while (not EOF(auslesen)) das EOF() angegeben, was bedeutet
"End of File".
Mit line input #auslesen b$ wird bei jedem Schleifendurchgang der Inhalt der jeweiligen Zeile in der
Variable b$ gespeichert.
Da wir nicht mehrere Zeilen in einer Variable speichern können, erstellen wir einen Array mit
dim elements$(1).
Anschließend splitten wir die Varialble b$ bei jedem ; Zeichen und fügen die Elemente in den Array
elements$() ein (numElements = split(b$, elements$(), ";"). Mit numElements zählen wir die
Anzahl der Zeilen, welche wir in den Array speichern.
Dann starten wir eine FOR Schleife mit for i = 1 to numElements. Die Schleife läuft
solange, bis der Wert der Zahlenvariable i gleich der Zahlenvariable numElemtens entspricht.
Mit der Zahlenvariable x=x+1 zählen wir die durchläufe der for Schleife. Da wir hier
immer mit dem Wert 0 anfangen möchten, haben wir vorher die Varialbe auf 0 gesetzt.
Wir erstellen einen weiteren Array mit dem Namen d$ und dimensionieren Ihn mit Hilfe der
Zahlenvariable x (dim d$(x)). Man kann am dieser Stelle sicherlich einen Sinnvolleren Namen
wählen als d$, aber wer längere Zeit programmiert bedient sich gerne kurzer Namen.
Mit d$(x) = elements$(i) fügt man den Inhalt des Arrays d$(x) in den Array
elements$(i) ein.
Mit next i wird der Schleifenvorgang der for Schleife fortgesetzt.
Die WHILE Schleife wird anschließend mit wend zurückgesetzt.
Wir schließen den Auslesevorgang mit close(auslesen).
Damit ist der erste Schritt zum Darstellen der Hightscore getan. Anschließend geht es darum den Inhalt des Arrays elements$()
auf dem View "Hightscore" darzustellen. Die Wichtigste Information die wir dafür benötigen, sind die Position des Textes auf dem
View. Hier muss natürlich etwas probiert werden, bis man die geeignete Darstellung bekommt:
Mit height=100 legen wir die Texthöhe der ersten Zeile fest.
Mit einer neuen Zahlenvariable mit dem Namen aa (nicht grad kreativ) und einer Größe von 1
(aa=1) zählen wir die von uns eingefügten Zeilen. Dabei geht es darum immer die Ungerade
Zeilenzahl zu bekommen.
Wir verwenden eine FOR Schleife zum einfügen der Daten (for a = 1 to x/2). Dazu
erstellen wir eine Zahlenvarialbe a und lassen die Schleife solange laufen, bis der Wert a gleich x geteilt durch 2
ergibt.
Wir schreiben den Inhalt des Arrays d$() mit dem Befehl DRAW TEXT 20,height, d$(aa), "Hightscore"
auf den View "Heightscore". Dabei geben wir die Position des Textes mit den Werten 20 (Abstand vom linken Viewrand) und der Zahlenvariable
height an. Der Text der eingefügt werden soll, wird dem Array d$(aa) entnommen. Um die richtige Zeile im Array zu
bekommen verwenden wir nun die Zahlenvarialbe aa.
Da der Eintag im Array so aussieht, daß sich Heightscore Zahl und Name des Spielers immer abwechseln (Zahl;Name Spieler),
müssen wir nun die nächste Zeile überspringen, da wir zuerst alle Heightscore Zahlen eintragen. Dies mache wir mit
aa=aa+2.
Auch die Höhe muss automatisch erweitert werden, da sonst die Zahlen übereinander stehen. Daher erhöhen wir die
Höhe immer um 20 Pixel (height=height+20).
Mit next a beenden wir den Schleifendurchgang.
Nun müssen wir die Zahlenvarialbe height erneut auf 100 zurücksetzten, da wir sonst unterschiedliche Höhlen
bekommen, wenn wir nun hinter die Heightscore Zahlen die Namen eintragen.
Mit einer neuen Zahlenvariable mit dem Namen bb (immer noch nicht gerade kreativ) und einer Größe von 2
(bb=2) zählen wir die von uns eingefügten Zeilen. Dabei geht es darum immer die gerade
Zeilenzahl zu bekommen.
Wir verwenden erneut eine FOR Schleife zum einfügen der Daten (for b = 2 to x/2). Dazu
erstellen wir eine Zahlenvarialbe b und lassen die Schleife solange laufen, bis der Wert b gleich x geteilt durch 2
ergibt.
Wir schreiben erneut den Inhalt des Arrays d$() mit dem Befehl
DRAW TEXT 20,height, d$(bb), "Hightscore"
auf den View "Heightscore". Diesmal geben wir aber die Position des Textes mit den Werten 120 (Abstand vom linken Viewrand) und der
Zahlenvariable height an. Der Text der eingefügt werden soll, wird dem Array d$(bb) entnommen. Um die richtige
Zeile im Array zu bekommen verwenden wir nun die Zahlenvarialbe bb.
Auch diesmal müssen wir auf Grund des Array Aufbaus (Zahl;Name Spieler), jede zweite Zeile überspringen, da wir nun alle
Spieler Namen eintragen möchten. Dies mache wir mit bb=bb+2.
Auch diesmal muss die Höhe automatisch erweitert werden, da sonst die Namen übereinander stehen. Daher erhöhen wir
die Höhe wieder um 20 Pixel (height=height+20). Im Grunde genommen kann man dies auch nur einmal
ausführen, ist aber für das bessere Verstäntnis bei beiden Schleifen eingebaut.
Mit next b beenden wir den Schleifendurchgang.
Am Ende wir die Subroutine mit end sub beendet.
zurück zur Übersicht
7. Menüfunktionen
Nun geht es noch darum, die Menüoptionen ausführbar zu machen. Fügen Sie dazu folgenden Kode im Bereich
//cases ein:
case "Hauptfenster:Game:Hightscore|"
VIEW REMOVE "GameTable"
Hightscore()
break
case "Hauptfenster:Game:New Game|"
MENU SET "Game", "Hightscore", "Enable", "Hauptfenster"
VIEW REMOVE View$
klicks=0
spielzug=0
status=0
Programm_Fenster()
break
|
Wir haben hier zwei Cases, eine für das Aufrufen der Heightscore und eine für das Starten eines neuen Spiels.
Das Aufrufen der Heightscore ist einfach. Hier muss nur der aktuelle View mit
VIEW REMOVE "GameTable" entfernt werden und die Subroutine
Hightscore() aufgerufen werden.
Bei dem Aufruf des neuen Spiels müssen einige Zahlenvariable zurückgesetzt werden und auch vorher deaktivierte Menübereiche
wieder aktiviert werden:
Wir aktivieren den Menüpunkt Heightscore mit MENU SET "Game", "Hightscore", "Enable",
"Hauptfenster".
Dann werden alle Zahlenvariablen wieder auf 0 gesetzt, die für das Erfassen des Spielablaufes nötig sind. Dies sind die
klicks, die Spielzüge (spielzug) und der status
Am Ende wir die Subroutine Programm_Fenster() aufgerufen.
zurück zur Übersicht
8. Der komplette Quellkode
#!/boot/home/config/bin/yab
B_Breite = peek("desktopwidth")
B_Hoehe = peek("desktopheight")
if (peek("isbound")) then
Programmordner$ = peek$("directory")
else
Programmordner$=system$("pwd")
Programmordner$ = left$(Programmordner$, len(Programmordner$)-1)
fi
Grafikordner$=Programmordner$+"/gfx/"
klicks=0
spielzug=0
status=0
WINDOW OPEN B_Breite/2-250,B_Hoehe/2-250 to B_Breite/2+250,B_Hoehe/2+250, "Hauptfenster", "Memory Game"
WINDOW SET "Hauptfenster", "Flags", "Not-Resizable,Not-Zoomable"
MENU "File", "Quit", "Q", "Hauptfenster"
MENU "Game", "New Game", "N", "Hauptfenster"
MENU "Game", "Hightscore", "H", "Hauptfenster"
Programm_Fenster()
dim part$(1)
inloop = true
while(inloop)
msg$ = message$
if (split(msg$, part$(), ":|") > 2) then
PartOne$=part$(1)
PartTwo$ = part$(2)
PartThree$ = part$(3)
fi
if (msg$ <> "") print msg$
switch msg$
case "Hauptfenster:File:Quit|"
WINDOW CLOSE "Hauptfenster"
break
case "Hauptfenster:_QuitRequested|"
WINDOW CLOSE "Hauptfenster"
break
case "B_1|"
BuView$="Button1"
Button$="B_1"
horizontal1=10
vertikal1=10
horizontal2=120
vertikal2=120
BildNr=1
BildAuswahl()
break
case "B_2|"
BuView$="Button2"
Button$="B_2"
horizontal1=130
vertikal1=10
horizontal2=240
vertikal2=120
BildNr=2
BildAuswahl()
break
case "B_3|"
BuView$="Button3"
Button$="B_3"
horizontal1=250
vertikal1=10
horizontal2=360
vertikal2=120
BildNr=3
BildAuswahl()
break
case "B_4|"
BuView$="Button4"
Button$="B_4"
horizontal1=370
vertikal1=10
horizontal2=480
vertikal2=120
BildNr=4
BildAuswahl()
break
case "B_5|"
BuView$="Button5"
Button$="B_5"
horizontal1=10
vertikal1=130
horizontal2=120
vertikal2=240
BildNr=5
BildAuswahl()
break
case "B_6|"
BuView$="Button6"
Button$="B_6"
horizontal1=130
vertikal1=130
horizontal2=240
vertikal2=240
BildNr=6
BildAuswahl()
break
case "B_7|"
BuView$="Button7"
Button$="B_7"
horizontal1=250
vertikal1=130
horizontal2=360
vertikal2=240
BildNr=7
BildAuswahl()
break
case "B_8|"
BuView$="Button8"
Button$="B_8"
horizontal1=370
vertikal1=130
horizontal2=480
vertikal2=240
BildNr=8
BildAuswahl()
break
case "B_9|"
BuView$="Button9"
Button$="B_9"
horizontal1=10
vertikal1=250
horizontal2=120
vertikal2=360
BildNr=9
BildAuswahl()
break
case "B_10|"
BuView$="Button10"
Button$="B_10"
horizontal1=130
vertikal1=250
horizontal2=240
vertikal2=360
BildNr=10
BildAuswahl()
break
case "B_11|"
BuView$="Button11"
Button$="B_11"
horizontal1=250
vertikal1=250
horizontal2=360
vertikal2=360
BildNr=11
BildAuswahl()
break
case "B_12|"
BuView$="Button12"
Button$="B_12"
horizontal1=370
vertikal1=250
horizontal2=480
vertikal2=360
BildNr=12
BildAuswahl()
break
case "B_13|"
BuView$="Button13"
Button$="B_13"
horizontal1=10
vertikal1=370
horizontal2=120
vertikal2=480
BildNr=13
BildAuswahl()
break
case "B_14|"
BuView$="Button14"
Button$="B_14"
horizontal1=130
vertikal1=370
horizontal2=240
vertikal2=480
BildNr=14
BildAuswahl()
break
case "B_15|"
BuView$="Button15"
Button$="B_15"
horizontal1=250
vertikal1=370
horizontal2=360
vertikal2=480
BildNr=15
BildAuswahl()
break
case "B_16|"
BuView$="Button16"
Button$="B_16"
horizontal1=370
vertikal1=370
horizontal2=480
vertikal2=480
BildNr=16
BildAuswahl()
break
case "Speichern|"
Spieler_Name$ = TEXTCONTROL GET$ "Spieler_Name"
anlegen=open(Programmordner$+"/Hightscore.data", "a")
print #anlegen str$(spielzug)+";"+Spieler_Name$
close(anlegen)
Output$=System$("sort -g "+Programmordner$+"/Hightscore.data > "+Programmordner$+"/Hightscore.temp")
Output$=System$("rm "+Programmordner$+"/Hightscore.data")
Output$=system$("cp "+Programmordner$+"/Hightscore.temp "+Programmordner$+"/Hightscore.data")
Output$=System$("rm "+Programmordner$+"/Hightscore.temp")
WINDOW CLOSE "Status"
VIEW REMOVE "GameTable"
Hightscore()
break
case "Hauptfenster:Game:Hightscore|"
VIEW REMOVE "GameTable"
Hightscore()
break
case "Hauptfenster:Game:New Game|"
MENU SET "Game", "Hightscore", "Enable", "Hauptfenster"
VIEW REMOVE View$
klicks=0
spielzug=0
status=0
Programm_Fenster()
break
default:
end switch
if(window count<1) inloop = false
sleep 0.1
wend
sub Program_Window()
View$="GameTable"
VIEW 0,15 TO 500, 495, "GameTable", "Hauptfenster"
VIEW 10,10 TO 120,120, "Button1", "GameTable"
BUTTON IMAGE 5,5, "B_1", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button1"
VIEW 130,10 TO 240,120, "Button2", "GameTable"
BUTTON IMAGE 5,5, "B_2", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button2"
VIEW 250,10 TO 360,120, "Button3", "GameTable"
BUTTON IMAGE 5,5, "B_3", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button3"
VIEW 370,10 TO 480,120, "Button4", "GameTable"
BUTTON IMAGE 5,5, "B_4", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button4"
VIEW 10,130 TO 120,240, "Button5", "GameTable"
BUTTON IMAGE 5,5, "B_5", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button5"
VIEW 130,130 TO 240,240, "Button6", "GameTable"
BUTTON IMAGE 5,5, "B_6", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button6"
VIEW 250,130 TO 360,240, "Button7", "GameTable"
BUTTON IMAGE 5,5, "B_7", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button7"
VIEW 370,130 TO 480,240, "Button8", "GameTable"
BUTTON IMAGE 5,5, "B_8", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button8"
VIEW 10,250 TO 120,360, "Button9", "GameTable"
BUTTON IMAGE 5,5, "B_9", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button9"
VIEW 130,250 TO 240,360, "Button10", "GameTable"
BUTTON IMAGE 5,5, "B_10", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button10"
VIEW 250,250 TO 360,360, "Button11", "GameTable"
BUTTON IMAGE 5,5, "B_11", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button11"
VIEW 370,250 TO 480,360, "Button12", "GameTable"
BUTTON IMAGE 5,5, "B_12", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button12"
VIEW 10,370 TO 120,480, "Button13", "GameTable"
BUTTON IMAGE 5,5, "B_13", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button13"
VIEW 130,370 TO 240,480, "Button14", "GameTable"
BUTTON IMAGE 5,5, "B_14", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button14"
VIEW 250,370 TO 360,480, "Button15", "GameTable"
BUTTON IMAGE 5,5, "B_15", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button15"
VIEW 370,370 TO 480,480, "Button16", "GameTable"
BUTTON IMAGE 5,5, "B_16", Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, "Button16"
end sub
sub BildAuswahl()
VIEW REMOVE BuView$
VIEW horizontal1,vertikal1 TO horizontal2,vertikal2, BuView$, "GameTable"
err = DRAW IMAGE 5,5 TO 105,105, Grafikordner$+"bild"+str$(BildNr)+".png", BuView$
klicks=klicks+1
if(klicks=1)then
Karte1$="bild"+str$(BildNr)+".png"
Karte_Button1$=Button$
Karte_horizontal1=horizontal1
Karte_vertikal1=vertikal1
Karte_horizontal2=horizontal2
Karte_vertikal2=vertikal2
KarteView1$=BuView$
elseif(klicks=2)then
Karte2$="bild"+str$(BildNr)+".png"
Karte_Button2$=Button$
Karte_horizontal3=horizontal1
Karte_vertikal3=vertikal1
Karte_horizontal4=horizontal2
Karte_vertikal4=vertikal2
KarteView2$=BuView$
fi
if(klicks=2)then
if(Karte1$=Karte2$)then
status=status+1
spielzug=spielzug+1
if(status=8)then
window open B_Breite/2-120,B_Hoehe/2-70 to
B_Breite/2+120,B_Hoehe/2+70, "Status", "Gewonnen"
WINDOW SET "Status", "Look", "Modal"
WINDOW SET "Status", "Flags",
"Not-Resizable,Not-Zoomable"
DRAW SET "system-bold", "Status"
DRAW TEXT 10,15, "Sie haben gewonnen!!!",
"Status"
DRAW SET "system-plain", "Status"
DRAW TEXT 10,45, "Runden: "+str$(spielzug),
"Status"
TEXTCONTROL 10,50 TO 230,40,
"Spieler_Name", "Enter Name:", "", "Status"
BUTTON 60,100 TO 180,110, "Speichern",
"Speichern", "Status"
fi
else
spielzug=spielzug+1
wait 0.5
VIEW REMOVE KarteView1$
VIEW REMOVE KarteView2$
VIEW Karte_horizontal1,Karte_vertikal1 TO
Karte_horizontal2,Karte_vertikal2, KarteView1$, "GameTable"
BUTTON IMAGE 5,5, Karte_Button1$,
Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, KarteView1$
VIEW Karte_horizontal3,Karte_vertikal3 TO
Karte_horizontal4,Karte_vertikal4, KarteView2$, "GameTable"
BUTTON IMAGE 5,5, Karte_Button2$,
Grafikordner$+"bild0.png", Grafikordner$+"bild0.png", Disabled$, KarteView2$
fi
klicks=0
fi
end sub
sub Hightscore()
View$="Hightscore"
MENU SET "Game", "Hightscore", "Disable", "Hauptfenster"
VIEW 0,15 TO 500, 495, "Hightscore", "Hauptfenster"
DRAW SET "system-bold", "Hightscore"
DRAW TEXT 20,50, "Hightscore", "Hightscore"
DRAW SET "system-plain", "Hightscore"
Spielstaende$=Programmordner$+"/Hightscore.data"
x=0
auslesen=open(Spielstaende$, "r")
while (not EOF(auslesen))
line input #auslesen b$
dim elements$(1)
numElements = split(b$, elements$(), ";")
for i = 1 to numElements
x=x+1
dim d$(x)
d$(x) = elements$(i)
next i
wend
close(auslesen)
height=100
aa=1
for a = 1 to x/2
DRAW TEXT 20,height, d$(aa), "Hightscore"
aa=aa+2
height=height+20
next a
height=100
bb=2
for b = 1 to x/2
DRAW TEXT 120,height, d$(bb), "Hightscore"
bb=bb+2
height=height+20
next b
end sub
|
zurück zur Übersicht
9. Nachwort
Damit haben wir ein vollständig funktionierendes Memory Spiel. Jedoch ist noch ein grober Fehler enthalten. Keine Fehler, der den
Ablauf des Spiels verhindert, aber Etwas was weiter ausgearbeitet werden muß.
Die Spielkarten werden zwar verdeckt dargestellt, dies aber immer an den selben Stellen. Hier müssten die Spielkarten mit einem Random
System bei jedem Laden oder neu Starten des Spiels auf die Button Views verteilt werden.
Wie man dies macht ist nicht Teil dieses Tutorials. Vielleicht wird es eine Erweiterung für dieses Tutorial geben, wo wir einen
Lösungsweg anbieten. Bis dahin jedoch sollte dies eine Aufgabenstellung sein, die dem jenigen Kopfzerbrechen bereiten wird, der sich
daran macht, dieses Spiel zu vollenden *Smile*.
zurück zur Übersicht
10. Download
Hier
könnt Ihr das Spiel mit Sourcecode in compilierten Zustand herunterladen und austesten.
zurück zur Übersicht
Anleitung erstellt durch Christian Albrecht (Lelldorin) Dezember 2007
Bereitgestellt durch BeSly, der BeOS & Zeta Wissensbasis.
|