HSZG Vorkurs Informatik WS 2014/Damespiel mit Nutzerinteraktion
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Java</language>
Die Methoden aus den Arbeitsblättern [[HSZG_Vorkurs_Informatik_WS_2014/Spielfelder | Spielfelder ]] und [[HSZG_Vorkurs_Informatik_WS_2014/Spielregeln | Spielregeln]] können wir nun zu einem interaktiven Dame-Spiel zusammenbauen. Die Nutzerinteraktion wird sich etwas mühselig gestalten, aber beim ersten eigenen Spiel ist das nicht weiter schlimm.
Kopieren Sie zunächst Ihre Methoden aus den oben genannten Arbeitsblättern in diese Codebox:
<code id="54246e9b556a1">
String[][] erstelle_spielfeld(){
String[][] array = new String[8][8];
for(i=0; i<array.length; i++){
for(j=0; j<array[0].length; j++){
array[i][j] = ("|_");
}
}
return array;
}
</code>
'''Basismethoden zur Nutzerinteraktion'''
Da für das Spiel eine Interaktion mit den beiden menschlichen Spielern erforderlich ist, müssen wir zunächst eine Möglichkeit zur Dateneingabe während des Programmablaufs finden. Das Programming-Wiki stellt uns dafür eine Methode ''eingabe(String text)'' bereit. Der vom Nutzer eingegebene Text wird in einer Variable vom Typ String abgespeichert.
<code id="54246e9b55721" hidden>
String eingabe(String text) {
return JOptionPane.showInputDialog(null, text);
}
void ausgabe(String text){
JOptionPane.showMessageDialog(null,text);
}
</code>
<run id="54246e9b557a3">
String text = eingabe("Geben Sie eine Zahl ein!");
</run>
Im gleichen Stil lässt sich eine Ausgabe erzeugen:
<run id="54246e9b55820">
ausgabe("Der Wert ist korrekt!");
</run>
Da es während des Spiels wichtig sein wird, Spielsteinpositionen als Zahlen anzugeben, benötigen wir noch eine Umwandlung von String zu int. Dazu gibt es in Java die Methode ''Integer.parseInt(String text)''. Probieren Sie das gleich mal aus:
<run id="54246f4ed01db">
String text = eingabe("Geben Sie eine Zahl ein!");
int zahl = Integer.parseInt(text);
System.out.println(zahl);
</run>
Die folgende Codebox zeigt das Grundprinzip einer Nutzerinteraktion, bei der abwechselnd zwei Personen zur Eingabe von Daten aufgefordert werden. In diesem Fall soll die Eingabe einer 0 zum Beenden des Programms führen. Beim Dame-Spiel gibt es eine andere Abbruchbedingung (ein Spieler hat keine Steine mehr auf dem Brett). Außerdem soll die Eingabe einer Zahl < 0 ungültig sein (beim Dame-Spiel sind Eingaben ungültig, die zu ungültigen Spielzügen führen).
<code id="5424717b7b28c">
void interaktion(){
boolean abbruch = false;
while(!abbruch){
String text = eingabe("Spieler 1: Geben Sie eine Zahl ein!");
int zahl = Integer.parseInt(text);
System.out.println(zahl);
if(zahl == 0){
abbruch = true;
}
if(zahl < 0){
ausgabe("Die Zahl ist ungültig!");
}
text = eingabe("Spieler 2: Geben Sie eine Zahl ein!");
zahl = Integer.parseInt(text);
System.out.println(zahl);
if(zahl == 0){
abbruch = true;
}
if(zahl < 0){
ausgabe("Die Zahl ist ungültig!");
}
}
}
</code>
<run id="542472de09279">interaktion();</run>
Wie Sie sehen, gibt es noch ein großes Problem: Die Konsolenausgabe wird erst angezeigt, nachdem das Programm beendet ist. Auf diese Weise lässt sich kein Spiel realisieren, denn wir müssen ja den aktuellen Stand der Spielsteine sehen, wenn wir Spielzüge eingeben wollen. '''Sie müssen also bei Ihrem Spiel komplett auf die Anweisung ''System.out.println(...)'' verzichten und stattdessen die Ein- und Ausgabemethode benutzen!'''
Das bedeutet wiederum, dass wir die Methode ''drucke_spielfeld'' so anpassen müssen, dass sie einen String zurückgibt, anstatt Konsolenausgaben zu erzeugen:
<code id="542477b06e92b">
String drucke_spielfeld(String[][] array){
String ergebnis = "";
for(int x=0; x < array.length; x++){
ergebnis = ergebnis + "\n";
for(int y=0; y < array[0].length; y++){
ergebnis = ergebnis + array[x][y];
}
}
return ergebnis;
}
</code>
Eine Ausgabe kann dann z.B. wie folgt aussehen (der Code ist nur eine grobe Skizze, um das Prinzip zu verdeutlichen!):
<code id="542475176c053">
void interaktion(){
String[][] feld = erstelle_spielfeld();
String feld_string = drucke_spielfeld(feld);
String s = eingabe(feld_string+"\n\n"+"Geben Sie eine Zahl ein!");
//nur um das Prinzip zu zeigen schreibe ich irgendwas in das Array:
feld[3][4] = "X";
feld_string = drucke_spielfeld(feld);
s = eingabe(feld_string+"\n\n"+"Geben Sie eine Zahl ein!");
}
</code>
<run id="542475176c12b">interaktion()</run>
'''Spielablauf'''
Das Dame-Spiel soll im Prinzip wie folgt ablaufen:
* Am Anfang wird das Spielbrett initialisiert, indem alle 24 Spielsteine positioniert werden. Dafür sollten Sie schon eine Methode parat haben.
* Danach wird abwechselnd Spieler 1 und Spieler 2 dazu aufgefordert, einen Spielzug anzugeben. Ein Spielzug setzt sich jeweils aus 4 Eingaben zusammen:
# die Zeile der alten Position des Steins
# die Spalte der alten Position des Steins
# die Zeile der neuen Position des Steins
# die Spalte der neuen Position des Steins
Für jeden Spieler, der an der Reihe ist, muss also 4 mal die Methode ''eingabe(...)'' aufgerufen werden. In der Dialogbox soll jedesmal das aktuelle Spielfeld mit angezeigt werden, so wie ich das oben demonstriert habe.
Welcher Spielstein gemeint ist, wird also nur anhand der alten Position des Steins ermittelt. Wir gehen zur Vereinfachung davon aus, dass jeder Spieler selbst darauf achtet, nur Positionen seiner eigenen Steine anzugeben und nicht die des Gegners! Außerdem müssen die Spieler Positionen von 0 bis 7 verwenden (und nicht von 1 bis 8).
Nach der Angabe des Spielzugs eines Spielers wird überprüft, ob der Spielzug gültig ist. Wenn nicht, soll der Spieler eine Fehlermeldung erhalten. Dazu können Sie die Methode ''ausgabe(...)'' verwenden. Danach ist sofort der 2. Spieler an der Reihe (oder Sie warten mit einer while-Schleife darauf, bis der Spieler einen korrekten Zug eingegeben hat).
Wenn ein Spielzug gültig ist, soll das Spielfeld entsprechend modifiziert und neu ausgedruckt werden (d.h. Aufruf von ''drucke_spielfeld'' zur Aktualisierung des Strings, der in den Eingabedialogen angezeigt wird). Wenn möglich, soll bei einem Spielzug auch gesprungen werden, wobei ein Spielstein des Gegners vom Feld entfernt wird. Ob Sie die Beförderung von Spielsteinen zur Dame mit berücksichtigen, überlasse ich Ihnen.
Ihr Programm sollte mitzählen, wie viele Steine jeder Spieler noch auf dem Feld hat. Sobald ein Spieler keine Steine mehr besitzt, sollten Sie das Spiel beenden und ausgeben, dass der andere Spieler gewonnen hat.
Ich wünsche viel Erfolg und gutes Gelingen!
Vorsorglich lege ich gleich einmal drei Codeboxen an, falls Sie Hilfsmethoden auslagern möchten.
<code id="54247b10d1422"></code>
<run id="54247b10d1724"></run>
<code id="54247b10d155d"></code>
<run id="54247b10d17b9"></run>
<code id="54247b10d1688"></code>
<run id="54247b10d1849"></run>