diff --git a/edu.tictactoe/build.gradle b/edu.tictactoe/build.gradle index 537754d..563ef57 100644 --- a/edu.tictactoe/build.gradle +++ b/edu.tictactoe/build.gradle @@ -21,19 +21,18 @@ repositories { } dependencies { + implementation("org.slf4j:slf4j-api:2.0.17") + implementation("ch.qos.logback:logback-classic:1.5.26") implementation("org.aspectj:aspectjrt:1.9.25") } -jar { - duplicatesStrategy = DuplicatesStrategy.EXCLUDE - from { configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } -} - tasks.named('jar') { manifest { - attributes('Implementation-Title': 'edu.tictactoe', - 'Implementation-Version': 1.0, - 'Main-Class': 'edu.tictactoe.App', - 'Class-Path': 'edu.tictactoe org.aspectj.runtime' ) + attributes( + 'Automatic-Module-Name':'edu.tictactoe', + 'Implementation-Title': 'edu.tictactoe', + 'Implementation-Version': 1.0, + 'Main-Class': 'edu.tictactoe.App', + 'Class-Path': 'edu.tictactoe org.aspectj.runtime' ) } } diff --git a/edu.tictactoe/src/main/java/edu/tictactoe/Board.java b/edu.tictactoe/src/main/java/edu/tictactoe/Board.java index ffab20f..46f6ed5 100644 --- a/edu.tictactoe/src/main/java/edu/tictactoe/Board.java +++ b/edu.tictactoe/src/main/java/edu/tictactoe/Board.java @@ -8,6 +8,10 @@ import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JOptionPane; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.awt.Component; import java.awt.EventQueue; import java.awt.Frame; import java.awt.image.BufferedImage; @@ -26,6 +30,8 @@ public final class Board { Integer player = Board.PlayerUser; Frame frame = null; + Logger logger = LoggerFactory.getLogger(Board.class); + public Board(Frame frame) { this.frame = frame; } @@ -78,14 +84,14 @@ public final class Board { } } - protected boolean winnerCheck() { + protected ResultEnum winnerCheck() { if ((buttons[0].played && buttons[4].played && buttons[8].played) && buttons[0].player == buttons[4].player && buttons[4].player == buttons[8].player) { - return true; + return ResultEnum.winner; } @@ -94,7 +100,7 @@ public final class Board { buttons[2].player == buttons[4].player && buttons[4].player == buttons[6].player) { - return true; + return ResultEnum.winner; } @@ -102,7 +108,7 @@ public final class Board { && buttons[0].player == buttons[1].player && buttons[1].player == buttons[2].player) { - return true; + return ResultEnum.winner; } @@ -111,21 +117,21 @@ public final class Board { buttons[3].player == buttons[4].player && buttons[4].player == buttons[5].player) { - return true; + return ResultEnum.winner; } if ((buttons[6].played && buttons[7].played && buttons[8].played) && buttons[6].player == buttons[7].player && buttons[7].player == buttons[8].player) { - return true; + return ResultEnum.winner; } if ((buttons[0].played && buttons[3].played && buttons[6].played) && buttons[0].player == buttons[3].player && buttons[3].player == buttons[6].player) { - return true; + return ResultEnum.winner; } @@ -133,34 +139,64 @@ public final class Board { && buttons[1].player == buttons[4].player && buttons[4].player == buttons[7].player) { - return true; + return ResultEnum.winner; } if ((buttons[2].played && buttons[5].played && buttons[8].played) && buttons[2].player == buttons[5].player && buttons[5].player == buttons[8].player) { - return true; + return ResultEnum.winner; } - return false; + + int count = 0; + for (BoardButton boardButton : buttons) { + if (boardButton.played) { + count++; + } + } + + if (count == 9) { + return ResultEnum.draw; + } + + // else + return ResultEnum.playcontinues; } synchronized protected void PlayEventUpdate() { long delay = 0L; + ResultEnum checkplays = winnerCheck(); - if (winnerCheck()) { + if (ResultEnum.winner == checkplays) { frame.setEnabled(false); // show Winner Dialog String message = this.player == Board.PlayerUser ? String.format("You") : String.format("System"); frame.setTitle("TicTacToe - " + message + " won."); JOptionPane.showMessageDialog(frame, message + " won.", "Winner!", JOptionPane.WARNING_MESSAGE); + EventQueue.invokeLater(() -> { ((BoardFrame) frame).fireGameOverWindowEvent("Game over."); }); + return; } + if (ResultEnum.draw == checkplays) { + // show Draw Dialog + frame.setTitle("TicTacToe - We have a Draw!"); + //Disable buttons + for (Component component : frame.getComponents()) { + if (component instanceof BoardButton) { + component.setEnabled(false); + } + } + + return; + } + + //play continues setPlayerTurnOnBoard(); if (this.player == Board.PlayerSystem) { @@ -193,8 +229,12 @@ class SystemPlayTask extends TimerTask { @Override public void run() { + Logger logger = LoggerFactory.getLogger(SystemPlayTask.class); + int iplay = board.getRandomPlay(); - System.out.println("Task execute mark " + iplay + " at: " + new java.util.Date()); + + logger.info("Task execute mark " + iplay + " at: " + new java.util.Date()); + board.getButtons()[iplay].doClick(); board.setEnabledUIContainer(true); } diff --git a/edu.tictactoe/src/main/java/edu/tictactoe/ResultEnum.java b/edu.tictactoe/src/main/java/edu/tictactoe/ResultEnum.java new file mode 100644 index 0000000..0937381 --- /dev/null +++ b/edu.tictactoe/src/main/java/edu/tictactoe/ResultEnum.java @@ -0,0 +1,5 @@ +package edu.tictactoe; + +public enum ResultEnum { + draw, winner, playcontinues; +} diff --git a/edu.tictactoe/src/main/java/edu/tictactoe/Validator.java b/edu.tictactoe/src/main/java/edu/tictactoe/Validator.java new file mode 100644 index 0000000..a2b2809 --- /dev/null +++ b/edu.tictactoe/src/main/java/edu/tictactoe/Validator.java @@ -0,0 +1,8 @@ +package edu.tictactoe; + +import org.aspectj.lang.annotation.Aspect; + +@Aspect +public class Validator { + +}