add aspectj
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
package edu.tictactoe;
|
||||
|
||||
import java.awt.*;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
|
||||
public final class App {
|
||||
// main function
|
||||
public static void main(String[] args) throws Exception {
|
||||
EventQueue.invokeLater(() -> {
|
||||
// Create the Frame
|
||||
BoardFrame frame = new BoardFrame("TicTacToe");
|
||||
App.Initialize(frame);
|
||||
});
|
||||
}
|
||||
|
||||
final static void Initialize(Frame frame) {
|
||||
frame.setTitle("TicTacToe");
|
||||
// Set the layout manager to GridLayout (3 rows, 3 columns)
|
||||
frame.setLayout(new GridLayout(3, 3));
|
||||
frame.setEnabled(false);
|
||||
|
||||
Board board = new Board(frame);
|
||||
// board Set butttons in grid
|
||||
board.setup();
|
||||
|
||||
// Set Menubar for new game
|
||||
MenuBar menuBar = new MenuBar();
|
||||
Menu gameMenu = new Menu("Game");
|
||||
gameMenu.setFont(frame.getFont());
|
||||
MenuItem newGame = new MenuItem("New Game");
|
||||
gameMenu.add(newGame);
|
||||
menuBar.add(gameMenu);
|
||||
frame.setMenuBar(menuBar);
|
||||
|
||||
// Set frame properties
|
||||
frame.setSize(480, 480); // Set an initial size
|
||||
frame.pack();
|
||||
frame.setResizable(false);
|
||||
frame.setLocationRelativeTo(null); // Center
|
||||
frame.setEnabled(true);
|
||||
frame.setVisible(true); // Make the frame visible
|
||||
|
||||
// Add a window listener to handle the close button
|
||||
frame.addWindowListener(new WindowAdapter() {
|
||||
@Override
|
||||
public void windowClosing(WindowEvent e) {
|
||||
System.exit(0);
|
||||
}
|
||||
});
|
||||
|
||||
newGame.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
frame.removeAll();
|
||||
App.Initialize(frame);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,201 @@
|
||||
package edu.tictactoe;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import javax.swing.Icon;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import java.awt.EventQueue;
|
||||
import java.awt.Frame;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
public final class Board {
|
||||
final static int PlayerUser = 1;
|
||||
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 BoardButton[] buttons = new BoardButton[9];
|
||||
|
||||
Integer player = Board.PlayerUser;
|
||||
Frame frame = null;
|
||||
|
||||
public Board(Frame frame) {
|
||||
this.frame = frame;
|
||||
}
|
||||
|
||||
public void setup() { // user inputs on tictactoe board
|
||||
BufferedImage blankImage = BoardButton.getBlankImage();
|
||||
buttons[0] = new BoardButton("0", new ImageIcon(blankImage), this);
|
||||
buttons[1] = new BoardButton("1", new ImageIcon(blankImage), this);
|
||||
buttons[2] = new BoardButton("2", new ImageIcon(blankImage), this);
|
||||
buttons[3] = new BoardButton("3", new ImageIcon(blankImage), this);
|
||||
buttons[4] = new BoardButton("4", new ImageIcon(blankImage), this);
|
||||
buttons[5] = new BoardButton("5", new ImageIcon(blankImage), this);
|
||||
buttons[6] = new BoardButton("6", new ImageIcon(blankImage), this);
|
||||
buttons[7] = new BoardButton("7", new ImageIcon(blankImage), this);
|
||||
buttons[8] = new BoardButton("8", new ImageIcon(blankImage), this);
|
||||
for (BoardButton button : buttons) {
|
||||
frame.add(button);
|
||||
}
|
||||
|
||||
this.setPlayer(Board.PlayerUser);
|
||||
}
|
||||
|
||||
public BoardButton[] getButtons() {
|
||||
return buttons;
|
||||
}
|
||||
|
||||
public int getRandomPlay() {
|
||||
Random random = new Random();
|
||||
// Generate a random integer from 0 to 8.
|
||||
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) {
|
||||
this.frame.setEnabled(enabled);
|
||||
}
|
||||
|
||||
protected void setPlayerTurnOnBoard() {
|
||||
// Set turn on board
|
||||
if (player == Board.PlayerUser) {
|
||||
player = Board.PlayerSystem;
|
||||
} else if (player == Board.PlayerSystem) {
|
||||
player = Board.PlayerUser;
|
||||
}
|
||||
}
|
||||
|
||||
protected boolean 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;
|
||||
|
||||
}
|
||||
|
||||
if ((buttons[2].played && buttons[4].played && buttons[6].played)
|
||||
&&
|
||||
buttons[2].player == buttons[4].player
|
||||
&& buttons[4].player == buttons[6].player) {
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
if ((buttons[0].played && buttons[1].played && buttons[2].played)
|
||||
&&
|
||||
buttons[0].player == buttons[1].player
|
||||
&& buttons[1].player == buttons[2].player) {
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
if ((buttons[3].played && buttons[4].played && buttons[5].played)
|
||||
&&
|
||||
buttons[3].player == buttons[4].player
|
||||
&& buttons[4].player == buttons[5].player) {
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((buttons[6].played && buttons[7].played && buttons[8].played)
|
||||
&&
|
||||
buttons[6].player == buttons[7].player
|
||||
&& buttons[7].player == buttons[8].player) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if ((buttons[0].played && buttons[3].played && buttons[6].played)
|
||||
&&
|
||||
buttons[0].player == buttons[3].player
|
||||
&& buttons[3].player == buttons[6].player) {
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
if ((buttons[1].played && buttons[4].played && buttons[7].played)
|
||||
&&
|
||||
buttons[1].player == buttons[4].player
|
||||
&& buttons[4].player == buttons[7].player) {
|
||||
return true;
|
||||
}
|
||||
|
||||
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 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);
|
||||
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 {
|
||||
final Board board;
|
||||
|
||||
SystemPlayTask(Board board) {
|
||||
super();
|
||||
this.board = board;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
int iplay = board.getRandomPlay();
|
||||
System.out.println("Task execute mark " + iplay + " at: " + new java.util.Date());
|
||||
board.getButtons()[iplay].doClick();
|
||||
board.setEnabledUIContainer(true);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package edu.tictactoe;
|
||||
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JButton;
|
||||
|
||||
public class BoardButton extends JButton implements ActionListener {
|
||||
|
||||
// Board
|
||||
private static final BufferedImage blankImage = ResourceImageLoader.loadImageFromResource("/blank.png");
|
||||
|
||||
final Board board;
|
||||
Boolean played = false;
|
||||
Integer player = -1;
|
||||
|
||||
public BoardButton(String label, ImageIcon imageIcon, Board board) {
|
||||
super(label, imageIcon);
|
||||
this.board = board;
|
||||
this.setMargin(new java.awt.Insets(0, 0, 0, 0));
|
||||
this.addActionListener(this);
|
||||
}
|
||||
|
||||
public static final BufferedImage getBlankImage() {
|
||||
return blankImage;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if(this.played) return;
|
||||
|
||||
this.setIcon(board.setPlayerMark());
|
||||
this.played = true;
|
||||
this.player = board.player;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package edu.tictactoe;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
public final class ResourceImageLoader {
|
||||
public static BufferedImage loadImageFromResource(String resourcePath) {
|
||||
try (InputStream is = ResourceImageLoader.class.getResourceAsStream(resourcePath)) {
|
||||
if (is == null) {
|
||||
System.err.println(
|
||||
"Resource not found: at " + ResourceImageLoader.class.getResource("/") + " - " + resourcePath);
|
||||
return null;
|
||||
}
|
||||
return ImageIO.read(is);
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.3 KiB |
Reference in New Issue
Block a user