Connect6 Spiel - Code in ei

Status
Nicht offen für weitere Antworten.

SyNaTiiC

Neues Mitglied
Java:
import java.util.Scanner;

/**

 * Spiel: Connect6. "Connect 6 is a two-player strategy game similar to Gomoku.

 * Two players, Black and White, alternately place two stones of their own

 * colour, black and white respectively, on empty intersections of a Go-like

 * board, except that Black (the first player) places one stone only for the

 * first move. The one who gets six or more stones in a row (horizontally,

 * vertically or diagonally) first wins the game." - Wikipedia.

 *

 * @author michaeldietz

 *

 */

public class Connect6 {

public static char color; // Die Farbe des Steins, der als naechste gespielt wird.

public static char[][] board; // Das Spielbrett.

public static int x, y; // Spielfeldgroeße.

public static int r, s; // Koordinaten des Feldes, auf das der naechste Stein gespielt wird.

public static Scanner scanner = new Scanner(System.in);

public static boolean gameNotOver = true;



public static void main(String[] args) throws Exception {

x = reihenAnzahl();

y = spaltenAnzahl();

System.out.println();

board = new char[x][y];

fillBoard(board); // füllt die Felder mit dem Zeichen '.'.

printBoard(board); // Zeichnet das Spielfeld.

playGame(board); // Spiel beginnt.

}



/**

* Spielt das Spiel Connect6. Spieler black beginnt zuerst. Spiel endet,

* wenn einer der beiden Spieler 6 Felder in einer waagerechten, diagonalen

* oder senkrechten hat.

*

* @param board

*/

public static void playGame(char[][] board) throws Exception{



boolean blackTurn = true;

boolean firstTurn = true;



while (gameNotOver) { // solange das Spiel nicht zu Ende ist.

if (blackTurn) { // black ist am Zug.

System.out.println("\nBlack ist am Zug:");

if (firstTurn) { // In der ersten Runde darf black nur einen Stein platzieren. Ansonsten immer zwei.

gibKoordinaten('B'); // Fragt nach den Koordinaten.

printBoard(board); // Zeichnet das aktuelle Spielbrett.

blackTurn = !blackTurn; // beendet Runde und white beginnt.

firstTurn = !firstTurn; // die erste Runde ist vorbei und ab jetzt darf jeder zwei Steine platzieren.

}

else { // ab dem zweiten Zug.

for (int i = 0; i < 2; i++) { // wiederholt das ganze zweimal, da jeder zwei Steine platzieren darf.

gibKoordinaten('B'); // Fragt nach den Koordinaten.

printBoard(board); // Zeichnet das aktuelle Spielbrett.

if (gameWinner()) {

gameNotOver = false;

System.out.println("Glückwunsch, Spieler " + color + " hat das Spiel gewonnen!" );

break;

}

}

blackTurn = !blackTurn; // beendet Runde und white beginnt.

}

}

else { // white ist am Zug.

System.out.println("\nWhite ist am Zug:");

for (int i = 0; i < 2; i++) { // wiederholt das ganze zweimal, da jeder zwei Steine platzieren darf.

gibKoordinaten('W'); // Fragt nach den Koordinaten.

printBoard(board); // Zeichnet das aktuelle Spielbrett.

if (gameWinner()) {

gameNotOver = false;

System.out.println("Glückwunsch, Spieler " + color + " hat das Spiel gewonnen!" );

break;

}

}

blackTurn = !blackTurn; // beendet Runde und black beginnt.

}

}

}



/**

* (Spielfeldkomponente beginnt hier und kann unabhängig vom anderen modifziert werden.)

* Zeichnet das Spielbrett.

*

* @param board

*/

public static void printBoard(char[][] board) {

for (int i = 0; i < board.length; i++) { // für jede Reihe...

for (int j = 0; j < board[I].length; j++) { // für jede Spalte...

System.out.print("|" + board[I][j]);

}

System.out.println("|");

}

}



/**

* Füllt das Spielbrett mit dem Defaultwert '.' aus.

* 

* @param board

*/

public static void fillBoard(char[][] board) {

for (int i = 0; i < board.length; i++) { // für jede Reihe...

for (int j = 0; j < board[I].length; j++) { // für jede Spalte...

board[I][j] = '.'; // Belege das Feld mit dem Initialisierungswert.

}

}

}



/**

* (Spielfeldkomponente endet hier)

* Kontrolliert, ob das Feld schon besetzt ist oder nicht. Liefert true,

* wenn das Feld noch nicht besetzt ist, liefert false, wenn das Feld

* besetzt ist. Wenn das Feld noch nicht besetzt ist, platziert es den zu spielenden

* Stein an diese Stelle.

* 

* @param board

* @param color

* @param x

* @param y

* [USER=49078]@Return[/USER]

*/

public static boolean checkField(char[][] board, char color, int x, int y) {

if (board[x][y] == '.') { // Wenn das Feld leer ist...

board[x][y] = color;

return true;

} else { // ansonsten...

System.out.println("Das Feld ist bereits besetzt. Bitte wiederholen sie ihre Eingabe.\n");

return false;

}

}



/**

* (Dialogkomponente beginnt hier und kann unabhängig vom anderen modifiziert werden.)

* Fragt nach der Reihe, in welche der Spieler seinen Stein platzieren

* möchte.

* 

* [USER=49078]@Return[/USER] Reihenkoordinate

*/

public static int gibReihenKoordinate(int a) {

int i = 0;

System.out.println("Bitte geben sie ein, in welche Reihe sie spielen möchten(1-" + a + ").");

String o = scanner.nextLine();

if (o.equalsIgnoreCase("beenden")) {

System.exit(0);

}

else {

i = Integer.parseInt(o) - 1;

while (i < 0 || i > a - 1) { // solange sich die Eingabe außerhalb des Feldes befindet...

System.out.println("Reihenposition befindet sich außerhalb des Spielfeldes. Bitte wiederholen sie ihre Eingabe.");

System.out.println("Bitte geben sie ein, in welche Reihe sie spielen möchten(1-" + a + ").");

o = scanner.nextLine();

if (o.equalsIgnoreCase("beenden")) {

System.exit(0);

}

else {

i = Integer.parseInt(o) - 1;

}

}

}

return i;

}



/**

* Fragt nach der Spalte, in welche der Spieler seinen Stein platzieren

* möchte.

* 

* [USER=49078]@Return[/USER] Spaltenkoordinate

*/

public static int gibSpaltenKoordinate(int b) {

int i = 0;

System.out.println("Bitte geben sie ein, in welche Spalte sie spielen möchten(1-" + b + ").");

String o = scanner.nextLine();

if (o.equalsIgnoreCase("beenden")) {

System.exit(0);

}

else {

i = Integer.parseInt(o) - 1;

while (i < 0 || i > b - 1) { // solange sich die Eingabe außerhalb des Feldes befindet...

System.out.println("Reihenposition befindet sich außerhalb des Spielfeldes. Bitte wiederholen sie ihre Eingabe.");

System.out.println("Bitte geben sie ein, in welche Spalte sie spielen möchten(1-" + b + ").");

o = scanner.nextLine();

if (o.equalsIgnoreCase("beenden")) {

System.exit(0);

}

else {

i = Integer.parseInt(o) - 1;

}

}

System.out.println();

}

return i;

}



/**

* Fragt nach den Koordinaten, in welche der Spieler seinen Stein platzieren

* möchte.

* 

* @param farbe

* @throws Exception

*/

public static void gibKoordinaten(char farbe) throws Exception {

r = gibReihenKoordinate(x);

s = gibSpaltenKoordinate(y);

color = farbe;

while (!checkField(board, color, r, s)) { // wenn das Feld besetzt ist.

r = gibReihenKoordinate(x);

s = gibSpaltenKoordinate(y);

color = farbe;

}

}


/**

* Fragt nach der Anzahl der Reihen des Spielfeldes.

* [USER=49078]@Return[/USER]

* @throws Exception

*/

public static int reihenAnzahl() throws Exception {

x = IO.readInt("Wie viele Reihen soll das Spielfeld haben(6-20)?");

while (x < 6 || x > 20) { // solange es sich nicht im Bereich befindet...

System.out.println("Ihre Eingabe befindet sich außerhalb der gueltigen Groeße. Bitte wiederholen sie ihre Eingabe.");

x = IO.readInt("Wie viele Reihen soll das Spielfeld haben(6-20)?");

}

return x;

}


/**

* (Dialogkomponente endet hier.)

* Fragt nach der Anzahl der Spalten des Spielfeldes.

* [USER=49078]@Return[/USER]

* @throws Exception

*/

public static int spaltenAnzahl() throws Exception {

y = IO.readInt("Wie viele Spalten soll das Spielfeld haben(6-20)?");

while (y < 6 || y > 20) { // solange es sich nicht im Bereich befindet...

System.out.println("Ihre Eingabe befindet sich außerhalb der gueltigen Groeße. Bitte wiederholen sie ihre Eingabe.");

y = IO.readInt("Wie viele Spalten soll das Spielfeld haben(6-20)?");

}

return y;

}


/**

* Kontrolliert ob es einen Gewinner gibt.

* Returnt true, wenn eine lückenlose vertikale, horizontale oder diagonale 

* Reihe von sechs oder mehr der gleichen Steine gebildet wurde.

* [USER=49078]@Return[/USER]

*/

public static boolean gameWinner() {


if (checkReihe()) { // kontrolliert ob jemand 6 oder mehr Steine in einer Reihe hat.

return true;

}


if (checkSpalte()) { // kontrolliert ob jemand 6 oder mehr Steine in einer Spalte hat.

return true;

}

if (checkDiagonal1()) { // kontrolliert ob jemand 6 oder mehr Steine in einer Diagonalen von links oben nach rechts unten hat.

return true;

}

if (checkDiagonal2()) {

return true;

}

return false;

}


/**

* 

* Returnt true, wenn 6 oder mehr der gleichen Steine lückenlos in einer Reihe sind.

* [USER=49078]@Return[/USER]

*/

public static boolean checkReihe() {

int counter = 1; // Anzahl der lückenloses Steine, der gleichen Farbe.

for (int i = s - 1; i >= 0; i--) { // zaehlt wieviele Steine der gleichen Farbe lückenlos links neben dem platzierten Stein liegen.

if (board[r][I] == color) {

counter++;

} else {

break;

}

}

if (counter >= 6) {

return true;

}

for (int i = s + 1 ; i < y; i++) { // zaehlt wieviele Steine der gleichen Farbe lückenlos rechts neben dem platzierten Stein liegen.

if (board[r][I] == color) {

counter++;

} else {

break;

}

}

if (counter >= 6) {

return true;

}

return false;

}


/**

* 

* Returnt true, wenn 6 oder mehr der gleichen Steine lückenlos in einer Spalte sind.

* [USER=49078]@Return[/USER]

*/

public static boolean checkSpalte() {

int counter = 1; // Anzahl der lückenloses Steine, der gleichen Farbe.

for (int i = r - 1; i >= 0; i--) { // zaehlt wieviele Steine der gleichen Farbe lückenlos oberhalb des platzierten Steins liegen.

if (board[I][S] == color) {

counter++;

} else {

break;

}

}

if (counter >= 6) {

return true;

}

for (int i = r + 1; i < x; i++) { // zaehlt wieviele Steine der gleichen Farbe lückenlos unterhalb des platzierten Steins liegen.

if (board[I][S] == color) {

counter++;

} else {

break;

}

}

if (counter >= 6) {

return true;

}

return false;

}


/**

* Returnt true, wenn 6 oder mehr Steine lückenlos in einer Diagonalen von

* links oben nach rechts unten sind.

* [USER=49078]@Return[/USER]

*/

public static boolean checkDiagonal1() {

int counter = 1; // Anzahl der lückenloses Steine, der gleichen Farbe.

for(int i = r - 1, j = s - 1; i >= 0 && j >= 0; i--, j--) { // zaehlt wieviele Steine der gleichen Farbe lückenlos links oben des platzierten Steins liegen.

if(board[I][j] == color) {

counter++;

}

else {

break;

}

}

if (counter >= 6) {

return true;

}

for(int i = r + 1, j = s + 1; i < x && j < y; i++, j++){ // zaehlt wieviele Steine der gleichen Farbe lückenlos rechts unten des platzierten Steins liegen.

if(board[I][j] == color) {

counter++;

}

else {

break;

}

}

if (counter >= 6) {

return true;

}

return false;

}


/**

* Returnt true, wenn 6 oder mehr Steine lückenlos in einer Diagonalen von

* rechts oben nach links unten sind.

* [USER=49078]@Return[/USER]

*/

public static boolean checkDiagonal2() {

int counter = 1; // Anzahl der lückenloses Steine, der gleichen Farbe.

for(int i = r - 1, j = s + 1; i >= 0 && j < y; i--, j++) { // zaehlt wieviele Steine der gleichen Farbe lückenlos rechts oben des platzierten Steins liegen.

if(board[I][j] == color) {

counter++;

}

else {

break;

}

}

if (counter >= 6) {

return true;

}

for(int i = r + 1, j = s - 1; i < x && j >= 0; i++, j--){ // zaehlt wieviele Steine der gleichen Farbe lückenlos links unten des platzierten Steins liegen.

if(board[I][j] == color) {

counter++;

}

else {

break;

}

}

if (counter >= 6) {

return true;

}

return false;


}

}
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben