add aspectj

This commit is contained in:
2026-02-06 13:14:36 -05:00
parent 20c38a9468
commit cff9ca6463
12 changed files with 40 additions and 67 deletions
+39
View File
@@ -0,0 +1,39 @@
/*
*/
plugins {
// Apply the java plugin.
id 'java'
}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(25)
}
}
group = 'edu.tictactoe'
version = '1.0'
repositories {
// Use Maven Central for resolving dependencies.
mavenCentral()
}
dependencies {
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' )
}
}
@@ -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