/** * Klasse: Game * * Diese Klasse beinhaltet die Logik für das Spiel. * Der Benutzer kann mit dieser Klasse die Felder des Spielfeldes setzen * * Klasse Language und Gamefield wird im Konstruktor initialisiert. */ public class Game { // Datenfelder Gamefield und Language werden mit dessen Klassen definiert private Gamefield gamefield; private Language language; // Spieler werden definiert. Spieler 1 hat den Wert 1 und Spieler 2 private int player1 = 1; private int player2 = 2; private int playerPlaying = 1; // Definiert, ob das Spiel zu Ende ist. Wird zuerst auf falsch gesetzt. private boolean gameFinished = false; public Game() { gamefield = new Gamefield(); language = new Language("de"); language.outputGameStartedText(); } /** * Methode: placeField * * Spieler setzt sein Symbol in das gewünschte Feld. * Die Methode überprüft auch, ob der Spieler gewonnen hat. * Wenn der Spieler gewonnen hat, dann wird * * @param field vom Spieler markiertes Feld */ public void placeField(int field) { gamefield.outputSeparator(); if (gameFinished) { language.outputGameOverText(); return; } if ((field > 9 || field < 1) || !gamefield.setField(field, playerPlaying)) { language.outputWrongFieldSelected(); return; } language.outputMoveText(gamefield.countSetFields(), playerPlaying); gamefield.outputField(); if(checkForWin()) { language.outputWinnerText(playerPlaying); language.outputGameOverText(); gameFinished = true; } else if (checkForTie()) { language.outputTieText(); language.outputGameOverText(); gameFinished = true; } switchPlayer(); } /** * Methode: switchPlayer * * Diese Methode wechselt den Spieler. Dieser wird von * Methode placeField aufgerufen. * Der Spieler wird automatisch gewechselt. */ private void switchPlayer() { if (playerPlaying == 1) { playerPlaying = player2; } else { playerPlaying = player1; } } /** * Diese Methode ändert die Spielsprache * @param language Spielsprache welche zur Verfügung stehen "de","en","vn" */ public void changeLanguage(String language) { this.gamefield.outputSeparator(); this.language.setOutputLanguage(language); } /** * Methode: checkForWin * * Diese Methode prüft ob das Spiel einen Gewinner hat * @return bei erkanntem Gewinner true sonst false * */ private boolean checkForWin() { return checkWinVariants(1,4,7) || checkWinVariants(2,5,8) || checkWinVariants(3,6,9) || checkWinVariants(1,2,3) || checkWinVariants(4,5,6) || checkWinVariants(7,8,9) || checkWinVariants(1,5,9) || checkWinVariants(3,5,7); } /** * Methode: checkWinVariants * * Diese Methode prüft ob 3 Werte denselben entsprechen und grösser als 0 sind. * Methode wird von checkForWin Methode verwendet. * * @param field1 erstes zu prüfende Feld * @param field2 zweites zu prüfende Feld * @param field3 drittes zu prüfende Feld * @return bei erkannten gleichen Zahlen grösser als 0 true sonst false */ private boolean checkWinVariants(int field1, int field2, int field3) { return ((gamefield.getField(field1) == gamefield.getField(field2)) && (gamefield.getField(field3) == gamefield.getField(field1)) && (gamefield.getField(field1) == playerPlaying)); } /** * Methode: chechForTie * * Diese Methode prüft ob bereits alle Felder von den Spielern belegt wurden. * @return falls Unentschieden true sonst false */ private boolean checkForTie() { return gamefield.countSetFields() == 9; } }