Initial commit
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
Desktop.ini
|
31
src/jtictactoe/Figure.java
Normal file
@ -0,0 +1,31 @@
|
||||
package jtictactoe;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Figure {
|
||||
|
||||
public static final char
|
||||
EMPTY = ' ',
|
||||
X = 'X',
|
||||
O = 'O';
|
||||
|
||||
protected char figure;
|
||||
|
||||
public Figure() {
|
||||
this.figure = EMPTY;
|
||||
}
|
||||
|
||||
public boolean isEmpty() {
|
||||
return (figure == EMPTY);
|
||||
}
|
||||
|
||||
public char getFigure() {
|
||||
return figure;
|
||||
}
|
||||
|
||||
public void setFigure(char figure) {
|
||||
this.figure = figure;
|
||||
}
|
||||
}
|
117
src/jtictactoe/GameBoard.java
Normal file
@ -0,0 +1,117 @@
|
||||
package jtictactoe;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Point;
|
||||
import java.awt.event.MouseAdapter;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class GameBoard extends JPanel {
|
||||
private static final int CELL_SIZE = 150;
|
||||
private static final int OFFSET = 15;
|
||||
|
||||
private BufferedImage strikedHor, strikedVer, strikedDiag, strikedDiagRev;
|
||||
private BufferedImage background, figureX, figureO;
|
||||
private Table table;
|
||||
private TitlePanel title;
|
||||
private int imgWidth, imgHeight;
|
||||
|
||||
public GameBoard(TitlePanel title) {
|
||||
this.title = title;
|
||||
initImages();
|
||||
imgWidth = background.getWidth();
|
||||
imgHeight = background.getHeight();
|
||||
setPreferredSize( new Dimension(imgWidth, imgHeight) );
|
||||
addMouseListener(new MouseAdapter() {
|
||||
@Override
|
||||
public void mousePressed(MouseEvent evt) {
|
||||
gameBoardMousePressed(evt);
|
||||
}
|
||||
});
|
||||
table = new Table();
|
||||
table.resetTable();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
g.drawImage(background, 0, 0, null);
|
||||
drawTable(g);
|
||||
drawStrike(g);
|
||||
}
|
||||
|
||||
private void drawTable(Graphics g) {
|
||||
Figure[][] figures = table.getFiguresArray();
|
||||
for (int i = 0; i < figures.length; i++) {
|
||||
for (int j = 0; j < figures[0].length; j++) {
|
||||
char figure = figures[i][j].getFigure();
|
||||
if (figure != Figure.EMPTY) {
|
||||
BufferedImage image = ( (figure == Figure.X) ? figureX : figureO );
|
||||
int x = j * CELL_SIZE + OFFSET + (CELL_SIZE - image.getWidth()) / 2;
|
||||
int y = i * CELL_SIZE + OFFSET + (CELL_SIZE - image.getHeight()) / 2;
|
||||
g.drawImage(image, x, y, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void drawStrike(Graphics g) {
|
||||
int strikeMode = table.getStrikedMode();
|
||||
if (strikeMode != Table.MODE_NOT_STRIKED) {
|
||||
final int strikedSize = strikedHor.getHeight();
|
||||
int coord = OFFSET + (CELL_SIZE - strikedSize) / 2;
|
||||
int strikePos = strikeMode & 0x03;
|
||||
|
||||
if ( (strikeMode & Table.MODE_STRIKE_DIAGONAL) != 0 ) {
|
||||
g.drawImage(strikedDiag, coord, coord, null);
|
||||
} else if ( (strikeMode & Table.MODE_STRIKE_DIAGONAL_REVERSE) != 0 ) {
|
||||
g.drawImage(strikedDiagRev, coord - OFFSET / 2, coord - OFFSET / 2, null);
|
||||
} else if ( (strikeMode & Table.MODE_STRIKE_HORIZONTAL) != 0 ) {
|
||||
g.drawImage(strikedHor, coord, coord + strikePos * CELL_SIZE, null);
|
||||
} else if ( (strikeMode & Table.MODE_STRIKE_VERTICAL) != 0 ) {
|
||||
g.drawImage(strikedVer, coord + strikePos * CELL_SIZE, coord, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void gameBoardMousePressed(MouseEvent evt) {
|
||||
Point id = convertToID( evt.getPoint() );
|
||||
//table.computerMove();
|
||||
table.setFigure(id.x, id.y);
|
||||
|
||||
if (table.getStrikedMode() == Table.MODE_NOT_STRIKED) title.setMessage("");
|
||||
|
||||
if (!table.hasMoreMoves()) {
|
||||
char winner = table.checkWinner();
|
||||
if (winner != Figure.EMPTY) {
|
||||
int winX = (winner == Figure.X) ? 1 : 0;
|
||||
title.updateWin(winX, 1 - winX);
|
||||
title.setMessage(winner + " is win");
|
||||
} else title.setMessage("Drow");
|
||||
}
|
||||
repaint();
|
||||
}
|
||||
|
||||
private void initImages() {
|
||||
background = Util.getImage("/res/table_bg.jpg");
|
||||
figureX = Util.getImage("/res/x.png");
|
||||
figureO = Util.getImage("/res/o.png");
|
||||
strikedHor = Util.getImage("/res/striked.png");
|
||||
strikedVer = Util.getImage("/res/striked_ver.png");
|
||||
strikedDiag = Util.getImage("/res/striked_diagonal.png");
|
||||
strikedDiagRev = Util.getImage("/res/striked_diagonal_rev.png");
|
||||
}
|
||||
|
||||
private Point convertToID(Point point) {
|
||||
point.x /= imgWidth / 3;
|
||||
point.y /= imgHeight / 3;
|
||||
|
||||
return point;
|
||||
}
|
||||
}
|
32
src/jtictactoe/Main.java
Normal file
@ -0,0 +1,32 @@
|
||||
package jtictactoe;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import javax.swing.JFrame;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Main extends JFrame {
|
||||
|
||||
public static void main(String[] args) {
|
||||
new Main().setVisible(true);
|
||||
|
||||
}
|
||||
|
||||
public Main() {
|
||||
super("JTicTacToe");
|
||||
setResizable(false);
|
||||
setUndecorated(true);
|
||||
setAlwaysOnTop(true);
|
||||
setBounds(300, 120, 0, 0);
|
||||
setDefaultCloseOperation(EXIT_ON_CLOSE);
|
||||
setLayout(new BorderLayout(0, 0));
|
||||
|
||||
TitlePanel title = new TitlePanel(this);
|
||||
add(title, BorderLayout.NORTH);
|
||||
add(new GameBoard(title));
|
||||
|
||||
pack();
|
||||
}
|
||||
}
|
201
src/jtictactoe/Table.java
Normal file
@ -0,0 +1,201 @@
|
||||
package jtictactoe;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Table {
|
||||
|
||||
public static final int
|
||||
MODE_NOT_STRIKED = 0,
|
||||
MODE_STRIKE_HORIZONTAL = 0x04,
|
||||
MODE_STRIKE_VERTICAL = 0x08,
|
||||
MODE_STRIKE_DIAGONAL = 0x10,
|
||||
MODE_STRIKE_DIAGONAL_REVERSE = 0x20;
|
||||
|
||||
private boolean nextMoveIsX;
|
||||
private Figure[][] table;
|
||||
private Random random;
|
||||
private int strikedMode;
|
||||
|
||||
public Table() {
|
||||
table = new Figure[3][3];
|
||||
random = new Random();
|
||||
}
|
||||
|
||||
public void resetTable() {
|
||||
for (int i = 0; i < table.length; i++) {
|
||||
for (int j = 0; j < table[0].length; j++) {
|
||||
table[i][j] = new Figure();
|
||||
}
|
||||
}
|
||||
strikedMode = MODE_NOT_STRIKED;
|
||||
nextMoveIsX = true;
|
||||
}
|
||||
|
||||
public int getStrikedMode() {
|
||||
return strikedMode;
|
||||
}
|
||||
|
||||
public Figure[][] getFiguresArray() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public void setFigure(int x, int y) {
|
||||
if( (checkWinner() != Figure.EMPTY) || (!hasMoreMoves()) ) {
|
||||
resetTable();
|
||||
return;
|
||||
}
|
||||
|
||||
boolean xIsNorm = ( (0 <= x) && (x < 3) );
|
||||
boolean yIsNorm = ( (0 <= y) && (y < 3) );
|
||||
if (xIsNorm && yIsNorm && table[y][x].isEmpty()) {
|
||||
table[y][x].setFigure(nextMoveIsX ? Figure.X : Figure.O);
|
||||
nextMoveIsX = !nextMoveIsX;
|
||||
computerMove();
|
||||
}
|
||||
}
|
||||
|
||||
public void computerMove() {
|
||||
if( (checkWinner() != Figure.EMPTY) || (!hasMoreMoves()) ) {
|
||||
//resetTable();
|
||||
return;
|
||||
}
|
||||
|
||||
computerAI();
|
||||
nextMoveIsX = !nextMoveIsX;
|
||||
}
|
||||
|
||||
private void computerAI() {
|
||||
final Figure[][] array = new Figure[][] {
|
||||
// Horizontal check
|
||||
table[0],
|
||||
table[1],
|
||||
table[2],
|
||||
|
||||
// Vertical check
|
||||
{ table[0][0], table[1][0], table[2][0] },
|
||||
{ table[0][1], table[1][1], table[2][1] },
|
||||
{ table[0][2], table[1][2], table[2][2] },
|
||||
|
||||
// Diagonal check
|
||||
{ table[0][0], table[1][1], table[2][2] },
|
||||
{ table[0][2], table[1][1], table[2][0] }
|
||||
};
|
||||
char[] maybeWinnerArray = new char[array.length];
|
||||
// Calculate winning situations for computer (zeroes).
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
Figure[] figures = array[i];
|
||||
char maybeWinner = maybeWinnerComboIs(figures);
|
||||
maybeWinnerArray[i] = maybeWinner;
|
||||
if (maybeWinner == Figure.O) {
|
||||
if (setCompFigure(figures)) return;
|
||||
}
|
||||
}
|
||||
// Calculate winning situations for the player (crosses).
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
Figure[] figures = array[i];
|
||||
char maybeWinner = maybeWinnerArray[i];
|
||||
if (maybeWinner == Figure.X) {
|
||||
if (setCompFigure(figures)) return;
|
||||
}
|
||||
}
|
||||
|
||||
// Trying to put figure to the center.
|
||||
int x = 1, y = 1;
|
||||
if(!table[y][x].isEmpty() || (random.nextInt(5) <= 3) ) {
|
||||
// If it's busy, put to the corners.
|
||||
int count = 0;
|
||||
do {
|
||||
x = random.nextBoolean() ? 0 : 2;
|
||||
y = random.nextBoolean() ? 0 : 2;
|
||||
count++;
|
||||
} while ( (!table[y][x].isEmpty()) && (count < 10));
|
||||
|
||||
if (count > 9) {
|
||||
// Put to the remaining cells.
|
||||
int[][] pair = {{0, 1}, {1, 0}, {1, 2}, {2, 1}};
|
||||
count = 0;
|
||||
do {
|
||||
x = pair[random.nextInt(pair.length)][0];
|
||||
y = pair[random.nextInt(pair.length)][1];
|
||||
count++;
|
||||
} while ( (!table[y][x].isEmpty()) && (count < 10));
|
||||
}
|
||||
}
|
||||
table[y][x].setFigure(nextMoveIsX ? Figure.X : Figure.O);
|
||||
}
|
||||
|
||||
public char checkWinner() {
|
||||
// Horizontal check
|
||||
for (int y = 0; y < 3; y++) {
|
||||
if (isWinnerCombo(table[y][0], table[y][1], table[y][2])) {
|
||||
strikedMode = MODE_STRIKE_HORIZONTAL | y;
|
||||
return table[y][0].getFigure();
|
||||
}
|
||||
}
|
||||
// Vertical check
|
||||
for (int x = 0; x < 3; x++) {
|
||||
if (isWinnerCombo(table[0][x], table[1][x], table[2][x])) {
|
||||
strikedMode = MODE_STRIKE_VERTICAL | x;
|
||||
return table[0][x].getFigure();
|
||||
}
|
||||
}
|
||||
// Diagonal check
|
||||
if (isWinnerCombo(table[0][0], table[1][1], table[2][2])) {
|
||||
strikedMode = MODE_STRIKE_DIAGONAL;
|
||||
return table[0][0].getFigure();
|
||||
}
|
||||
if (isWinnerCombo(table[0][2], table[1][1], table[2][0])) {
|
||||
strikedMode = MODE_STRIKE_DIAGONAL_REVERSE;
|
||||
return table[0][2].getFigure();
|
||||
}
|
||||
// No winner
|
||||
return Figure.EMPTY;
|
||||
}
|
||||
|
||||
public boolean hasMoreMoves() {
|
||||
if (checkWinner() != Figure.EMPTY) return false;
|
||||
|
||||
int emptyFiguresCount = 0;
|
||||
for (int i = 0; i < table.length; i++) {
|
||||
for (int j = 0; j < table[0].length; j++) {
|
||||
if (table[i][j].isEmpty()) emptyFiguresCount++;
|
||||
}
|
||||
}
|
||||
|
||||
return (emptyFiguresCount != 0);
|
||||
}
|
||||
|
||||
private boolean isWinnerCombo(Figure f1, Figure f2, Figure f3) {
|
||||
if (f1.isEmpty()) return false;
|
||||
char figure = f1.getFigure();
|
||||
return ( (figure == f2.getFigure()) &&
|
||||
(figure == f3.getFigure()) );
|
||||
}
|
||||
|
||||
private char maybeWinnerComboIs(Figure[] array) {
|
||||
int numX = 0, numO = 0;
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (!array[i].isEmpty()) {
|
||||
if (array[i].getFigure() == Figure.X) numX++;
|
||||
else numO++;
|
||||
}
|
||||
}
|
||||
if (numX == 2) return Figure.X;
|
||||
if (numO == 2) return Figure.O;
|
||||
return Figure.EMPTY;
|
||||
}
|
||||
|
||||
private boolean setCompFigure(Figure[] array) {
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i].isEmpty()) {
|
||||
array[i].setFigure(Figure.O);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
82
src/jtictactoe/TitlePanel.form
Normal file
@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
|
||||
<Form version="1.3" maxVersion="1.8" type="org.netbeans.modules.form.forminfo.JPanelFormInfo">
|
||||
<Properties>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="33" green="33" red="33" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[480, 150]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="mousePressed" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="formMousePressed"/>
|
||||
<EventHandler event="mouseReleased" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="formMouseReleased"/>
|
||||
<EventHandler event="mouseDragged" listener="java.awt.event.MouseMotionListener" parameters="java.awt.event.MouseEvent" handler="formMouseDragged"/>
|
||||
</Events>
|
||||
<AuxValues>
|
||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,0,-96,0,0,1,-32"/>
|
||||
</AuxValues>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JButton" name="exitButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="new javax.swing.ImageIcon(exitImageBW)" type="code"/>
|
||||
</Property>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="null"/>
|
||||
</Property>
|
||||
<Property name="borderPainted" type="boolean" value="false"/>
|
||||
<Property name="contentAreaFilled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="exitButtonMouseEntered"/>
|
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="exitButtonMouseExited"/>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="exitButtonActionPerformed"/>
|
||||
</Events>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||
<AbsoluteConstraints x="378" y="2" width="100" height="50"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JButton" name="minimizeButton">
|
||||
<Properties>
|
||||
<Property name="icon" type="javax.swing.Icon" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
|
||||
<Connection code="new javax.swing.ImageIcon(minimizeImageBW)" type="code"/>
|
||||
</Property>
|
||||
<Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
|
||||
<Border info="null"/>
|
||||
</Property>
|
||||
<Property name="borderPainted" type="boolean" value="false"/>
|
||||
<Property name="contentAreaFilled" type="boolean" value="false"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="mouseEntered" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minimizeButtonMouseEntered"/>
|
||||
<EventHandler event="mouseExited" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="minimizeButtonMouseExited"/>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="minimizeButtonActionPerformed"/>
|
||||
</Events>
|
||||
<AuxValues>
|
||||
<AuxValue name="JavaCodeGenerator_CreateCodeCustom" type="java.lang.String" value="new javax.swing.JButton()"/>
|
||||
</AuxValues>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||
<AbsoluteConstraints x="2" y="2" width="100" height="50"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
195
src/jtictactoe/TitlePanel.java
Normal file
@ -0,0 +1,195 @@
|
||||
package jtictactoe;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Font;
|
||||
import java.awt.Frame;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.Point;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.awt.image.BufferedImage;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class TitlePanel extends JPanel {
|
||||
|
||||
private boolean moveForm;
|
||||
private BufferedImage exitImage, exitImageBW;
|
||||
private BufferedImage minimizeImage, minimizeImageBW;
|
||||
private BufferedImage background;
|
||||
private Point clickedStart;
|
||||
private final JFrame mainFrame;
|
||||
private Font messageFont, infoFont;
|
||||
|
||||
private int winX, winO;
|
||||
private String message;
|
||||
|
||||
|
||||
public TitlePanel(JFrame mainFrame) {
|
||||
this.mainFrame = mainFrame;
|
||||
background = Util.getImage("/res/title_bg.jpg");
|
||||
minimizeImage = Util.getImage("/res/minimize_button.png");
|
||||
minimizeImageBW = Util.getImage("/res/minimize_button_bw.png");
|
||||
exitImage = Util.getImage("/res/exit_button.png");
|
||||
exitImageBW = Util.getImage("/res/exit_button_bw.png");
|
||||
moveForm = false;
|
||||
messageFont = new Font("Arial", Font.BOLD, 60);
|
||||
infoFont = new Font("Arial", Font.PLAIN, 30);
|
||||
winX = winO = 0;
|
||||
message = "";
|
||||
initComponents();
|
||||
}
|
||||
|
||||
public void updateWin(int winX, int winO) {
|
||||
this.winX += winX;
|
||||
this.winO += winO;
|
||||
}
|
||||
|
||||
public void setMessage(String message) {
|
||||
this.message = message;
|
||||
repaint();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void paintComponent(Graphics g) {
|
||||
super.paintComponent(g);
|
||||
final int width = background.getWidth();
|
||||
|
||||
g.drawImage(background, 0, 0, null);
|
||||
|
||||
g.setColor(Color.DARK_GRAY);
|
||||
g.setFont(infoFont);
|
||||
|
||||
g.drawString("X:"+winX, 5, 110);
|
||||
String win = "O:" + winO;
|
||||
g.drawString(win, width - getFontMetrics(infoFont).stringWidth(win) - 5, 110);
|
||||
|
||||
if (!message.isEmpty()) {
|
||||
g.setFont(messageFont);
|
||||
int x = getFontMetrics(messageFont).stringWidth(message) / 2;
|
||||
x = width / 2 - x;
|
||||
g.drawString(message, x, 110);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
exitButton = new javax.swing.JButton();
|
||||
minimizeButton = new javax.swing.JButton();
|
||||
|
||||
setBackground(new java.awt.Color(51, 51, 51));
|
||||
setPreferredSize(new java.awt.Dimension(480, 150));
|
||||
addMouseListener(new java.awt.event.MouseAdapter() {
|
||||
public void mousePressed(java.awt.event.MouseEvent evt) {
|
||||
formMousePressed(evt);
|
||||
}
|
||||
public void mouseReleased(java.awt.event.MouseEvent evt) {
|
||||
formMouseReleased(evt);
|
||||
}
|
||||
});
|
||||
addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
|
||||
public void mouseDragged(java.awt.event.MouseEvent evt) {
|
||||
formMouseDragged(evt);
|
||||
}
|
||||
});
|
||||
setLayout(null);
|
||||
|
||||
exitButton.setIcon(new javax.swing.ImageIcon(exitImageBW));
|
||||
exitButton.setBorder(null);
|
||||
exitButton.setBorderPainted(false);
|
||||
exitButton.setContentAreaFilled(false);
|
||||
exitButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||
public void mouseEntered(java.awt.event.MouseEvent evt) {
|
||||
exitButtonMouseEntered(evt);
|
||||
}
|
||||
public void mouseExited(java.awt.event.MouseEvent evt) {
|
||||
exitButtonMouseExited(evt);
|
||||
}
|
||||
});
|
||||
exitButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
exitButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
add(exitButton);
|
||||
exitButton.setBounds(378, 2, 100, 50);
|
||||
|
||||
minimizeButton.setIcon(new javax.swing.ImageIcon(minimizeImageBW));
|
||||
minimizeButton.setBorder(null);
|
||||
minimizeButton.setBorderPainted(false);
|
||||
minimizeButton.setContentAreaFilled(false);
|
||||
minimizeButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||
public void mouseEntered(java.awt.event.MouseEvent evt) {
|
||||
minimizeButtonMouseEntered(evt);
|
||||
}
|
||||
public void mouseExited(java.awt.event.MouseEvent evt) {
|
||||
minimizeButtonMouseExited(evt);
|
||||
}
|
||||
});
|
||||
minimizeButton.addActionListener(new java.awt.event.ActionListener() {
|
||||
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||
minimizeButtonActionPerformed(evt);
|
||||
}
|
||||
});
|
||||
add(minimizeButton);
|
||||
minimizeButton.setBounds(2, 2, 100, 50);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitButtonActionPerformed
|
||||
mainFrame.setVisible(false);
|
||||
mainFrame.dispose();
|
||||
System.exit(0);
|
||||
}//GEN-LAST:event_exitButtonActionPerformed
|
||||
|
||||
private void minimizeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_minimizeButtonActionPerformed
|
||||
mainFrame.setState(Frame.ICONIFIED);
|
||||
}//GEN-LAST:event_minimizeButtonActionPerformed
|
||||
|
||||
private void exitButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exitButtonMouseEntered
|
||||
exitButton.setIcon(new ImageIcon(exitImage));
|
||||
}//GEN-LAST:event_exitButtonMouseEntered
|
||||
|
||||
private void exitButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_exitButtonMouseExited
|
||||
exitButton.setIcon(new ImageIcon(exitImageBW));
|
||||
}//GEN-LAST:event_exitButtonMouseExited
|
||||
|
||||
private void minimizeButtonMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minimizeButtonMouseEntered
|
||||
minimizeButton.setIcon(new ImageIcon(minimizeImage));
|
||||
}//GEN-LAST:event_minimizeButtonMouseEntered
|
||||
|
||||
private void minimizeButtonMouseExited(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_minimizeButtonMouseExited
|
||||
minimizeButton.setIcon(new ImageIcon(minimizeImageBW));
|
||||
}//GEN-LAST:event_minimizeButtonMouseExited
|
||||
|
||||
private void formMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMousePressed
|
||||
if (evt.getButton() == MouseEvent.BUTTON1) {
|
||||
moveForm = true;
|
||||
clickedStart = evt.getPoint();
|
||||
}
|
||||
}//GEN-LAST:event_formMousePressed
|
||||
|
||||
private void formMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseReleased
|
||||
moveForm = false;
|
||||
}//GEN-LAST:event_formMouseReleased
|
||||
|
||||
private void formMouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_formMouseDragged
|
||||
if (moveForm) {
|
||||
Point moved = evt.getLocationOnScreen();
|
||||
moved.translate(-clickedStart.x, -clickedStart.y);
|
||||
mainFrame.setLocation(moved);
|
||||
}
|
||||
}//GEN-LAST:event_formMouseDragged
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JButton exitButton;
|
||||
private javax.swing.JButton minimizeButton;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
|
||||
}
|
25
src/jtictactoe/Util.java
Normal file
@ -0,0 +1,25 @@
|
||||
package jtictactoe;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author aNNiMON
|
||||
*/
|
||||
public class Util {
|
||||
|
||||
public static BufferedImage getImage(String path) {
|
||||
BufferedImage image = null;
|
||||
try {
|
||||
InputStream is = Runtime.getRuntime().getClass().getResourceAsStream(path);
|
||||
image = ImageIO.read(is);
|
||||
is.close();
|
||||
} catch (IOException ex) {
|
||||
}
|
||||
return image;
|
||||
}
|
||||
|
||||
}
|
BIN
src/res/exit_button.png
Normal file
After Width: | Height: | Size: 4.3 KiB |
BIN
src/res/exit_button_bw.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
src/res/minimize_button.png
Normal file
After Width: | Height: | Size: 3.5 KiB |
BIN
src/res/minimize_button_bw.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
src/res/o.png
Normal file
After Width: | Height: | Size: 2.5 KiB |
BIN
src/res/striked.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src/res/striked_diagonal.png
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
src/res/striked_diagonal_rev.png
Normal file
After Width: | Height: | Size: 28 KiB |
BIN
src/res/striked_ver.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
src/res/table_bg.jpg
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
src/res/title_bg.jpg
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
src/res/x.png
Normal file
After Width: | Height: | Size: 713 B |