add winner function to board.

This commit is contained in:
2026-02-05 18:33:24 -05:00
parent 2f20f32a5f
commit f623a8ac29
4 changed files with 119 additions and 24 deletions
+2 -1
View File
@@ -11,12 +11,13 @@ public final class App {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
EventQueue.invokeLater(() -> { EventQueue.invokeLater(() -> {
// Create the Frame // Create the Frame
Frame frame = new Frame("TicTacToe"); BoardFrame frame = new BoardFrame("TicTacToe");
App.Initialize(frame); App.Initialize(frame);
}); });
} }
final static void Initialize(Frame frame) { final static void Initialize(Frame frame) {
frame.setTitle("TicTacToe");
// Set the layout manager to GridLayout (3 rows, 3 columns) // Set the layout manager to GridLayout (3 rows, 3 columns)
frame.setLayout(new GridLayout(3, 3)); frame.setLayout(new GridLayout(3, 3));
frame.setEnabled(false); frame.setEnabled(false);
+93 -8
View File
@@ -1,19 +1,33 @@
package edu.tictactoe; package edu.tictactoe;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.Timer; import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import javax.swing.Icon;
import javax.swing.ImageIcon; import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import java.awt.Component;
import java.awt.EventQueue;
import java.awt.Frame; import java.awt.Frame;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
public final class Board { public final class Board {
final int User = 1; final static int PlayerUser = 1;
final int System = 0; final static int PlayerSystem = 0;
private static final BufferedImage xImage = ResourceImageLoader.loadImageFromResource("/x.png");
private static final BufferedImage naughtImage = ResourceImageLoader.loadImageFromResource("/naught.png");
final Timer timer = new Timer(); final Timer timer = new Timer();
final BoardButton[] buttons = new BoardButton[9]; final BoardButton[] buttons = new BoardButton[9];
Integer player = Board.PlayerUser;
Frame frame = null; Frame frame = null;
public Board(Frame frame) { public Board(Frame frame) {
@@ -34,29 +48,100 @@ public final class Board {
for (BoardButton button : buttons) { for (BoardButton button : buttons) {
frame.add(button); frame.add(button);
} }
this.setPlayer(Board.PlayerUser);
} }
public BoardButton[] getButtons() { public BoardButton[] getButtons() {
return buttons; return buttons;
} }
public static int getRandomPlay() { public int getRandomPlay() {
Random random = new Random(); Random random = new Random();
// Generate a random integer from 0 to 8. // Generate a random integer from 0 to 8.
return random.nextInt(9); int position = random.nextInt(9);
// Generate another guess if position played.
while (getButtons()[position].played) {
position = random.nextInt(9);
}
;
return position;
} }
protected void setEnabledUIContainer(boolean enabled) { protected void setEnabledUIContainer(boolean enabled) {
this.frame.setEnabled(enabled); this.frame.setEnabled(enabled);
} }
void PlayEventUpdate() { protected void setPlayerTurnOnBoard() {
long delay = 1800; // Set turn on board
if (player == Board.PlayerUser) {
player = Board.PlayerSystem;
} else if (player == Board.PlayerSystem) {
player = Board.PlayerUser;
}
}
protected boolean winnerCheck() {
HashSet<BoardButton> checks = new HashSet<BoardButton>(9);
if ((buttons[0].played && buttons[4].played && buttons[8].played)
&&
buttons[0].player == buttons[4].player
&& buttons[4].player == buttons[8].player) {
return true;
}
if ((buttons[2].played && buttons[4].played && buttons[6].played)
&&
buttons[2].player == buttons[4].player
&& buttons[4].player == buttons[6].player) {
return true;
}
return false;
}
synchronized protected void PlayEventUpdate() {
long delay = 0L;
if (winnerCheck()) {
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;
}
setPlayerTurnOnBoard();
if (this.player == Board.PlayerSystem) {
delay = 1400L;
frame.setEnabled(false); frame.setEnabled(false);
timer.schedule(new SystemPlayTask(this), delay); timer.schedule(new SystemPlayTask(this), delay);
} }
} }
public int getPlayer() {
return this.player;
}
public void setPlayer(int player) {
this.player = player;
}
public Icon setPlayerMark() {
return new ImageIcon(player == Board.PlayerUser ? xImage : naughtImage);
}
}
class SystemPlayTask extends TimerTask { class SystemPlayTask extends TimerTask {
final Board board; final Board board;
@@ -67,8 +152,8 @@ class SystemPlayTask extends TimerTask {
@Override @Override
public void run() { public void run() {
System.out.println("Task executed at: " + new java.util.Date()); int iplay = board.getRandomPlay();
int iplay = Board.getRandomPlay(); System.out.println("Task execute mark " + iplay + " at: " + new java.util.Date());
board.getButtons()[iplay].doClick(); board.getButtons()[iplay].doClick();
board.setEnabledUIContainer(true); board.setEnabledUIContainer(true);
} }
@@ -10,12 +10,11 @@ import javax.swing.JButton;
public class BoardButton extends JButton implements ActionListener { public class BoardButton extends JButton implements ActionListener {
// Board // Board
private static final BufferedImage xImage = ResourceImageLoader.loadImageFromResource("/x.png");
private static final BufferedImage naughtImage = ResourceImageLoader.loadImageFromResource("/naught.png");
private static final BufferedImage blankImage = ResourceImageLoader.loadImageFromResource("/blank.png"); private static final BufferedImage blankImage = ResourceImageLoader.loadImageFromResource("/blank.png");
final Board board; final Board board;
Boolean played = false; Boolean played = false;
Integer player = -1;
public BoardButton(String label, ImageIcon imageIcon, Board board) { public BoardButton(String label, ImageIcon imageIcon, Board board) {
super(label, imageIcon); super(label, imageIcon);
@@ -24,14 +23,6 @@ public class BoardButton extends JButton implements ActionListener {
this.addActionListener(this); this.addActionListener(this);
} }
public static final BufferedImage getXImage() {
return xImage;
}
public static final BufferedImage getNaughtImage() {
return naughtImage;
}
public static final BufferedImage getBlankImage() { public static final BufferedImage getBlankImage() {
return blankImage; return blankImage;
} }
@@ -40,8 +31,9 @@ public class BoardButton extends JButton implements ActionListener {
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if(this.played) return; if(this.played) return;
this.setIcon(new ImageIcon(xImage)); this.setIcon(board.setPlayerMark());
this.played = true; this.played = true;
this.player = board.player;
board.PlayEventUpdate(); board.PlayEventUpdate();
} }
@@ -0,0 +1,17 @@
package edu.tictactoe;
import java.awt.Frame;
public class BoardFrame extends Frame {
public BoardFrame(String title) {
super(title);
}
// Method to fire game over event
public void fireGameOverWindowEvent(String message) {
this.removeAll();
App.Initialize(this);
}
}