add winner function to board.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user