1
0
Fork 0

Compare commits

...

7 Commits
tryOut ... main

Author SHA1 Message Date
Oliver Hummel 5d719ae8db Einfachen Testfall hinzugefügt. 2023-11-22 19:27:50 +01:00
Oliver Hummel bb9bcf63bd Noch fehlende Möglichkeit für mehrere Spielrunden eingefügt. 2023-11-21 17:45:44 +01:00
Oliver Hummel 1453ff4717 Code weiter aufgeräumt (engl. Refactoring). 2023-11-21 17:02:27 +01:00
Oliver Hummel 336965b91e Steine-Zähler vereinfacht. 2023-11-21 16:50:46 +01:00
Oliver Hummel 2180f16195 Spielerwechsel zur besseren Übersicht in Methode gepackt. 2023-11-21 16:42:24 +01:00
Oliver Hummel 7831e195ea 2. diagonale Gewinnerprüfung eingefügt. 2023-11-21 16:12:01 +01:00
Oliver Hummel 635d1640f6 Diagonale Gewinnerprüfung Teil 1 hinzugefügt. 2023-11-21 15:48:53 +01:00
2 changed files with 101 additions and 44 deletions

View File

@ -1,112 +1,121 @@
import java.util.Scanner; import java.util.Scanner;
public class VierGewinnt { public class VierGewinnt {
static Scanner kb = new Scanner(System.in); // sog. Klassenvariable
public static void main(String[] args) { public static void main(String[] args) {
System.out.println("Willkommen zu 4 Gewinnt!");
// Game Loop // Game Loop
Scanner kb = new Scanner(System.in); String weiter;
boolean weiter = false;
char spieler = 'x'; char spieler = 'x';
do { do {
System.out.println("Willkommen zu 4 Gewinnt!");
char[][] spielfeld = spielfeldInitialisieren(); char[][] spielfeld = spielfeldInitialisieren();
int steineZähler = 0;
spielfeldAusgeben(spielfeld); spielfeldAusgeben(spielfeld);
int steineZähler = 0;
// Gewinner Loop // Gewinner Loop
boolean gewonnen = false; boolean gewonnen = false;
do { do {
if (spieler == 'o') spieler = spielerWechseln(spieler);
spieler = 'x';
else
spieler = 'o';
// Spielstein einwerfen int[] koordinate = spielsteinEinwerfen(spielfeld, spieler);
int spalte, zeile; gewonnen = gewinnerPrüfung(spielfeld, koordinate[0], koordinate[1]);
do {
System.out.print("Spieler " + spieler + ", bitte wählen Sie eine Spalte aus: ");
spalte = kb.nextInt() - 1; // da Spalte eins verschoben
if ((zeile = einwurfVerarbeiten(spielfeld, spalte, spieler)) == -1)
System.err.println("Ungültige Auswahl!");
else
break;
} while(true);
steineZähler++;
spielfeldAusgeben(spielfeld);
gewonnen = gewinnerPrüfung(spielfeld, zeile, spalte);
} while(!gewonnen && steineZähler < 42);
spielfeldAusgeben(spielfeld);
} while(!gewonnen && ++steineZähler < 42);
if (!gewonnen && steineZähler == 42) { if (!gewonnen && steineZähler == 42) {
System.out.println("Das Spiel endet unentschieden."); System.out.println("Das Spiel endet unentschieden.");
} else { } else {
System.out.println("Es gewinnt Spieler " + spieler); System.out.println("Es gewinnt Spieler " + spieler);
} }
} while (weiter); System.out.println();
System.out.print("Möchten Sie noch eine Runde spielen (j/n)? ");
weiter = kb.next();
} while (weiter.equalsIgnoreCase("j"));
System.out.println("Auf Wiedersehen!"); System.out.println("Auf Wiedersehen!");
} // main } // main
public static char[][] spielfeldInitialisieren() { public static char[][] spielfeldInitialisieren() {
char[][] spielfeld = new char[6][7]; char[][] spielfeld = new char[6][7];
for (int z = 0; z < spielfeld.length; z++) { for (int z = 0; z < spielfeld.length; z++) {
for (int s = 0; s < spielfeld[z].length; s++) { for (int s = 0; s < spielfeld[z].length; s++) {
spielfeld[z][s] = '_'; spielfeld[z][s] = '_';
} }
} }
return spielfeld; return spielfeld;
} }
public static void spielfeldAusgeben(char[][] spielfeld) { public static void spielfeldAusgeben(char[][] spielfeld) {
System.out.println(); System.out.println();
// Alle Zeilen ausgeben // Alle Zeilen ausgeben
for (int z = 0; z < spielfeld.length; z++) { for (int z = 0; z < spielfeld.length; z++) {
// Alle Spalten der z-ten Zeile ausgeben // Alle Spalten der z-ten Zeile ausgeben
for (int s = 0; s < spielfeld[z].length; s++) { for (int s = 0; s < spielfeld[z].length; s++) {
System.out.print("| " + spielfeld[z][s] + " " ); System.out.print("| " + spielfeld[z][s] + " " );
} }
System.out.println("|"); System.out.println("|");
} }
System.out.println(); System.out.println();
for (int s = 0; s < spielfeld[0].length; s++) { for (int s = 0; s < spielfeld[0].length; s++) {
System.out.print("| " + (s+1) + " " ); System.out.print("| " + (s+1) + " " );
} }
System.out.println("|"); System.out.println("|");
System.out.println(); System.out.println();
} }
public static char spielerWechseln(char spieler) {
if (spieler == 'o')
return 'x';
return 'o';
}
public static int[] spielsteinEinwerfen(char[][] spielfeld, char spieler) {
int zeile, spalte;
do {
System.out.print("Spieler " + spieler + ", bitte wählen Sie eine Spalte aus: ");
spalte = kb.nextInt() - 1; // da Spalte eins verschoben
if ((zeile = einwurfVerarbeiten(spielfeld, spalte, spieler)) == -1)
System.err.println("Ungültige Auswahl!");
else
break;
} while(true);
return new int[] {zeile, spalte};
}
public static int einwurfVerarbeiten(char[][] spielfeld, int spalte, char stein) { public static int einwurfVerarbeiten(char[][] spielfeld, int spalte, char stein) {
if (spalte < 0 || spalte > 6) if (spalte < 0 || spalte > 6)
return -1; return -1;
for (int z = spielfeld.length - 1; z >= 0 ; z--) { for (int z = spielfeld.length - 1; z >= 0 ; z--) {
if (spielfeld[z][spalte] != '_' && z == 0) // Spalte voll? if (spielfeld[z][spalte] != '_' && z == 0) // Spalte voll?
return -1; return -1;
if (spielfeld[z][spalte] == '_') { if (spielfeld[z][spalte] == '_') {
spielfeld[z][spalte] = stein; spielfeld[z][spalte] = stein;
return z; return z;
} }
} }
return -1; return -1;
} }
public static boolean gewinnerPrüfung(char[][] spielfeld, int zeile, int spalte) { public static boolean gewinnerPrüfung(char[][] spielfeld, int zeile, int spalte) {
// vertikale Prüfung // vertikale Prüfung
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
if (spielfeld[0 + i][spalte] == spielfeld[1 + i][spalte] if (spielfeld[0 + i][spalte] == spielfeld[1 + i][spalte]
@ -115,7 +124,7 @@ public class VierGewinnt {
&& spielfeld[0 + i][spalte] != '_') && spielfeld[0 + i][spalte] != '_')
return true; return true;
} }
// horizontale Prüfung // horizontale Prüfung
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (spielfeld[zeile][0 + i] == spielfeld[zeile][1 + i] if (spielfeld[zeile][0 + i] == spielfeld[zeile][1 + i]
@ -124,7 +133,30 @@ public class VierGewinnt {
&& spielfeld[zeile][0 + i] != '_') && spielfeld[zeile][0 + i] != '_')
return true; return true;
} }
// diagonale Prüfung 1: "Plusplus-Fall", z.B. spielfeld[z+1][s+1]
for (int z = 0; z < 3; z++) {
for (int s = 0; s < 4; s++) {
if (spielfeld[z][s] == spielfeld[z+1][s+1]
&& spielfeld[z][s] == spielfeld[z+2][s+2]
&& spielfeld[z][s] == spielfeld[z+3][s+3]
&& spielfeld[z][s] != '_')
return true;
}
}
// diagonale Prüfung 2: "Minusplus-Fall", z.B. spielfeld[z-1][s+1]
for (int z = spielfeld.length-1; z > spielfeld.length-4; z--) {
for (int s = 0; s < 4; s++) {
if (spielfeld[z][s] == spielfeld[z-1][s+1]
&& spielfeld[z][s] == spielfeld[z-2][s+2]
&& spielfeld[z][s] == spielfeld[z-3][s+3]
&& spielfeld[z][s] != '_')
return true;
}
}
return false; return false;
} }
}
} // eof

View File

@ -0,0 +1,25 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class VierGewinntTest {
@Test // sog. Annotation, damit JUnit erkennt, wo es testen soll
void testSpielerWechseln() {
assertEquals('x', VierGewinnt.spielerWechseln('o'));
assertEquals('o', VierGewinnt.spielerWechseln('x'));
}
@Test
void testEinwurfVerarbeiten() {
char[][] expectedSpielfeld = VierGewinnt.spielfeldInitialisieren();
expectedSpielfeld[5][3] = 'o';
char[][] testSpielfeld = VierGewinnt.spielfeldInitialisieren();
assertEquals(5, VierGewinnt.einwurfVerarbeiten(testSpielfeld, 3, 'o'));
assertArrayEquals(expectedSpielfeld, testSpielfeld);
}
}