From f639632af689cfd27dbddc1e32a11d04d783b2e2 Mon Sep 17 00:00:00 2001 From: Sufyan Date: Wed, 26 Feb 2025 22:19:36 +0530 Subject: [PATCH] SUF-16 Good Engineer2: Fork Functionality cleanup --- api/AIEngine.java | 1 + api/RuleEngine.java | 48 +++++++++++++--------------- boards/TicTacToeBoard.java | 14 ++++++++ stateManager/CenterPlacement.java | 2 +- stateManager/CornerPlacement.java | 2 +- stateManager/DefensivePlacement.java | 2 +- stateManager/ForkPlacement.java | 3 +- stateManager/OffensivePlacement.java | 2 +- 8 files changed, 43 insertions(+), 31 deletions(-) diff --git a/api/AIEngine.java b/api/AIEngine.java index 61c7e5d..24407be 100644 --- a/api/AIEngine.java +++ b/api/AIEngine.java @@ -3,6 +3,7 @@ import boards.TicTacToeBoard; import game.*; import stateManager.DefensivePlacement; +import stateManager.OffensivePlacement; import stateManager.Placement; import java.util.Optional; diff --git a/api/RuleEngine.java b/api/RuleEngine.java index 5a095ae..c526680 100644 --- a/api/RuleEngine.java +++ b/api/RuleEngine.java @@ -2,6 +2,8 @@ import boards.TicTacToeBoard; import game.*; +import stateManager.DefensivePlacement; +import stateManager.OffensivePlacement; import java.util.HashMap; import java.util.Map; @@ -28,37 +30,31 @@ public GameState getState(Board board){ } } - public GameInfo getInfo(Board board) { - if (board instanceof TicTacToeBoard) { - TicTacToeBoard ticTacToeBoard = (TicTacToeBoard) board; + public GameInfo getInfo(CellBoard board) { + if (board instanceof TicTacToeBoard ticTacToeBoard) { GameState gameState = getState(ticTacToeBoard); - final String [] players = new String[] {"X","O"}; - Cell forkCell = null; - for (int index =0; index <2 ;index++) { + for(TicTacToeBoard.Symbol symbol : TicTacToeBoard.Symbol.values() ){ + Player player = new Player(symbol.getSymbol()); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { - Player player = new Player(players [index]); - TicTacToeBoard b = ((TicTacToeBoard) board).dummyMove(new Move(player,new Cell(i,j))); - boolean canStillWin = false; - for (int k = 0; k < 3; k++) { - for (int l = 0; l < 3; l++) { - forkCell= new Cell(k,l); - Board b1 = b.dummyMove(new Move(player.flip(),new Cell(k,l))); - if(getState(b1).getWinner().equals(player.flip().symbol())){ - canStillWin = true; - break; - } + if(ticTacToeBoard.getSymbol(i,j)!=null) continue; + TicTacToeBoard ticTacToeBoard1 = ticTacToeBoard.dummyMove(new Move(player,new Cell(i,j))); + DefensivePlacement defensivePlacement = DefensivePlacement.get(); + Optional defensiveMove = defensivePlacement.place(ticTacToeBoard1,player.flip()); + if(defensiveMove.isPresent()){ + ticTacToeBoard1 = ticTacToeBoard1.dummyMove(new Move(player.flip(),defensiveMove.get())); + OffensivePlacement offensivePlacement = OffensivePlacement.get(); + Optional offensiveMove = offensivePlacement.place(ticTacToeBoard1,player); + if(offensiveMove.isPresent()){ + return new GameInfoBuilder() + .isOver(gameState.isOver()) + .winner(gameState.getWinner()) + .hasFork(true) + .player(player) + .forkCell(new Cell(i,j)) + .build(); } } - if(canStillWin) { - return new GameInfoBuilder() - .isOver(gameState.isOver()) - .winner(gameState.getWinner()) - .hasFork(true) - .player(player.flip()) - .forkCell(forkCell) - .build(); - } } } } diff --git a/boards/TicTacToeBoard.java b/boards/TicTacToeBoard.java index 0e5f7bb..db06f56 100644 --- a/boards/TicTacToeBoard.java +++ b/boards/TicTacToeBoard.java @@ -15,6 +15,20 @@ public class TicTacToeBoard implements CellBoard, Cloneable { public TicTacToeBoard() { } + public enum Symbol{ + X("X"),O("O"); + + final String symbol; + + Symbol (String o){ + this.symbol = o; + } + + public String getSymbol() { + return symbol; + } + } + private TicTacToeBoard(TicTacToeBoard board) { for (int i = 0; i < 3; i++) { this.cells[i] = Arrays.copyOf(board.cells[i], 3); // Deep copy of each row diff --git a/stateManager/CenterPlacement.java b/stateManager/CenterPlacement.java index e5020a4..c7ef871 100644 --- a/stateManager/CenterPlacement.java +++ b/stateManager/CenterPlacement.java @@ -12,7 +12,7 @@ public class CenterPlacement implements Placement{ private static CenterPlacement centerPlacement; - public synchronized static Placement get(){ + public synchronized static CenterPlacement get(){ if(centerPlacement!= null) return centerPlacement; return new CenterPlacement(); } diff --git a/stateManager/CornerPlacement.java b/stateManager/CornerPlacement.java index cfa83e5..687dc77 100644 --- a/stateManager/CornerPlacement.java +++ b/stateManager/CornerPlacement.java @@ -12,7 +12,7 @@ public class CornerPlacement implements Placement{ private static CornerPlacement cornerPlacement; - public synchronized static Placement get(){ + public synchronized static CornerPlacement get(){ if(cornerPlacement!= null) return cornerPlacement; return new CornerPlacement(); } diff --git a/stateManager/DefensivePlacement.java b/stateManager/DefensivePlacement.java index c1f45e2..aa1bf12 100644 --- a/stateManager/DefensivePlacement.java +++ b/stateManager/DefensivePlacement.java @@ -12,7 +12,7 @@ public class DefensivePlacement implements Placement{ private static DefensivePlacement defensivePlacement; - public synchronized static Placement get(){ + public synchronized static DefensivePlacement get(){ if(defensivePlacement!= null) return defensivePlacement; return new DefensivePlacement(); } diff --git a/stateManager/ForkPlacement.java b/stateManager/ForkPlacement.java index 598472c..eb428ca 100644 --- a/stateManager/ForkPlacement.java +++ b/stateManager/ForkPlacement.java @@ -9,7 +9,7 @@ public class ForkPlacement implements Placement{ private static ForkPlacement forkPlacement; - public synchronized static Placement get(){ + public synchronized static ForkPlacement get(){ if(forkPlacement!= null) return forkPlacement; return new ForkPlacement(); } @@ -29,6 +29,7 @@ private Cell fork(Player player, TicTacToeBoard board) { GameInfo gameInfo = ruleEngine.getInfo(board); Cell forkCell = null; if(gameInfo.hasAFork()){ + System.out.println("GAME HAS A FORK AT -> "+ gameInfo.getForkCell().getRow() + ","+gameInfo.getForkCell().getCol()+" \n"); forkCell = gameInfo.getForkCell(); return forkCell; } diff --git a/stateManager/OffensivePlacement.java b/stateManager/OffensivePlacement.java index dc82d61..dd1ff88 100644 --- a/stateManager/OffensivePlacement.java +++ b/stateManager/OffensivePlacement.java @@ -11,7 +11,7 @@ public class OffensivePlacement implements Placement{ private static OffensivePlacement offensivePlacement; - public synchronized static Placement get(){ + public synchronized static OffensivePlacement get(){ if(offensivePlacement!= null) return offensivePlacement; return new OffensivePlacement(); }