summaryrefslogtreecommitdiff
path: root/src/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/com')
-rw-r--r--src/com/mavlushechka/tictactoe/TicTacToe.java151
-rw-r--r--src/com/mavlushechka/tictactoe/exceptions/IncorrectCoordinatesDiapasonException.java7
-rw-r--r--src/com/mavlushechka/tictactoe/exceptions/OccupiedCellException.java7
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);
+ }
+}