From 747bc62596dc6e7d75151f631603c496c10eab28 Mon Sep 17 00:00:00 2001 From: Janet-Doe Date: Mon, 31 Mar 2025 11:21:27 +0200 Subject: [PATCH] contoller --- .../java/chess/controller/Controller.java | 29 ++++++ app/src/main/java/chess/model/Board.java | 35 +++---- .../main/java/chess/model/Coordinates.java | 4 + app/src/main/java/chess/model/Game.java | 86 +++++++++++++++--- app/src/main/java/chess/model/Move.java | 26 ++++++ app/src/main/java/chess/model/Piece.java | 2 +- app/src/main/java/chess/model/Player.java | 21 +++++ .../chess/view/render2D/PieceFileName.java | 2 +- .../main/java/chess/view/render2D/Pieces.java | 15 --- .../main/java/chess/view/render2D/Window.java | 22 +++-- .../pieces2D/black-bishop.png | Bin .../pieces2D/black-king.png | Bin .../pieces2D/black-knight.png | Bin .../pieces2D/black-pawn.png | Bin .../pieces2D/black-queen.png | Bin .../pieces2D/black-rook.png | Bin .../pieces2D/white-bishop.png | Bin .../pieces2D/white-king.png | Bin .../pieces2D/white-knight.png | Bin .../pieces2D/white-pawn.png | Bin .../pieces2D/white-queen.png | Bin .../pieces2D/white-rook.png | Bin 22 files changed, 185 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/chess/controller/Controller.java create mode 100644 app/src/main/java/chess/model/Move.java create mode 100644 app/src/main/java/chess/model/Player.java rename app/src/main/{ressources => resources}/pieces2D/black-bishop.png (100%) rename app/src/main/{ressources => resources}/pieces2D/black-king.png (100%) rename app/src/main/{ressources => resources}/pieces2D/black-knight.png (100%) rename app/src/main/{ressources => resources}/pieces2D/black-pawn.png (100%) rename app/src/main/{ressources => resources}/pieces2D/black-queen.png (100%) rename app/src/main/{ressources => resources}/pieces2D/black-rook.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-bishop.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-king.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-knight.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-pawn.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-queen.png (100%) rename app/src/main/{ressources => resources}/pieces2D/white-rook.png (100%) diff --git a/app/src/main/java/chess/controller/Controller.java b/app/src/main/java/chess/controller/Controller.java new file mode 100644 index 0000000..9b11745 --- /dev/null +++ b/app/src/main/java/chess/controller/Controller.java @@ -0,0 +1,29 @@ +package chess.controller; + +import chess.model.Coordinates; +import chess.model.Game; +import chess.model.Move; +import chess.view.render2D.Window; + +public class Controller { + private final Game game; + private final Window view; + + public Controller(Game game, Window view) { + this.game = game; + this.view = view; + } + + /** + * + * @param from Coordinates: old coordinates + * @param to Coordinates: new coordinates + */ + public void sendMove(Coordinates from, Coordinates to) { + System.out.println("New move: " + from + " to " + to); + game.setMove(new Move(from, to)); + } + + + +} diff --git a/app/src/main/java/chess/model/Board.java b/app/src/main/java/chess/model/Board.java index 1db4d52..f55fa9e 100644 --- a/app/src/main/java/chess/model/Board.java +++ b/app/src/main/java/chess/model/Board.java @@ -40,28 +40,29 @@ public class Board { public void setPiecesSize8(){ for (int i = 0; i < 8; i++) { - board[i][1].setPiece(new Pawn(WHITE)); - board[i][6].setPiece(new Pawn(BLACK)); + board[i][1].setPiece(new Pawn(BLACK)); + board[i][6].setPiece(new Pawn(WHITE)); if (i==0 || i==7) { - board[i][0].setPiece(new Rook(WHITE)); - board[i][7].setPiece(new Rook(BLACK)); + board[i][0].setPiece(new Rook(BLACK)); + board[i][7].setPiece(new Rook(WHITE)); } if (i==1 || i==6) { - board[i][0].setPiece(new Knight(WHITE)); - board[i][7].setPiece(new Knight(BLACK)); + board[i][0].setPiece(new Knight(BLACK)); + board[i][7].setPiece(new Knight(WHITE)); } if (i==2 || i==5) { - board[i][0].setPiece(new Bishop(WHITE)); - board[i][7].setPiece(new Bishop(BLACK)); + board[i][0].setPiece(new Bishop(BLACK)); + board[i][7].setPiece(new Bishop(WHITE)); } if (i==3) { - board[i][0].setPiece(new King(WHITE)); - board[i][7].setPiece(new King(BLACK)); + board[i][0].setPiece(new Queen(BLACK)); + board[i][7].setPiece(new Queen(WHITE)); } if (i==4) { - board[i][0].setPiece(new Queen(WHITE)); - board[i][7].setPiece(new Queen(BLACK)); + board[i][0].setPiece(new King(BLACK)); + board[i][7].setPiece(new King(WHITE)); } + } } @@ -69,12 +70,12 @@ public class Board { return getCell(coordinates).getPiece(); } - public void movePiece(Coordinates initialPosition, Coordinates finalPosition) throws Error { - Piece movingPiece = getPiece(initialPosition); - Cell arrivalCell = getCell(finalPosition); - getCell(initialPosition).deletePiece(); + public void movePiece(Move move) throws Error { + Piece movingPiece = getPiece(move.getStart()); + Cell arrivalCell = getCell(move.getEnd()); + getCell(move.getStart()).deletePiece(); arrivalCell.setPiece(movingPiece); } - + // je fais mumuse } diff --git a/app/src/main/java/chess/model/Coordinates.java b/app/src/main/java/chess/model/Coordinates.java index 4b2f0f2..2f9a16b 100644 --- a/app/src/main/java/chess/model/Coordinates.java +++ b/app/src/main/java/chess/model/Coordinates.java @@ -15,4 +15,8 @@ public class Coordinates { public int getY() { return this.y; } + + public String toString() { + return "(" + this.x + ", " + this.y + ")"; + } } diff --git a/app/src/main/java/chess/model/Game.java b/app/src/main/java/chess/model/Game.java index 6ba915a..1e82aa1 100644 --- a/app/src/main/java/chess/model/Game.java +++ b/app/src/main/java/chess/model/Game.java @@ -1,29 +1,87 @@ package chess.model; -public class Game { - private Board board; +import java.util.ArrayList; +import java.util.Observable; + +public class Game extends Observable implements Runnable { + private final Board board; + private Move move; + private final ArrayList players = new ArrayList<>(); public Game(int size) { this.board = new Board(size); + this.setChanged(); + this.notifyObservers(); + } + public Game() { + this(8); } public int getSize(){ return board.getSize(); } - - public Game() { - this(8); - } - - public void jouerPartie(){ - // todo - } - - public Board getBoard(){ + public Board getBoard() { return board; } + public Move getMove() { + return move; + } - public void move(Coordinates initialPosition, Coordinates finalPosition){ - board.movePiece(initialPosition, finalPosition); + public void setMove(Move m){ + this.move = m; + synchronized (this) { + this.notify(); + } + } + + public boolean gameDone(){ + // todo + return false; + } + + public Player getNextPlayer(){ + return players.getFirst(); + } + + public void updatePlayersList(){ + Player player = players.getFirst(); + players.remove(player); + players.add(player); + } + + public void playGame() { + players.add(new Player(this)); + players.add(new Player(this)); + while (!gameDone()){ + Move m = getNextPlayer().getMove(); + while (!applyMove(m)){ + m = getNextPlayer().getMove(); + } + updatePlayersList(); + setChanged(); + notifyObservers(); + } + } + + @Override + public void run(){ + playGame(); + } + + public boolean applyMove(Move m){ + if (board.getCell(m.getStart()).getPiece() == null){ + return false; + } + try { + move(m); + } + catch (Exception e) { + return false; + } + return true; + } + + public void move(Move move) throws Exception{ + board.movePiece(move); } } diff --git a/app/src/main/java/chess/model/Move.java b/app/src/main/java/chess/model/Move.java new file mode 100644 index 0000000..1816d9e --- /dev/null +++ b/app/src/main/java/chess/model/Move.java @@ -0,0 +1,26 @@ +package chess.model; + +public class Move { + private Coordinates start; + private Coordinates end; + + public Move(Coordinates start, Coordinates end) { + this.start = start; + this.end = end; + } + + public Coordinates getEnd() { + return end; + } + + public Coordinates getStart() { + return start; + } + + public void updateMove(Coordinates start, Coordinates end) { + this.start = start; + this.end = end; + } + + +} diff --git a/app/src/main/java/chess/model/Piece.java b/app/src/main/java/chess/model/Piece.java index f11617e..44dee56 100644 --- a/app/src/main/java/chess/model/Piece.java +++ b/app/src/main/java/chess/model/Piece.java @@ -15,6 +15,6 @@ public abstract class Piece { public abstract void accept(PieceVisitor pv); - // public abstract void move(); + // public abstract void allowedMove(); } diff --git a/app/src/main/java/chess/model/Player.java b/app/src/main/java/chess/model/Player.java new file mode 100644 index 0000000..feb5c25 --- /dev/null +++ b/app/src/main/java/chess/model/Player.java @@ -0,0 +1,21 @@ +package chess.model; + +public class Player { + private final Game game; + + public Player(Game game) { + this.game = game; + } + + public Move getMove(){ + synchronized(game){ + try { + game.wait(); + } + catch (Exception e) { + System.out.println(e.getMessage()); + } + } + return game.getMove(); + } +} diff --git a/app/src/main/java/chess/view/render2D/PieceFileName.java b/app/src/main/java/chess/view/render2D/PieceFileName.java index a1b41f6..02801d8 100644 --- a/app/src/main/java/chess/view/render2D/PieceFileName.java +++ b/app/src/main/java/chess/view/render2D/PieceFileName.java @@ -7,7 +7,7 @@ import chess.model.pieces.*; public class PieceFileName implements PieceVisitor { private String pieceName; - private static final String BASE = "app/src/main/ressources/pieces2D/"; + private static final String BASE = "app/src/main/resources/pieces2D/"; PieceFileName(Piece piece) { visit(piece); diff --git a/app/src/main/java/chess/view/render2D/Pieces.java b/app/src/main/java/chess/view/render2D/Pieces.java index 6ec03e9..98a0284 100644 --- a/app/src/main/java/chess/view/render2D/Pieces.java +++ b/app/src/main/java/chess/view/render2D/Pieces.java @@ -18,21 +18,6 @@ public enum Pieces { BLACK_PAWN; public static ImageIcon getIcon(String path) { - /*return switch (this) { - case WHITE_KING -> new ImageIcon(new ImageIcon(path + "white-king.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case WHITE_QUEEN -> new ImageIcon(new ImageIcon(path + "white-queen.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case WHITE_KNIGHT -> new ImageIcon(new ImageIcon(path + "white-knight.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case WHITE_BISHOP -> new ImageIcon(new ImageIcon(path + "white-bishop.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case WHITE_ROOK -> new ImageIcon(new ImageIcon(path + "white-rook.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case WHITE_PAWN -> new ImageIcon(new ImageIcon(path + "white-pawn.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_KING -> new ImageIcon(new ImageIcon(path + "black-king.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_QUEEN -> new ImageIcon(new ImageIcon(path + "black-queen.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_KNIGHT -> new ImageIcon(new ImageIcon(path + "black-knight.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_BISHOP -> new ImageIcon(new ImageIcon(path + "black-bishop.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_ROOK -> new ImageIcon(new ImageIcon(path + "black-rook.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - case BLACK_PAWN -> new ImageIcon(new ImageIcon(path + "black-pawn.png").getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); - default -> null; - };*/ return new ImageIcon(new ImageIcon(path).getImage().getScaledInstance(100,100, Image.SCALE_SMOOTH)); } } diff --git a/app/src/main/java/chess/view/render2D/Window.java b/app/src/main/java/chess/view/render2D/Window.java index 47979d6..268815f 100644 --- a/app/src/main/java/chess/view/render2D/Window.java +++ b/app/src/main/java/chess/view/render2D/Window.java @@ -1,5 +1,6 @@ package chess.view.render2D; +import chess.controller.Controller; import chess.model.Coordinates; import chess.model.Game; import chess.model.Piece; @@ -13,18 +14,27 @@ import java.util.Observer; public class Window extends JFrame implements Observer { private final Game game; + private final Controller controller; private final JLabel[][] tab; - private static final String path = "app/src/main/ressources/pieces2D/"; + private static final String path = "app/src/main/resources/pieces2D/"; Coordinates mouseClick = null; Coordinates mouseRelease = null; public Window(Game game) { this.game = game; + game.addObserver(this); + this.controller = new Controller(game, this); tab = new JLabel[game.getSize()][game.getSize()]; + build(); + showBoard(); } public static void main(String[] args){ - new Window(new Game()).build(); + Game game = new Game(); + Thread gameThread = new Thread(game); + gameThread.start(); + Window f = new Window(game); + f.setVisible(true); } /** @@ -47,14 +57,12 @@ public class Window extends JFrame implements Observer { jl.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { if (mouseClick == null) { - System.out.println("Click on (" + xx + ";" + yy + ")"); mouseClick = new Coordinates(xx, yy); } else { - System.out.println("Release on (" + xx + ";" + yy + ")"); mouseRelease = new Coordinates(xx, yy); if (!mouseClick.equals(mouseRelease)) { - game.move(mouseClick, mouseRelease); + controller.sendMove(mouseClick, mouseRelease); update(); } mouseClick = null; @@ -67,11 +75,8 @@ public class Window extends JFrame implements Observer { } } setSize(800,800); - setVisible(true); - update(); } - public void showBoard(){ for (int y = 0; y < game.getSize(); y++){ for (int x = 0; x < game.getSize(); x++){ @@ -95,7 +100,6 @@ public class Window extends JFrame implements Observer { @Override public void update(Observable o, Object arg) { - System.out.println("Update."); update(); } } diff --git a/app/src/main/ressources/pieces2D/black-bishop.png b/app/src/main/resources/pieces2D/black-bishop.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-bishop.png rename to app/src/main/resources/pieces2D/black-bishop.png diff --git a/app/src/main/ressources/pieces2D/black-king.png b/app/src/main/resources/pieces2D/black-king.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-king.png rename to app/src/main/resources/pieces2D/black-king.png diff --git a/app/src/main/ressources/pieces2D/black-knight.png b/app/src/main/resources/pieces2D/black-knight.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-knight.png rename to app/src/main/resources/pieces2D/black-knight.png diff --git a/app/src/main/ressources/pieces2D/black-pawn.png b/app/src/main/resources/pieces2D/black-pawn.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-pawn.png rename to app/src/main/resources/pieces2D/black-pawn.png diff --git a/app/src/main/ressources/pieces2D/black-queen.png b/app/src/main/resources/pieces2D/black-queen.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-queen.png rename to app/src/main/resources/pieces2D/black-queen.png diff --git a/app/src/main/ressources/pieces2D/black-rook.png b/app/src/main/resources/pieces2D/black-rook.png similarity index 100% rename from app/src/main/ressources/pieces2D/black-rook.png rename to app/src/main/resources/pieces2D/black-rook.png diff --git a/app/src/main/ressources/pieces2D/white-bishop.png b/app/src/main/resources/pieces2D/white-bishop.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-bishop.png rename to app/src/main/resources/pieces2D/white-bishop.png diff --git a/app/src/main/ressources/pieces2D/white-king.png b/app/src/main/resources/pieces2D/white-king.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-king.png rename to app/src/main/resources/pieces2D/white-king.png diff --git a/app/src/main/ressources/pieces2D/white-knight.png b/app/src/main/resources/pieces2D/white-knight.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-knight.png rename to app/src/main/resources/pieces2D/white-knight.png diff --git a/app/src/main/ressources/pieces2D/white-pawn.png b/app/src/main/resources/pieces2D/white-pawn.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-pawn.png rename to app/src/main/resources/pieces2D/white-pawn.png diff --git a/app/src/main/ressources/pieces2D/white-queen.png b/app/src/main/resources/pieces2D/white-queen.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-queen.png rename to app/src/main/resources/pieces2D/white-queen.png diff --git a/app/src/main/ressources/pieces2D/white-rook.png b/app/src/main/resources/pieces2D/white-rook.png similarity index 100% rename from app/src/main/ressources/pieces2D/white-rook.png rename to app/src/main/resources/pieces2D/white-rook.png