diff options
Diffstat (limited to 'src/com')
3 files changed, 165 insertions, 0 deletions
diff --git a/src/com/mavlushechka/tictactoe/TicTacToe.java b/src/com/mavlushechka/tictactoe/TicTacToe.java new file mode 100644 index 0000000..a627585 --- /dev/null +++ b/src/com/mavlushechka/tictactoe/TicTacToe.java @@ -0,0 +1,151 @@ +package com.mavlushechka.tictactoe; + +import com.mavlushechka.tictactoe.exceptions.IncorrectCoordinatesDiapasonException; +import com.mavlushechka.tictactoe.exceptions.OccupiedCellException; + +import java.util.Scanner; + +public final class TicTacToe { + + private static final char FIRST_PLAYER = 'X'; + + private static final char SECOND_PLAYER = 'O'; + + private final char[][] cells = {{' ', ' ', ' '}, {' ', ' ', ' '}, {' ', ' ', ' '}}; + + private char currentPlayer = FIRST_PLAYER; + + private boolean gameFinished = false; + + private Character winner; + + public void startGame() { + greet(); + showCells(); + enterCell(); + } + + private void greet() { + System.out.printf(""" + Tic-tac-toe is a paper-and-pencil game for two players + who take turns marking the spaces in a three-by-three grid with %c or %c. + The player who succeeds in placing three of their marks in a + horizontal, vertical, or diagonal row is the winner. + When all 9 squares are full, the game is over. + First player is %c. Players must enter the y and x coordinates separated by a space. + + """, FIRST_PLAYER, SECOND_PLAYER, FIRST_PLAYER); + } + + private void showCells() { + System.out.println("---------"); + for (char[] oneLineCells : cells) { + System.out.print("| "); + for (char cell : oneLineCells) { + System.out.printf("%c ", cell); + } + System.out.print("|\n"); + } + System.out.println("---------"); + } + + private void enterCell() { + byte y; + byte x; + String temporaryCoordinates; + + System.out.printf("Player %c enter the coordinates: ", currentPlayer); + temporaryCoordinates = new Scanner(System.in).nextLine(); + try { + y = Byte.parseByte(temporaryCoordinates.split(" ")[0]); + x = Byte.parseByte(temporaryCoordinates.split(" ")[1]); + + if (!((y >= 1 && y <= 3) && (x >= 1 && x <= 3))) { + throw new IncorrectCoordinatesDiapasonException("Incorrect coordinates"); + } else if (cells[y-1][x-1] != ' ') { + throw new OccupiedCellException("Cell is occupied"); + } else { + move(--y, --x); + } + } catch (NumberFormatException numberFormatException) { + System.out.println("You should enter numbers!"); + enterCell(); + } catch (IncorrectCoordinatesDiapasonException incorrectCoordinatesDiapasonException) { + System.out.println("Coordinates should be from 1 to 3!"); + enterCell(); + } catch (OccupiedCellException occupiedCellException) { + System.out.println("This cell is occupied! Choose another one!"); + enterCell(); + } + } + + private void move(byte y, byte x) { + cells[y][x] = currentPlayer; + currentPlayer = (currentPlayer == FIRST_PLAYER) ? SECOND_PLAYER : FIRST_PLAYER; + + showCells(); + checkLines(); + if (!gameFinished) { + enterCell(); + } else { + System.out.print(getResult()); + } + } + + private void checkLines() { + checkDiagonalLines(); + if (gameFinished) { + return; + } + checkVerticalAndHorizontalLines(); + if (gameFinished) { + return; + } + checkIfCellsAreFull(); + } + + private void checkDiagonalLines() { + for (byte i = 0, j = 2; i < 3; i += 2, j -= 2) { + if (cells[i][0] != ' ' && (cells[i][0] == cells[1][1] && cells[1][1] == cells[j][2])) { + gameFinished = true; + winner = cells[i][0]; + break; + } + } + } + + private void checkVerticalAndHorizontalLines() { + for (byte i = 0; i < 3; i++) { + if (cells[i][0] != ' ' && ((cells[i][0] == cells[i][1] && cells[i][1] == cells[i][2]) || + cells[0][i] != ' ' && (cells[0][i] == cells[1][i] && cells[1][i] == cells[2][i]))) { + gameFinished = true; + winner = ((cells[i][0] == cells[i][1] && cells[i][1] == cells[i][2])) ? cells[i][0] : cells[0][i]; + } + } + } + + private void checkIfCellsAreFull() { + for (byte i = 0, fullCells = 9; i < 3; i++) { + for (byte j = 0; j < 3; j++) { + if (cells[i][j] != ' ') { + fullCells--; + } + } + if (fullCells == 0) { + gameFinished = true; + } + } + } + + private String getResult() { + return winner == null ? "Draw" : "Congratulations, " + winner + " is a winner!"; + } +} + +final class Main { + + public static void main(String[] args) { + TicTacToe ticTacToe = new TicTacToe(); + ticTacToe.startGame(); + } +}
\ No newline at end of file diff --git a/src/com/mavlushechka/tictactoe/exceptions/IncorrectCoordinatesDiapasonException.java b/src/com/mavlushechka/tictactoe/exceptions/IncorrectCoordinatesDiapasonException.java new file mode 100644 index 0000000..63b1da1 --- /dev/null +++ b/src/com/mavlushechka/tictactoe/exceptions/IncorrectCoordinatesDiapasonException.java @@ -0,0 +1,7 @@ +package com.mavlushechka.tictactoe.exceptions; + +public class IncorrectCoordinatesDiapasonException extends Exception { + public IncorrectCoordinatesDiapasonException(String errorMessage) { + super(errorMessage); + } +}
\ No newline at end of file diff --git a/src/com/mavlushechka/tictactoe/exceptions/OccupiedCellException.java b/src/com/mavlushechka/tictactoe/exceptions/OccupiedCellException.java new file mode 100644 index 0000000..4da451f --- /dev/null +++ b/src/com/mavlushechka/tictactoe/exceptions/OccupiedCellException.java @@ -0,0 +1,7 @@ +package com.mavlushechka.tictactoe.exceptions; + +public class OccupiedCellException extends Exception { + public OccupiedCellException(String errorMessage) { + super(errorMessage); + } +} |