From 9cf1bac94363963978e342253473c9ad7c83ca25 Mon Sep 17 00:00:00 2001 From: ramollia <> Date: Thu, 11 Sep 2025 14:40:41 +0200 Subject: [PATCH] add: base game & ttt rules --- src/main/java/org/toop/game/GameBase.java | 40 ++++++++++++ src/main/java/org/toop/game/Player.java | 19 ++++++ src/main/java/org/toop/game/State.java | 9 +++ src/main/java/org/toop/game/TTT.java | 77 +++++++++++++++++++++++ 4 files changed, 145 insertions(+) create mode 100644 src/main/java/org/toop/game/GameBase.java create mode 100644 src/main/java/org/toop/game/Player.java create mode 100644 src/main/java/org/toop/game/State.java create mode 100644 src/main/java/org/toop/game/TTT.java diff --git a/src/main/java/org/toop/game/GameBase.java b/src/main/java/org/toop/game/GameBase.java new file mode 100644 index 0000000..6e313a7 --- /dev/null +++ b/src/main/java/org/toop/game/GameBase.java @@ -0,0 +1,40 @@ +package org.toop.game; + +public abstract class GameBase { + protected Player[] players; + protected int currentPlayer; + + protected int size; + protected char[] grid; + + public GameBase(Player[] players, int size) { + this.players = players; + currentPlayer = 0; + + this.size = size; + grid = new char[size * size]; + + for (int i = 0; i < grid.length; i++) { + grid[i] = ' '; + } + } + + public Player[] Players() { + return players; + } + + public Player CurrentPlayer() { + return players[currentPlayer]; + } + + public int Size() { + return size; + } + + public char[] Grid() { + return grid; + } + + public abstract boolean ValidateMove(int index); + public abstract State PlayMove(int index); +} diff --git a/src/main/java/org/toop/game/Player.java b/src/main/java/org/toop/game/Player.java new file mode 100644 index 0000000..4d54d92 --- /dev/null +++ b/src/main/java/org/toop/game/Player.java @@ -0,0 +1,19 @@ +package org.toop.game; + +public class Player { + private String name; + private char move; + + public Player(String name, char move) { + this.name = name; + this.move = move; + } + + public String Name() { + return name; + } + + public char Move() { + return move; + } +} diff --git a/src/main/java/org/toop/game/State.java b/src/main/java/org/toop/game/State.java new file mode 100644 index 0000000..0fe5771 --- /dev/null +++ b/src/main/java/org/toop/game/State.java @@ -0,0 +1,9 @@ +package org.toop.game; + +public enum State { + INVALID, + + NORMAL, + DRAW, + WIN, +} diff --git a/src/main/java/org/toop/game/TTT.java b/src/main/java/org/toop/game/TTT.java new file mode 100644 index 0000000..e5b7619 --- /dev/null +++ b/src/main/java/org/toop/game/TTT.java @@ -0,0 +1,77 @@ +package org.toop.game; + +public class TTT extends GameBase { + private int moveCount; + + public TTT(String player1, String player2) { + Player[] players = new Player[2]; + players[0] = new Player(player1, 'X'); + players[1] = new Player(player2, 'O'); + + super(players, 9); + + moveCount = 0; + } + + @Override + public boolean ValidateMove(int index) { + if (index < 0 || index > (size * size - 1)) { + return false; + } + + return (grid[index] == ' ') ? true : false; + } + + @Override + public State PlayMove(int index) { + if (!ValidateMove(index)) { + return State.INVALID; + } + + grid[index] = players[currentPlayer].Move(); + moveCount += 1; + + if (CheckWin()) { + return State.WIN; + } + + if (moveCount >= grid.length) { + return State.DRAW; + } + + currentPlayer = (currentPlayer + 1) % players.length; + return State.NORMAL; + } + + private boolean CheckWin() { + // Horizontal + for (int i = 0; i < 3; i++) { + int index = i * 3; + + if (grid[index] == grid[index + 1] && grid[index] == grid[index + 2]) { + return true; + } + } + + // Vertical + for (int i = 0; i < 3; i++) { + int index = i; + + if (grid[index] == grid[index + 3] && grid[index] == grid[index + 6]) { + return true; + } + } + + // F-Slash + if (grid[2] == grid[4] && grid[2] == grid[6]) { + return true; + } + + // B-Slash + if (grid[0] == grid[4] && grid[0] == grid[8]) { + return true; + } + + return false; + } +}