From 8083297010785c3e69d00f5e239cbf911f9c1bbe Mon Sep 17 00:00:00 2001 From: Teo Blaise Kaplanski <teobk@macbook-air-de-teo.home> Date: Wed, 23 Dec 2020 22:14:06 +0100 Subject: [PATCH] rendu --- projetechecs-master/.classpath | 6 + projetechecs-master/.gitignore | 1 + projetechecs-master/.project | 17 ++ projetechecs-master/Bishop.java | 34 +++ projetechecs-master/Board.java | 143 ++++++++++++ projetechecs-master/ChessBot.java | 41 ++++ projetechecs-master/ChessColor.java | 4 + projetechecs-master/ChessUI.java | 213 ++++++++++++++++++ projetechecs-master/Coordinates.java | 29 +++ projetechecs-master/FromTo.java | 17 ++ projetechecs-master/GameUI.java | 150 ++++++++++++ projetechecs-master/Human.java | 14 ++ projetechecs-master/King.java | 38 ++++ projetechecs-master/Knight.java | 35 +++ projetechecs-master/Main.java | 9 + projetechecs-master/Move.java | 29 +++ projetechecs-master/Pawn.java | 37 +++ projetechecs-master/Piece.java | 66 ++++++ projetechecs-master/Player.java | 61 +++++ projetechecs-master/Queen.java | 43 ++++ projetechecs-master/Rook.java | 33 +++ projetechecs-master/TestChess.java | 76 +++++++ .../boardConfigurationFiles/BackLine.txt | 16 ++ .../boardConfigurationFiles/FullBoard.txt | 32 +++ .../boardConfigurationFiles/KingsOnly.txt | 3 + .../boardConfigurationFiles/check.txt | 3 + .../boardConfigurationFiles/check2.txt | 4 + .../boardConfigurationFiles/checkMate.txt | 4 + .../boardConfigurationFiles/checkMate2.txt | 4 + projetechecs-master/img/Chess_bdt60.png | Bin 0 -> 1260 bytes projetechecs-master/img/Chess_blt60.png | Bin 0 -> 1944 bytes projetechecs-master/img/Chess_kdt60.png | Bin 0 -> 2485 bytes projetechecs-master/img/Chess_klt60.png | Bin 0 -> 2279 bytes projetechecs-master/img/Chess_ndt60.png | Bin 0 -> 1516 bytes projetechecs-master/img/Chess_nlt60.png | Bin 0 -> 1878 bytes projetechecs-master/img/Chess_pdt60.png | Bin 0 -> 797 bytes projetechecs-master/img/Chess_plt60.png | Bin 0 -> 1294 bytes projetechecs-master/img/Chess_qdt60.png | Bin 0 -> 2267 bytes projetechecs-master/img/Chess_qlt60.png | Bin 0 -> 2637 bytes projetechecs-master/img/Chess_rdt60.png | Bin 0 -> 725 bytes projetechecs-master/img/Chess_rlt60.png | Bin 0 -> 933 bytes projetechecs-master/readme.md | 78 +++++++ 42 files changed, 1240 insertions(+) create mode 100644 projetechecs-master/.classpath create mode 100644 projetechecs-master/.gitignore create mode 100644 projetechecs-master/.project create mode 100644 projetechecs-master/Bishop.java create mode 100644 projetechecs-master/Board.java create mode 100644 projetechecs-master/ChessBot.java create mode 100644 projetechecs-master/ChessColor.java create mode 100644 projetechecs-master/ChessUI.java create mode 100644 projetechecs-master/Coordinates.java create mode 100644 projetechecs-master/FromTo.java create mode 100644 projetechecs-master/GameUI.java create mode 100644 projetechecs-master/Human.java create mode 100644 projetechecs-master/King.java create mode 100644 projetechecs-master/Knight.java create mode 100644 projetechecs-master/Main.java create mode 100644 projetechecs-master/Move.java create mode 100644 projetechecs-master/Pawn.java create mode 100644 projetechecs-master/Piece.java create mode 100644 projetechecs-master/Player.java create mode 100644 projetechecs-master/Queen.java create mode 100644 projetechecs-master/Rook.java create mode 100644 projetechecs-master/TestChess.java create mode 100644 projetechecs-master/boardConfigurationFiles/BackLine.txt create mode 100644 projetechecs-master/boardConfigurationFiles/FullBoard.txt create mode 100644 projetechecs-master/boardConfigurationFiles/KingsOnly.txt create mode 100644 projetechecs-master/boardConfigurationFiles/check.txt create mode 100644 projetechecs-master/boardConfigurationFiles/check2.txt create mode 100644 projetechecs-master/boardConfigurationFiles/checkMate.txt create mode 100644 projetechecs-master/boardConfigurationFiles/checkMate2.txt create mode 100644 projetechecs-master/img/Chess_bdt60.png create mode 100644 projetechecs-master/img/Chess_blt60.png create mode 100644 projetechecs-master/img/Chess_kdt60.png create mode 100644 projetechecs-master/img/Chess_klt60.png create mode 100644 projetechecs-master/img/Chess_ndt60.png create mode 100644 projetechecs-master/img/Chess_nlt60.png create mode 100644 projetechecs-master/img/Chess_pdt60.png create mode 100644 projetechecs-master/img/Chess_plt60.png create mode 100644 projetechecs-master/img/Chess_qdt60.png create mode 100644 projetechecs-master/img/Chess_qlt60.png create mode 100644 projetechecs-master/img/Chess_rdt60.png create mode 100644 projetechecs-master/img/Chess_rlt60.png create mode 100644 projetechecs-master/readme.md diff --git a/projetechecs-master/.classpath b/projetechecs-master/.classpath new file mode 100644 index 0000000..07661e7 --- /dev/null +++ b/projetechecs-master/.classpath @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="src" path=""/> + <classpathentry kind="output" path=""/> +</classpath> diff --git a/projetechecs-master/.gitignore b/projetechecs-master/.gitignore new file mode 100644 index 0000000..5241a72 --- /dev/null +++ b/projetechecs-master/.gitignore @@ -0,0 +1 @@ +*.class \ No newline at end of file diff --git a/projetechecs-master/.project b/projetechecs-master/.project new file mode 100644 index 0000000..4f8a9ec --- /dev/null +++ b/projetechecs-master/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>projetechecs-master</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/projetechecs-master/Bishop.java b/projetechecs-master/Bishop.java new file mode 100644 index 0000000..a7e858c --- /dev/null +++ b/projetechecs-master/Bishop.java @@ -0,0 +1,34 @@ +public class Bishop extends Piece { + + public Bishop(int x, int y, Player owner){ + super(x, y, owner); + + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + Coordinates origin = new Coordinates(ox,oy); + for(int i=0; i<=7;i++) { + for(int j=0; j<=7;j++) { + if(board.sameDiagonalNothingBetween(origin, destination) &&(dx-ox)%(dy-oy)==0) {return true;} + } + } + + + return false; + } + + @Override + public Type getType() { + return Type.BISHOP; + } + + @Override + public int getValue() { + return 3; + } + +} diff --git a/projetechecs-master/Board.java b/projetechecs-master/Board.java new file mode 100644 index 0000000..5995f09 --- /dev/null +++ b/projetechecs-master/Board.java @@ -0,0 +1,143 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import java.io.FileNotFoundException; +import java.io.File; + +public class Board{ + private Piece[][] array; + + public Board(String fileName, Player white, Player black){ + int pieceType; + int col; + int row; + String nextWord; + Player owner; + + this.array = new Piece[8][8]; + try { + File file = new File(fileName); + if(file.exists()==false) { + System.err.println("Error: Cannot find file "+ fileName); + System.exit(1); + } + + Scanner in = new Scanner(file); + while(in.hasNext()) { + if ((nextWord = in.nextLine()).length()>2) { + pieceType = nextWord.charAt(0); + col = nextWord.charAt(1)-'0'; + row = nextWord.charAt(2)-'0'; + + owner = black; + if (pieceType >= 'a' && pieceType <= 'z') + owner = white; + switch(pieceType) { + case 'K' : case 'k' : + { this.addPiece(new King(col, row, owner)); break;} + case 'Q' : case 'q' : + { this.addPiece(new Queen(col, row, owner)); break;} + case 'B' : case 'b' : + { this.addPiece(new Bishop(col, row, owner)); break;} + case 'R' : case 'r' : + { this.addPiece(new Rook(col, row, owner)); break;} + case 'N' : case 'n' : + { this.addPiece(new Knight(col, row, owner)); break;} + case 'P' : case 'p' : + { this.addPiece(new Pawn(col, row, owner)); break;} + } + } + } + in.close(); + } + catch(FileNotFoundException e) { + System.err.println("Error file not found : "+e); + System.exit(1); + } + } + + public List<Coordinates> getAllCoordinates(){ + List<Coordinates> allCoordinates = new ArrayList<>(); + for (int i = 0; i < 8; i++) for (int j = 0; j < 8; j++) allCoordinates.add(new Coordinates(j, i)); + return allCoordinates; + } + + public List<Piece> getPieces(Player player) { + List<Piece> pieces = new ArrayList<>(); + List<Piece> all = getPieces(); + for (Piece piece : all) if (player.equals(piece.getOwner())) pieces.add(piece); + return pieces; + } + + public List<Piece> getPieces() { + List<Piece> all = new ArrayList<>(); + for (Piece[] pieces : array) for (Piece piece : pieces) if (piece != null) all.add(piece); + return all; + } + + public void addPiece(Piece piece){ + array[piece.getY()][piece.getX()] = piece; + } + + public Piece getPiece(Coordinates coordinates){ + return array[coordinates.getY()][coordinates.getX()]; + } + + public Piece getPiece(int x, int y){ + return array[y][x]; + } + + public void emptyCell(Coordinates coordinates){ + array[coordinates.getY()][coordinates.getX()] = null; + } + + public boolean isEmptyCell(Coordinates coordinates){ + return array[coordinates.getY()][coordinates.getX()] == null; + } + + public boolean isEmptyCell(int x, int y){ + return array[y][x] == null; + } + + public boolean sameColumnNothingBetween(Coordinates origin, Coordinates destination){ + if (origin.equals(destination)) return false; + if (origin.getX() != destination.getX()) return false; + int min = Math.min(origin.getY(), destination.getY()); + int max = Math.max(origin.getY(), destination.getY()); + for (int i = min ; i <= max; i++) { + if (!isEmptyCell(origin.getX(), i)) return false; + } + return true; + } + + public boolean sameRowNothingBetween(Coordinates origin, Coordinates destination){ + if (origin.equals(destination)) return false; + if (origin.getY() != destination.getY()) return false; + int min = Math.min(origin.getX(), destination.getX()); + int max = Math.max(origin.getX(), destination.getX()); + for (int i = min + 1; i < max; i++) { + if (!isEmptyCell(i, origin.getY())) return false; + } + return true; + } + + public boolean sameDiagonalNothingBetween(Coordinates origin, Coordinates destination){ + if (origin.equals(destination)) return false; + int lenX = Math.abs(origin.getX() - destination.getX()); + int lenY = Math.abs(origin.getY() - destination.getY()); + if (lenX != lenY) return false; + if (origin.getX() - destination.getX() > 1) { + if (origin.getY() - destination.getY() > 1) + for (int i = 1; i < lenX; i++) if (!isEmptyCell(origin.getX() - i, origin.getY() - i)) return false; + if (origin.getY() - destination.getY() < -1) + for (int i = 1; i < lenX; i++) if (!isEmptyCell(origin.getX() - i, origin.getY() + i)) return false; + } + if (origin.getX() - destination.getX() < -1) { + if (origin.getY() - destination.getY() > 1) + for (int i = 1; i < lenX; i++) if (!isEmptyCell(origin.getX() + i, origin.getY() - i)) return false; + if (origin.getY() - destination.getY() < -1) + for (int i = 1; i < lenX; i++) if (!isEmptyCell(origin.getX() + i, origin.getY() + i)) return false; + } + return true; + } +} diff --git a/projetechecs-master/ChessBot.java b/projetechecs-master/ChessBot.java new file mode 100644 index 0000000..3abb92b --- /dev/null +++ b/projetechecs-master/ChessBot.java @@ -0,0 +1,41 @@ +import java.util.Random; + +public class ChessBot extends Player { + + Board board; + + public ChessBot(ChessColor color){ + super(color); + board = null; + } + + public void setBoard(Board board){ + this.board = board; + } + + @Override + public FromTo getFromTo() { + Random rd = new Random(); + FromTo chosenMove = new FromTo(0,0,0,0); + int max = -1; + int scorePiece; + + for(Move move : getAllMoves(board)) { + if(move.pieceAtDestination == null) { + scorePiece = 0; + } else { + scorePiece = move.pieceAtDestination.getValue(); + } + + if(this.isCheck && move.pieceAtOrigin.getType() == Piece.Type.KING) + scorePiece += 100; + + if (scorePiece > max || (scorePiece == max && rd.nextBoolean())) { + chosenMove = new FromTo(move.origin.getX(),move.origin.getY(),move.destination.getX(),move.destination.getY()); + max = scorePiece; + } + } + + return chosenMove; + } +} diff --git a/projetechecs-master/ChessColor.java b/projetechecs-master/ChessColor.java new file mode 100644 index 0000000..fc2226b --- /dev/null +++ b/projetechecs-master/ChessColor.java @@ -0,0 +1,4 @@ +public enum ChessColor { + BLACK, + WHITE; +} diff --git a/projetechecs-master/ChessUI.java b/projetechecs-master/ChessUI.java new file mode 100644 index 0000000..d7c4917 --- /dev/null +++ b/projetechecs-master/ChessUI.java @@ -0,0 +1,213 @@ +import java.awt.*; +import java.awt.Color; +import java.awt.event.*; +import java.util.*; +import javax.swing.*; + +public class ChessUI extends JFrame implements MouseListener, MouseMotionListener { + JLayeredPane layeredPane; + JPanel chessBoard; + int cellSize; + + private ImageIcon[] chessIcons; + private JLabel[] pieceLabels; + + JLabel movingChessPiece; + int originXMove; + int originYMove; + int destXMove; + int destYMove; + + boolean moveFreshness; + + int xAdjustment; + int yAdjustment; + + + public ChessUI(){ + this.cellSize = 60; + Dimension boardSize = new Dimension(8 * cellSize, 8 * cellSize); + + // Use a Layered Pane for this this application + layeredPane = new JLayeredPane(); + getContentPane().add(layeredPane); + layeredPane.setPreferredSize(boardSize); + layeredPane.addMouseListener(this); + layeredPane.addMouseMotionListener(this); + + //Add a chess board to the Layered Pane + + chessBoard = new JPanel(); + layeredPane.add(chessBoard, JLayeredPane.DEFAULT_LAYER); + chessBoard.setLayout( new GridLayout(8, 8) ); + chessBoard.setPreferredSize( boardSize ); + chessBoard.setBounds(0, 0, boardSize.width, boardSize.height); + + for (int i = 0; i < 64; i++) { + JPanel square = new JPanel( new BorderLayout() ); + chessBoard.add( square ); + + square.setBackground( (i + i / 8) % 2 == 1 ? Color.GRAY : Color.WHITE ); + } + + initIcons(); + initPieceLabels(); + + setDefaultCloseOperation(DISPOSE_ON_CLOSE); + + pack(); + setResizable(true); + setLocationRelativeTo( null ); + setVisible(true); + } + + /** --------------------------------------------------------------------------------- + * Chess piece graphics **/ + + private void initIcons() { + chessIcons = new ImageIcon[] { + new ImageIcon("./img/Chess_kdt60.png"), + new ImageIcon("./img/Chess_qdt60.png"), + new ImageIcon("./img/Chess_rdt60.png"), + new ImageIcon("./img/Chess_bdt60.png"), + new ImageIcon("./img/Chess_ndt60.png"), + new ImageIcon("./img/Chess_pdt60.png"), + new ImageIcon("./img/Chess_klt60.png"), + new ImageIcon("./img/Chess_qlt60.png"), + new ImageIcon("./img/Chess_rlt60.png"), + new ImageIcon("./img/Chess_blt60.png"), + new ImageIcon("./img/Chess_nlt60.png"), + new ImageIcon("./img/Chess_plt60.png") + }; + } + + private void initPieceLabels() { + pieceLabels = new JLabel[64]; + + for(int k = 0; k < 64; k++) { + JLabel label = new JLabel(); + label.setVisible(false); + label.setSize(cellSize, cellSize); + pieceLabels[k] = label; + JPanel panel = (JPanel)chessBoard.getComponent(k); + panel.add(label); + } + } + + private JLabel getPieceLabel(int row, int column) { + return pieceLabels[row * 8 + column]; + } + + private ImageIcon getImageIcon(Piece.Type type, ChessColor color) { + return chessIcons[type.ordinal() + (color == ChessColor.WHITE ? Piece.Type.values().length : 0)]; + } + + /** + * This method takes a piece of a color and places it in the specified coordinates. + * @param type Desired type + * @param color Desired color (should only be either Color.white or Color.black) + * @param coord Coordinates of the piece + */ + public void placePiece(Piece.Type type, ChessColor color, Coordinates coord) { + getPieceLabel(coord.getY(), coord.getX()).setIcon(getImageIcon(type, color)); + getPieceLabel(coord.getY(), coord.getX()).setVisible(true); + } + + /** + * This method removes the piece at the specified position, if there is any. + * @param coord Coordinates of the piece + */ + public void removePiece(Coordinates coord) { + getPieceLabel(coord.getY(), coord.getX()).setVisible(false); + } + + /** --------------------------------------------------------------------------------- + * Events management **/ + + /** + * This method waits for the player to enter a move in the UI. Calling this is blocking. + */ + public FromTo waitForPlayerMove() { + moveFreshness = false; + + while(! moveFreshness) + try { + synchronized (this.getClass()) { + this.getClass().wait(); + } + } + catch (Exception e) { + System.err.println("ERROR : interrupted while waiting for chess move"); + System.err.println(e); + System.exit(-1); + } + + return new FromTo(originXMove, originYMove, destXMove, destYMove); + } + + public void mousePressed(MouseEvent e){ + movingChessPiece = null; + + originXMove = e.getX() / cellSize; + originYMove = e.getY() / cellSize; + + xAdjustment = - e.getX() + originXMove * cellSize; + yAdjustment = - e.getY() + originYMove * cellSize; + + movingChessPiece = new JLabel(getPieceLabel(originYMove, originXMove).getIcon()); + movingChessPiece.setVisible(getPieceLabel(originYMove, originXMove).isVisible()); + + movingChessPiece.setLocation(e.getX() + xAdjustment, e.getY() + yAdjustment); + if(movingChessPiece.getIcon() != null) + movingChessPiece.setSize(movingChessPiece.getIcon().getIconWidth(), movingChessPiece.getIcon().getIconHeight()); + layeredPane.add(movingChessPiece, JLayeredPane.DRAG_LAYER); + } + + //Move the chess piece around + + public void mouseDragged(MouseEvent me) { + if (movingChessPiece == null) return; + movingChessPiece.setLocation(me.getX() + xAdjustment, me.getY() + yAdjustment); + } + + //Drop the chess piece back onto the chess board + + public void mouseReleased(MouseEvent e) { + if(movingChessPiece == null) return; + + movingChessPiece.setVisible(false); + + layeredPane.remove(movingChessPiece); + movingChessPiece = null; + + destXMove = e.getX() / cellSize; + destYMove = e.getY() / cellSize; + + moveFreshness = true; + + synchronized (this.getClass()) { + this.getClass().notifyAll(); + } + } + + public void mouseClicked(MouseEvent e) {} + public void mouseMoved(MouseEvent e) {} + public void mouseEntered(MouseEvent e){} + public void mouseExited(MouseEvent e) {} + + public static void main(String[] args) { + ChessUI ui = new ChessUI(); + ui.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + + for(int k = 0; k < Piece.Type.values().length; k++) + ui.placePiece(Piece.Type.values()[k], ChessColor.BLACK, new Coordinates(k, 0)); + + for(int k = 0; k < Piece.Type.values().length; k++) + ui.placePiece(Piece.Type.values()[k], ChessColor.WHITE, new Coordinates(k, 1)); + + ui.pack(); + ui.setResizable(true); + ui.setLocationRelativeTo( null ); + ui.setVisible(true); + } +} diff --git a/projetechecs-master/Coordinates.java b/projetechecs-master/Coordinates.java new file mode 100644 index 0000000..68a191d --- /dev/null +++ b/projetechecs-master/Coordinates.java @@ -0,0 +1,29 @@ +public class Coordinates{ + private int x; + private int y; + + public Coordinates(int x, int y){ + this.x = x; + this.y = y; + } + + public int getX(){ + return x; + } + public int getY(){ + return y; + } + + @Override + public String toString(){ + return "x= "+x+" y= "+y; + } + + @Override + public boolean equals(Object o) { + if (this.getClass() != o.getClass()) return false; + if(this==o) return true; + Coordinates oCords = (Coordinates)o; + return this.x == oCords.x && this.y == oCords.y; + } +} diff --git a/projetechecs-master/FromTo.java b/projetechecs-master/FromTo.java new file mode 100644 index 0000000..36c1c6e --- /dev/null +++ b/projetechecs-master/FromTo.java @@ -0,0 +1,17 @@ +public class FromTo { + private final Coordinates from; + private final Coordinates to; + + public FromTo(int ox, int oy, int dx, int dy) { + from = new Coordinates(ox,oy); + to = new Coordinates(dx,dy); + } + + public Coordinates getFrom() { + return this.from; + } + + public Coordinates getTo() { + return this.to; + } +} diff --git a/projetechecs-master/GameUI.java b/projetechecs-master/GameUI.java new file mode 100644 index 0000000..e2cefc2 --- /dev/null +++ b/projetechecs-master/GameUI.java @@ -0,0 +1,150 @@ +import java.util.List; +import java.util.Stack; + + + + +public class GameUI { + public Board board; + private Player white; + private Player black; + private Player currentPlayer; + private ChessUI ui; + private Stack<Move> history; + + public GameUI(ChessUI ui, String boardConfigFileName, Player white, Player black){ + this.board = new Board(boardConfigFileName, white, black); + this.white = white; + this.black = black; + this.currentPlayer = white; + this.ui = ui; + this.history = new Stack<Move>(); + + for(Piece p : board.getPieces()) + this.ui.placePiece(p.getType(), p.getColor(), p.getPosition()); + } + + public Board getBoard(){ + return this.board; + } + + public boolean undo(){ + if(this.history.empty()) return false; + Move move = this.history.pop(); + board.emptyCell(move.destination); + ui.removePiece(move.destination); + if(move.pieceAtDestination != null){ + move.pieceAtDestination.setPosition(move.destination); + board.addPiece(move.pieceAtDestination); + ui.placePiece(move.pieceAtDestination.getType(), move.pieceAtDestination.getColor(), move.pieceAtDestination.getPosition()); + } + board.emptyCell(move.origin); + ui.removePiece(move.origin); + move.pieceAtOrigin.setPosition(move.origin); + board.addPiece(move.pieceAtOrigin); + ui.placePiece(move.pieceAtOrigin.getType(), move.pieceAtOrigin.getColor(), move.pieceAtOrigin.getPosition()); + + currentPlayer = move.pieceAtOrigin.getOwner(); + if(move.pieceAtDestination != null) + currentPlayer.removeFromScore(move.pieceAtDestination.getValue()); + return true; + } + + + + public boolean isMovePlayable(Move gameMove){ + Piece piece = board.getPiece(gameMove.origin); + if(piece == null + ||currentPlayer.getColor() != piece.getColor() + || !gameMove.pieceAtOrigin.isMoveAuthorized(board, gameMove.destination) + + || gameMove.pieceAtOrigin.getOwner() != currentPlayer){ + System.out.println("Le coups ne peut pas etre jouer 1"); + return false;} + + + + + if (gameMove.pieceAtDestination != null + && gameMove.pieceAtDestination.sameColor(gameMove.pieceAtOrigin)) { + System.out.println("Le coups ne peut pas etre jouer 2"); + + + + return false;} + + + applyMove(gameMove); + + /**if (isCheck(getOpponent(currentPlayer))) { + undo(); + return false; + } + + ***/ + undo(); + return true; + + } + + public void applyMove(Move move){ + Piece piece = board.getPiece(move.origin); + history.push(move); + board.emptyCell(piece.getPosition()); + piece.setPosition(move.destination); + board.addPiece(piece); + switchPlayers(); + } + + public void switchPlayers(){ + this.currentPlayer = getOpponent(currentPlayer); + } + + public Player getOpponent(Player player){ + if (player == white) return black; + return player; + } + + public boolean isPrey(Piece prey){ + Player playerOp = getOpponent(prey.owner); + List<Move> opponentMoves = playerOp.getAllMoves(board); + for (Move move : opponentMoves) { + if (prey.equals(move.pieceAtDestination)) return true; + } + return false; + } + + public boolean isCheck(Player player){return isPrey(player.getKing());} + + public boolean isCheckMate(Player player){ + return false; + } + + public void determineWinner(){ + } + + public void play(){ + int numberOfHits = 0; + while(numberOfHits < 50){ + System.out.println("A toi de jouer " + currentPlayer.getColor()); + Move move; + do { + move = new Move(board, currentPlayer.getFromTo()); + } + while(!isMovePlayable(move)); + applyMove(move); + ui.placePiece(move.pieceAtOrigin.getType(), move.pieceAtOrigin.getColor(), move.destination); + ui.removePiece(move.origin); + numberOfHits++; + switchPlayers(); + + + + + + numberOfHits ++; + System.out.println("Nombre de coups: " + numberOfHits+" /50"); + switchPlayers(); + } + } +} diff --git a/projetechecs-master/Human.java b/projetechecs-master/Human.java new file mode 100644 index 0000000..b995157 --- /dev/null +++ b/projetechecs-master/Human.java @@ -0,0 +1,14 @@ +public class Human extends Player{ + + ChessUI ui; + public Human(ChessUI ui, ChessColor color){ + super(color); + this.ui = ui; + } + + @Override + public FromTo getFromTo() { + return ui.waitForPlayerMove(); + } + +} diff --git a/projetechecs-master/King.java b/projetechecs-master/King.java new file mode 100644 index 0000000..96ea876 --- /dev/null +++ b/projetechecs-master/King.java @@ -0,0 +1,38 @@ +public class King extends Piece { + + public King(int x, int y, Player owner){ + super(x, y, owner); + owner.setKing(this); + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + + for(int i=-1;i<=1;i++) { + for(int j=-1; j<=1; j++) { + if( (dx-ox)==i && (dy-oy)==j && board.isEmptyCell(dx, dy)) { + return true; + } + } + + } + + + + return false; + } + + @Override + public Type getType() { + return Type.KING; + } + + @Override + public int getValue() { + return 0; + } + +} diff --git a/projetechecs-master/Knight.java b/projetechecs-master/Knight.java new file mode 100644 index 0000000..318c691 --- /dev/null +++ b/projetechecs-master/Knight.java @@ -0,0 +1,35 @@ +public class Knight extends Piece { + + public Knight(int x, int y, Player owner){ + super(x, y, owner); + + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + for(int i=-2; i <= 2; i++) { + for(int j=-2; j <= 2; j++) { + if(((dx-ox)%2==1 && (dy-oy)%2==0) || ((dx-ox)%2==0 && (dy-oy)%2==1)) { + return true; + } + } + } + + + return false; + } + + @Override + public Type getType() { + return Type.KNIGHT; + } + + @Override + public int getValue() { + return 3; + } + +} diff --git a/projetechecs-master/Main.java b/projetechecs-master/Main.java new file mode 100644 index 0000000..708eab9 --- /dev/null +++ b/projetechecs-master/Main.java @@ -0,0 +1,9 @@ +public class Main{ + public static void main(String[] args) { + ChessUI ui = new ChessUI(); + GameUI g = new GameUI(ui, "boardConfigurationFiles/FullBoard.txt", new Human(ui, ChessColor.WHITE), new Human(ui, ChessColor.BLACK)); + + g.play(); + } + +} diff --git a/projetechecs-master/Move.java b/projetechecs-master/Move.java new file mode 100644 index 0000000..3ab7d9b --- /dev/null +++ b/projetechecs-master/Move.java @@ -0,0 +1,29 @@ +public class Move{ + + final Coordinates origin; + final Coordinates destination; + final Piece pieceAtOrigin; + final Piece pieceAtDestination; + + public Move(Board board, Coordinates origin, Coordinates destination){ + this.origin = origin; + this.destination = destination; + this.pieceAtOrigin = board.getPiece(origin); + this.pieceAtDestination = board.getPiece(destination); + } + + public Move(Coordinates origin, Coordinates destination, Piece pieceAtOrigin, Piece pieceAtDestination){ + this.origin = origin; + this.destination = destination; + this.pieceAtOrigin = pieceAtOrigin; + this.pieceAtDestination = pieceAtDestination; + } + + public Move(Board board, FromTo ft){ + this.origin = ft.getFrom(); + this.destination = ft.getTo(); + this.pieceAtOrigin = board.getPiece(ft.getFrom()); + this.pieceAtDestination = board.getPiece(ft.getTo()); + } +} + diff --git a/projetechecs-master/Pawn.java b/projetechecs-master/Pawn.java new file mode 100644 index 0000000..ef8fb5b --- /dev/null +++ b/projetechecs-master/Pawn.java @@ -0,0 +1,37 @@ +public class Pawn extends Piece { + + public Pawn(int x, int y, Player owner){ + super(x, y, owner); + + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + int absx = Math.abs(dx-ox); + int absy = Math.abs(dy-oy); + for(int i=0; i<=7; i++) { + + if((oy==1 || oy == 6) && (absy==1 || absx == 2) && board.isEmptyCell(destination)&&absx==0) {return true;} + + if((oy!=1 || oy!=6) && absy==1 && absx==0){return true;} + return false; + } + + + return true; + } + + @Override + public Type getType() { + return Type.PAWN; + } + + @Override + public int getValue() { + return 1; + } + +} diff --git a/projetechecs-master/Piece.java b/projetechecs-master/Piece.java new file mode 100644 index 0000000..efe0429 --- /dev/null +++ b/projetechecs-master/Piece.java @@ -0,0 +1,66 @@ +import java.util.ArrayList; +import java.util.List; + +public abstract class Piece{ + protected Coordinates position; + protected Player owner; + + public Piece(int x, int y, Player owner){ + this.position = new Coordinates(x,y); + this.owner = owner; + } + + public enum Type { + KING, + QUEEN, + ROOK, + BISHOP, + KNIGHT, + PAWN + } + + public void setPosition(Coordinates destination){ + this.position = destination; + } + + public Player getOwner(){ + return this.owner; + } + + public ChessColor getColor(){ + return this.owner.color; + } + + public Coordinates getPosition(){ + return this.position; + } + + public int getX(){ + return this.position.getX(); + } + + public int getY(){ + return this.position.getY(); + } + + public List<Move> getAllMoves(Board board) { + List<Move> allMoves = new ArrayList<>(); + for (Coordinates coordinates : board.getAllCoordinates()){ + if (this.isMoveAuthorized(board,coordinates)){ + allMoves.add(new Move(board, position, coordinates)); + } + } + return allMoves; + } + + public boolean sameColor(Piece piece){ + return this.getColor()== piece.getColor(); + } + + public abstract boolean isMoveAuthorized(Board board, Coordinates destination); + + public abstract Type getType(); + public abstract int getValue(); + + +} diff --git a/projetechecs-master/Player.java b/projetechecs-master/Player.java new file mode 100644 index 0000000..1a38ecd --- /dev/null +++ b/projetechecs-master/Player.java @@ -0,0 +1,61 @@ +import java.util.ArrayList; +import java.util.List; + +public abstract class Player{ + protected ChessColor color; + private int score; + private King king; + public boolean isCheck; + public boolean isCheckMate; + + public Player(ChessColor color){ + this.color = color; + this.score = 0; + this.isCheckMate = false; + } + + public ChessColor getColor(){ + return this.color; + } + + public int getScore(){ + return this.score; + } + + public void addToScore(int value){ + score+=value; + } + + public void removeFromScore(int value){ + score-= value; + } + + public abstract FromTo getFromTo(); + + public Piece getKing(){ + return this.king; + } + + public void setKing(King king){ + this.king=king; + } + + public boolean isCheckMate(Board board){ + return false; + } + + public void setCheck(){ + } + + public void unSetCheck(){ + } + + public List<Move> getAllMoves(Board board) { + return null; + } + + @Override + public String toString(){ + return null; + } +} diff --git a/projetechecs-master/Queen.java b/projetechecs-master/Queen.java new file mode 100644 index 0000000..abdbfc6 --- /dev/null +++ b/projetechecs-master/Queen.java @@ -0,0 +1,43 @@ +public class Queen extends Piece { + + public Queen(int x, int y, Player owner){ + super(x, y, owner); + + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + Coordinates origin = new Coordinates(ox,oy); + + + + for(int i=0; i<=7;i++) { + for(int j=0; j<=7;j++) { + if(board.sameColumnNothingBetween(origin,destination)&& dy<=7 && dy >=0) {return true;} + else if(board.sameRowNothingBetween(origin,destination)&& dx<=7 && dx>=0) {return true;} + else if(board.sameDiagonalNothingBetween(origin, destination) &&(dx-ox)%(dy-oy)==0) {return true;} + } + } + + + + + + return false; + + } + + @Override + public Type getType() { + return Type.QUEEN; + } + + @Override + public int getValue() { + return 9; + } + +} diff --git a/projetechecs-master/Rook.java b/projetechecs-master/Rook.java new file mode 100644 index 0000000..f7abc5d --- /dev/null +++ b/projetechecs-master/Rook.java @@ -0,0 +1,33 @@ +public class Rook extends Piece { + + public Rook(int x, int y, Player owner){ + super(x, y, owner); + + } + + public boolean isMoveAuthorized(Board board, Coordinates destination){ + int dx = destination.getX(); + int dy = destination.getY(); + int ox = this.getX(); + int oy = this.getY(); + Coordinates origin = new Coordinates(ox,oy); + for(int i=0; i<=7;i++) { + for(int j=0; j<=7;j++) { + if(board.sameColumnNothingBetween(origin,destination)&& dy<=7 && dy >=0) {return true;} + else if(board.sameRowNothingBetween(origin,destination)&& dx<=7 && dx>=0) {return true;} + } + } + return false; + } + + @Override + public Type getType() { + return Type.ROOK; + } + + @Override + public int getValue() { + return 5; + } + +} diff --git a/projetechecs-master/TestChess.java b/projetechecs-master/TestChess.java new file mode 100644 index 0000000..d4e40c1 --- /dev/null +++ b/projetechecs-master/TestChess.java @@ -0,0 +1,76 @@ +import java.io.*; +import java.util.Scanner; + +public class TestChess{ + + public static void main(String[] args) { + + boolean resultTest; + /* Test de déplacements autorisés selon les regles de pièces */ + System.out.println("authorized moves"); + System.out.print("test 1 : "); + resultTest = testAuthorizedMove("boardConfigurationFiles/FullBoard.txt", new Coordinates(0,1), new Coordinates(0,2)); + if(resultTest == true) System.out.println("pass"); else System.out.println("fail"); + + System.out.print("test 2 : "); + resultTest = testAuthorizedMove("boardConfigurationFiles/FullBoard.txt", new Coordinates(0,1), new Coordinates(0,4)); + if(resultTest == false) System.out.println("pass"); else System.out.println("fail"); + + + /* Test de déplacements jouables sur l'échiquier actuel, selon les regles du jeu */ + System.out.println("playable moves"); + System.out.print("test 1 : "); + resultTest = testPlayableMove("boardConfigurationFiles/FullBoard.txt",new Coordinates(0,1),new Coordinates(0,2)); + if(resultTest == true) System.out.println("pass"); else System.out.println("fail"); + + System.out.print("test 2 : "); + resultTest = testPlayableMove("boardConfigurationFiles/FullBoard.txt",new Coordinates(0,1),new Coordinates(0,3)); + if(resultTest == true) System.out.println("pass"); else System.out.println("fail"); + + /* Tests de la mise en échec */ + + /* Tests de la Echec et mat "isCheckMate()" */ + + /* Tests pours le calcul des points en fin de partie */ + } + + + public static boolean testAuthorizedMove(String filename, Coordinates origin, Coordinates destination) { + ChessUI ui = new ChessUI(); + Board testBoard = new Board(filename, new Human(ui, ChessColor.WHITE), new Human(ui, ChessColor.BLACK)); + Piece testPiece = testBoard.getPiece(origin); + if(testPiece == null) { + System.out.println("No Piece at :"+origin); + return false; + } + return testPiece.isMoveAuthorized(testBoard, destination); + } + + + public static boolean testPlayableMove(String fileName, Coordinates origin, Coordinates destination) { + ChessUI ui = new ChessUI(); + GameUI g = new GameUI(ui, fileName, new Human(ui, ChessColor.WHITE), new Human(ui, ChessColor.BLACK)); + + Piece testPiece = g.getBoard().getPiece(origin); + if(testPiece == null) { + System.out.println("No Piece at :"+origin); + return false; + } + return g.isMovePlayable(new Move(g.getBoard(), origin, destination)); + } + + public static boolean testIsCheck(String fileName, Player p) { + ChessUI ui = new ChessUI(); + GameUI g = new GameUI(ui, fileName, new Human(ui, ChessColor.WHITE), new Human(ui, ChessColor.BLACK)); + return g.isCheck(p); + } + + public static boolean testIsCheckMate(String fileName, Player p) { + ChessUI ui = new ChessUI(); + GameUI g = new GameUI(ui, fileName, new Human(ui, ChessColor.WHITE), new Human(ui, ChessColor.BLACK)); + return g.isCheck(p) && g.isCheckMate(p); + } + + +} + diff --git a/projetechecs-master/boardConfigurationFiles/BackLine.txt b/projetechecs-master/boardConfigurationFiles/BackLine.txt new file mode 100644 index 0000000..97b7ec5 --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/BackLine.txt @@ -0,0 +1,16 @@ +r00 +n10 +b20 +q30 +k40 +b50 +n60 +r70 +R07 +N17 +B27 +Q37 +K47 +B57 +N67 +R77 diff --git a/projetechecs-master/boardConfigurationFiles/FullBoard.txt b/projetechecs-master/boardConfigurationFiles/FullBoard.txt new file mode 100644 index 0000000..e653b89 --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/FullBoard.txt @@ -0,0 +1,32 @@ +r00 +n10 +b20 +k30 +q40 +b50 +n60 +r70 +p01 +p11 +p21 +p31 +p41 +p51 +p61 +p71 +P06 +P16 +P26 +P36 +P46 +P56 +P66 +P76 +R07 +N17 +B27 +K37 +Q47 +B57 +N67 +R77 diff --git a/projetechecs-master/boardConfigurationFiles/KingsOnly.txt b/projetechecs-master/boardConfigurationFiles/KingsOnly.txt new file mode 100644 index 0000000..c0392a7 --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/KingsOnly.txt @@ -0,0 +1,3 @@ +K30 +k37 + diff --git a/projetechecs-master/boardConfigurationFiles/check.txt b/projetechecs-master/boardConfigurationFiles/check.txt new file mode 100644 index 0000000..0d8d02e --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/check.txt @@ -0,0 +1,3 @@ +r00 +k40 +K07 \ No newline at end of file diff --git a/projetechecs-master/boardConfigurationFiles/check2.txt b/projetechecs-master/boardConfigurationFiles/check2.txt new file mode 100644 index 0000000..49ff12e --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/check2.txt @@ -0,0 +1,4 @@ +r00 +k40 +R06 +K07 \ No newline at end of file diff --git a/projetechecs-master/boardConfigurationFiles/checkMate.txt b/projetechecs-master/boardConfigurationFiles/checkMate.txt new file mode 100644 index 0000000..5f1fe10 --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/checkMate.txt @@ -0,0 +1,4 @@ +r00 +r10 +k40 +K07 \ No newline at end of file diff --git a/projetechecs-master/boardConfigurationFiles/checkMate2.txt b/projetechecs-master/boardConfigurationFiles/checkMate2.txt new file mode 100644 index 0000000..2e746fd --- /dev/null +++ b/projetechecs-master/boardConfigurationFiles/checkMate2.txt @@ -0,0 +1,4 @@ +r00 +r20 +k40 +K07 \ No newline at end of file diff --git a/projetechecs-master/img/Chess_bdt60.png b/projetechecs-master/img/Chess_bdt60.png new file mode 100644 index 0000000000000000000000000000000000000000..453cb32355348ceadcc41e5c371130e7be1dc45e GIT binary patch literal 1260 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfSc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<`jGCf@!LoyoQ&a%&m4i!08e|)22;N`M{kR?1vno2xRHMz83Xpm&kRAA!rzOCWJ zlk+EVa)N6UZ`%|F2Mz&c<|IauK$Xdzj1dkyJaSo`l=`FsQ|2^C&9UeemTyZ}4*q)c z{n6)pcjVc<JTdA1*PZvDSD)MaeQvdD=+3DEH?x@%lj93^gRwtLw}+Dpo2$x~f6i|M zT-scpq$_a8uzXVb6f;96;A#NR4tWj6DrWE2qt1tJRdk$iO}Oy1kkezutEmerTZAqt zUFzN)(ID|5K_ceRsfV|1x4h(;!>Y&`c2(y?b#vPN)`O~NB7ZHlI)5+tYW!gZ!DSEh z8~Y2>o<{xQIMa4aspaVkVGHIz2YaWhuy!4=cF2EF!z5O%Ua+t4!t1yB4<61AGALj= z@lzmrYwm-ev%L&H=oI9NCuP5NUa<HnD|0`?Q?;XEZ@*3x<N3l6F2y->?%b;-R%<7E zESdN~Hett9*7MbpJ9ErduUb`GTN~$A$!U>u^kR;z*u>)vf&IDvzu#o2J)pf?txR@N zSYN~CJbss!l`A#b*ynz4pEpmA;n}li8X{b4)~`1<Ha>jo)~wmxla)Sg3OlqyQ=+v< z`~$yUqGbQ^((3By*NHhfYXURoZ+MVpdZ?f2ZXSPlc(|w9<S*a9GoL$g>~Z0;<;x=@ zBNgYLpX|3>`s+uN54o3pdfk5T*iD<gbg61+sIQ7p-Lw_@QJI%^o%MgbcC9YMsi#E= zwL1=KElIAES{|gy#>N&A7st1TKU|{qi}8&&YhK-SUn_Fyd4btq$E16QIy)0WV_ElY z`|z|$X+y%p6Pq3tialSd$gyYTDrvQOI-eG)O<%t8{M}-QBRz|kKInR}*&#C{!=rfT zoV>ieUz>V+dFRfVv!?4Wmqp6S^F{ixu3Q$kZr=QvVk5VF@#4eR`$MN@m~d_2m=hFw zo%dT_LfsW5C4HuRW|zemwJOhROh5fU*QcQ}wD#1L1%(#(dyN-IJ^PU9-FL0@W#F5B zAHOIo<FgMxe*AcG;zU6u!QKB2C!e%YQCbwXGhO1`#@5zWT~oJ>5m(;5d&j<}BC4+- zCn-s3nvdGvX?Zq^lTQX{i10=HG@iTERi!_8=ayrJp?gyvo~XL?>&^}N1F8q!rCii9 z*P1BA7`MQ$_H_HyMt*~PnXE;}on82t`X66e*j9Mxj(5^}M)8L84gR55!&?ssZ@<eW zmY(*CweLZQa@Jdir@yVW=I^y=&vuWwllwsA#ij%EMNcz^7wYY~ax3(~rd89*j^19K zAZW>F!+3}L4y($CvT|jPHxFVKMzGW|-3z_y>c9WXgz4=K{v7*SF854r2w%yQ5NpeO zq>S<YmIj6O)7T!J<*3`w>hfdj=d*9NaPiLjeKh|7|AFro-q&jn6h4qB`~Ayl@80sm zp588gjQJ1F>=AE>Z#Zo_?Qmq#A_w=QEa^!rZ<$R9zPdl=*Na1zs%yRm{$<XpeZ#=6 zox8eBWCyzi&mPu2%T`^F`O319?>+0DeSuqh6V~6@FL?jm4e>kgc06VI&#k#%VpDYJ Sgry7&3=E#GelF{r5}E*&7Dm4S literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_blt60.png b/projetechecs-master/img/Chess_blt60.png new file mode 100644 index 0000000000000000000000000000000000000000..26dae01cf054534b4f5c56ac60f334a7ab575f10 GIT binary patch literal 1944 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 WHDA6@{>Z?<z~JfX=d#Wzp$P!CYrvua literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_kdt60.png b/projetechecs-master/img/Chess_kdt60.png new file mode 100644 index 0000000000000000000000000000000000000000..225f869e9cc481683eae10622c0dad885c3aa3d4 GIT binary patch literal 2485 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 KT-G@yGywnw9G&I> literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_klt60.png b/projetechecs-master/img/Chess_klt60.png new file mode 100644 index 0000000000000000000000000000000000000000..d7341649bbfa2508149d8f57562503e6076aaab6 GIT binary patch literal 2279 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 K&t;ucLK6VnR$i?D literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_ndt60.png b/projetechecs-master/img/Chess_ndt60.png new file mode 100644 index 0000000000000000000000000000000000000000..8e3d04e6fa29d261b11356ebf3503e09d20f3781 GIT binary patch literal 1516 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 bzv{nYN)SDKTf3Zrfq}u()z4*}Q$iB}%lypW literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_nlt60.png b/projetechecs-master/img/Chess_nlt60.png new file mode 100644 index 0000000000000000000000000000000000000000..2d716b15b180f2a9b194cd78df3a5e7e9a0c22b0 GIT binary patch literal 1878 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 literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_pdt60.png b/projetechecs-master/img/Chess_pdt60.png new file mode 100644 index 0000000000000000000000000000000000000000..c432d38aeda8c8a49c772c9d7295d0359add9c01 GIT binary patch literal 797 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfSc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<{OW_h|ehGaCpon@OX>L}7S-&{>YN~AX-;L3ttC#j1Hi<&h4H8!*+Xhub3bp7CN zn)_{AR40q04$IMF>z%kKc1&#*Yf@19(dhbU<Bpw<i&U(wpP$*g^ZUMnU6$|Xv~RYy zw%%=Iyvwt8t=@tyRR`v-lPg%hn*GkpS5^=Hh52Y@svEGqVTfbaKl>(o;>ojXA{dkp zFdq;*s#CxkAsgH5m8+{N%l3}B*_&rJBj3!M-&a_5-8npotx;Nsm)n3VrgzQKD~n7y z->kCuHfKp~VCxhnJ0Y8Wo4gp8m*pHS|B?RT$0;q=KWY^<sZ*KuO*Z&uUSPgzLP3J3 zdgIELDRv1_m!?gqQZkpD^o>D3;@{8T_O@(&vv00R_f3?YX2ReT%rEvpqxbEy)rYKf zUh)(eUw$UO;qDnb>nSWp?j07FwYkRdT((9`gh?lpx!}ObcP*3o1+G6__4}FDt+y{k z+4h{hm>n@`&zVIH_pPeV&Uk!EiYX`UeS^PW+4;FO4L3r6t(<(`SY2L0?8n6B<1!zP z987ndc;I?w4u5gU%`<itBAXXH2tJkgK>7c?ps>!_f~KzTmR@HPZ}2tM?enyH8WH5| zIQK61p5<}r;>T@e&aYNZ*lu;m?6KHqeXCqno;B=omWRzAM@2I-Gaopta3jrUi|~gK zgEbc|-b-a$8uSMD>a#ZR?wA|A`g-z9oedXHW?S}puljpx2CvRa`5jYUPhMb`u&8X? z;iomTjHZ9O|B+cD>#C~l%LfxzJ=4>Rj65*OjpNUUtv$zHt2{0Hk&sr`=cc;W+c)au zfz=IvS9<O|uz2RronG_o#Va(7?ZZ!g{@x(G)e_9Q&NlDA)r>t}R@#-;vp>InD6_Vj z&HSsb>B1ZHE8Z?z_j~p>P~u=L-?fYH2me3DA2Uuki>_f{U|{fc^>bP0l+XkKw8>#< literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_plt60.png b/projetechecs-master/img/Chess_plt60.png new file mode 100644 index 0000000000000000000000000000000000000000..e98fae2bd8dd89313781f3107fe1b156e4674907 GIT binary patch literal 1294 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfSc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<`jx;<SSLoyoQ&N}U#oG#HmUw;{=&|?e9#fySI9BP=vrR-*{5me5qx#g05LRV~v z?v|wA;UeL8r@UiZ=&}3C*#}A?xfi&a7c@(*Z<Gv7&hGNqvS?rIi|{1RX7%Sudu#+O z6z@O%{^akc!gD7Bl@7%oD!t1%=ULp3ZN>UEw|9!~dwa(+@q4MyswrGdi3<cH*y_Y5 z=DMqi3m%ViF#MpbAQ@-RxU?)iz;AAp*3wlC8Xwjjf4p$*+TH*S7ag(Ww6wOvhn*W@ z7sR@R<#0brD2->hbm@|kx3~8sKO4E}=g#@XzSIavh~{fgv1e2f;5c#Z+O!m<nLb{r zsY|E*JF`y5@9ia724-gFkdTm+oPeO9Ll-VwSo*E(!ITfe4Fwi+wg%pM?*E4C(UbzN z2Tz`;WG}vaIk>hWC0t;6OFW~Gk55XjNT<t}#53De_;RD(Ge7!Rp(59xerHQrdHK=z z-(UN_J}kXEQ*)^t^La)aIsT6oHp#oU=ih%+_P_ek_vWBe^X_jvJ5`r0j#-GSRYj~j zb<Mi8<YebV4>zp)q!y4?sW!W{o^8p>m7aWje49>X_4V~FS-jZU+y9P4;yHbuB`a2V zT)TE{oyuxY6``Q0s8vg?*PKaxp8vzU;oiNttn6&wQXaPEFW<kv-X0%0>(nu>^~^^0 z_W3Jz%{qJ5H};{ecJa-ktxKj9F}v$cU#&3J>*3d`Vkvb2jtM?$j7&<CwkXYx_1?v! zp`odHGE(eZtNw~jN+JobC;eld(A(QPXWEy0_vUFVWwBu6T6-$>`7%>x16$j<!Ot^H zR_)(0U8yJ|RKvP;F~j7^lPyc<&6;(oeShSX=Q7gMORN>*)`zF1r}OGQkI+#&dh}@3 z^nWKV#guWzd(`uLl$LIN^X5&AXIXuHyp)vGmN)v-(l<rk;B{em`R2`($B!Sc*_581 ze(Cb%#i`<ri=>s${QUQU^@F-X-uCEY$Bu2{a$g+yv1)JB5B&$(2j+f1big^`o6?Sw z($bTU9wmiEo_+OdRY`gI^84%K7_>fxNqk`1&lD6Is=9db;&7qA`i~z!4hj!nzBHcc z-yUH$5rb9ctIYH7J%I#peEj;Q@eJ>u%>Gc`U{mqIK}<}{=VVq`c=*yaYka)z&r2sR zXz%_VHqqmVP~_P=cjo-4vD5uqxsT&KqmhkG&dN1uDJd@8``KcyYw^?^I2x}RzIST! zl*yBYSFT)n@sj-WSyxvTzs!H|XT8Y$^XV5SOxM)VNGK@yaH+;J(Xmvzar2==PM#`4 z+d{&N3knn(9UQ`czAO!`;0QQB&sJH2C(7W?|Hq$yzIgrma{m6anF8Eedzepr`m|~7 z)vG!A`Q4|V3O&d_kZrNv^QM)9mbSL+#H%J|X0KB3rkQNMsrpxB!Pc!;pBNnTn7#gN zM*QYO?-@<Z&1cITlgRws+Vjm+JBBMDE-tS~B6-Q#?<YVC`X5|+8{+OU`}~FtE2Ter zt;}4ociT3x{rBg8ws7-Y8nkB38iqYWg3hOJy_sCW&v@<nbzi>ZygKC>qW`9R=Kl9u u>9@18WWgKHJv9%{+4@$)%YldW49_Jx?;QCS{Dpymfx*+&&t;ucLK6Tv&RCrQ literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_qdt60.png b/projetechecs-master/img/Chess_qdt60.png new file mode 100644 index 0000000000000000000000000000000000000000..0d94a1c29a50896a6fbe017e1eeda9b5a42fe0a4 GIT binary patch literal 2267 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 literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_qlt60.png b/projetechecs-master/img/Chess_qlt60.png new file mode 100644 index 0000000000000000000000000000000000000000..a4fe68c80f79ab7b0b2ed6147383cda435407ea1 GIT binary patch literal 2637 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 Y_}uE&;W*=$3=9kmp00i_>zopr0IB@}0{{R3 literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_rdt60.png b/projetechecs-master/img/Chess_rdt60.png new file mode 100644 index 0000000000000000000000000000000000000000..b9748e87f29861cb4ca00c7ce03df54f3f6b35a0 GIT binary patch literal 725 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfSc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<{Of;?RuLoyoQ&f3^5>?m?<fBwgFB7(C$OcE9fOwjiAn0xEkHT#3gE&^{R9lLc% z;R%bi<AzO}E)*%Yx@xV>36fQrt+ZllqWQbcAC4He-JU!1?6KK%<@Y2Vp1uA3?U|Lv z){$KtT`k*RvwS+nxlLC6M%kQ%+l5WJ?$HJ(g-(7~No|&$xTI<Sgg-8yPPP4(nbdRn zm%5Tt6x#w`hjSZNcl~2}@UQJRi`GBSGRL2sOP}kV%wN8aKWIzlq&?feMQa|Ov+dU5 z${9ucyBDQeKaVw-9Q*H>%Lmo_-?wHrtUUX?xME&;tZC+}c@-1x<Zq3dpS|@K?^=d7 z9kK59i!Z)d)=?9fmGNl`;~U0`#y_h+TQf{AExPvZ;pGW63=cB*-~T@A?6Sf=zCO!? zORQu&PB0u$7W}zTSbcJDdxwqkPI=dhlb;sNbUjheaacg<lb4H}6zi!~9SZY%J3hG` z&b29<>u}HF;I_vsxBG;1to=5;g>d|)v40eo?qz%RwW>|=zW@tk&3%1o_ER5fe{6mK zdy{V3=9v@zWXwr-OUh^Dn0UVOn(XA5-gc9dK}&-wjU{-#ol5;IST0s5v-tY!y(*Q_ zE`6m*DTeL$*M+TaHsIN~_Vb$iE`couJlYI)6V`N}D8DLkZ22@5W`@wk3RN+}6CJh& zKAg7n5U1I^!&kGeW^cb8@%vEX>Yn4tK5D{yk4br7P;8J;Kkc&pwrPBds3c$eYwxRq zey;*2X^O9v6<etiB)aj?*+lglWhE^3$JRT2wErk`z@|4@?LYr~^*a+_k*hi9!Tj6j X4$itZ+enasfq}u()z4*}Q$iB}(#uH; literal 0 HcmV?d00001 diff --git a/projetechecs-master/img/Chess_rlt60.png b/projetechecs-master/img/Chess_rlt60.png new file mode 100644 index 0000000000000000000000000000000000000000..a805de496f4d152dd02026bed09b45548b6e88d8 GIT binary patch literal 933 zcmeAS@N?(olHy`uVBq!ia0y~yV6XvU4mJh`2CF|eix?OfSc;uILpV4%IBGajIv5xj zI14-?iy0VruY)k7lg8`{1_lPn64!{5;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xh zq!<{Ol{{S>LoyoQ&f4fN94K?#-ag~d%?pQ;GIH6E>#4CwMe?w^%chhR2*_ytZxY^Q zut9*WBvHA=!q6bY$LEHMiK4|NK8f60lP*k<D9m_K++eH_eyjTXf~vj#pS)-7{$BU} z_r2=x@9w=15A?d|S+do-VYZsUn{uXub?OkxJ$ge&gwm%tmnqG<ogF(e*1J6E?zmI7 z<J^{xE77_4MV3yP#+cl&>rj&3ZS4n350{?GyJc>CKG<sV$(RBQ1A~P5RZ2?!xy*7_ zTf@C3o=tme_wsY?xnGeCOM_0X+?(xm%U1fr{rmn)gBUArzxX41JZ{cS)~c$i4LYYi zYL2n4U%%ei+S+?>-2Retn{=K%f37b(f9A}GKYq+;Zf16$9~>OqXYR%RxG8w0$m-Rr z*Zqo^cJ$GsMK1$nKI-g<(c8RjTbk0eX*X}*zWn}8;?z2~&!OLU<=)J_vuO55fr$na z*x$7rPCRz}_{+C%uYS6!wKb~u>{(wvetyO}24}C8P1@?alxxZs|7tkj;H5TMYySDw zuOGd5;nCaEb3=JI|DCIyk<~4^E=%}-F!ZQQ_I&p28Aof+`c@qsoef*JvVIVi2=;pW z`o~8diGLmcM0(xY+uGaD*Vjlaj9R;C_ipc{L7GhbB}bX=E&CFG`M2Q$qnSM)U(Pw3 z_IBl;Q`vLW%DwG*e`UE`UEQ2e{Q@aAppmltG0W^bE59?mdGp4=&@l0W?vo<R-|0tI z>rZZ)&%ESvrkc7s@2*x4l|!daam`WV(^ubiHzDKme5S0}*x0P<>f04e3qrJ3W|(BD zGs;zVUj59`-NCwt*{Qj?S%iy~i?zJ-NSK7IY-(~cb3&xcJME?WGA)e^cFFI2ShJ<0 zhCOd<YD;4^L#IpAyLWla@767g&?zb^n)JZL_0Q?t`sD5~z3Iwg-7|}>Pl(V-3s>Lz zV#oJ_<DAzbmn>_vdaJ)=?snC4U0i3+ls<KIIn{9UQj_E(ua!lc-EIZ{`ctoWD>Lu3 zmF#z(?ETXoecW-<B9CXTVBOi5P9OC@vSqw{nzJP4m;J@U^92ew-m^6Q^;5X<{tw&5 YFxhQ$&a@n2U|?YIboFyt=akR{0IFB9<p2Nx literal 0 HcmV?d00001 diff --git a/projetechecs-master/readme.md b/projetechecs-master/readme.md new file mode 100644 index 0000000..57083f1 --- /dev/null +++ b/projetechecs-master/readme.md @@ -0,0 +1,78 @@ +# Projet de jeu d'échec en Java + +Projet Final (S3 Programmation 2) + +## Binôme + +Alexandre AGUEDO + +Astrid BEYER + + +Aix Marseille Université + +L2 Informatique + +Groupe 3 + +## Encadrant de TPs et projet + +Pacôme PERROTIN + +## Objectif et tâches + +L’objectif de ce projet est de programmer un jeu d’´echec. Ce jeu permet `a deux joueurs humains de jouer ensemble +ou bien à un joueur humain de jouer contre une version très simple d’un joueur artificiel, ou à deux joueurs artificiels +de jouer ensemble ! + +En savoir plus : http://pageperso.lif.univ-mrs.fr/~alexis.nasr/Ens/PROG2/projet_echecs_an.pdf + +## Les fichiers + +* boardConfigurationFiles/ +> Dossier contenant des placements de pièces pré-remplis, ces placements sont utiles pour tester le programme dans diverses situations. + +* img/ +> Dossier avec les images en format PNG des 12 pièces de l'échiquier (6 noires et 6 blanches). + +* Player.java +> Classe abstraite déterminant un joueur. + +* Board.java +> Classe permettant d'instancier le plateau de jeu d'échec. + +* ChessBot.java +> Classe qui étend Player. ChessBot est la classe d'un joueur robot qui va choisir les coups les plus avantageux (rapportant le plus de score) lorsqu'il jouera. + +* Human.java +> Classe qui étend Player. Cette classe permet à un utilisateur de jouer. + +* ChessColor.java +> Énumération des couleurs possibles des joueurs/pièces. + +* Piece.java +> Classe abstraite déterminant une pièce de l'échiquier. + +* Bishop.java ; King.java ; Knight.java ; Pawn.java ; Queen.java ; Rook.java +> Respectivement les classes du fou, roi, cavalier, pion, dame et tour. Ces classes étendent toutes la classe Piece et déterminent, pour chaque pièce, leurs mouvements possibles et autorisés. + +* TestChess.java +> Fichier de tests. + +* Move.java +> Classe publique qui permet à une pièce de se déplacer d'un point à un autre dans l'échiquier. + +* ChessUI.java +> Classe gérant l'interface du jeu d'échec et la possibilité de déplacer ses pièces avec sa souris. + +* GameUI.java +> Classe gérant le déroulement de la partie. + +* Coordinates.java +> Classe permettant de récupérer des coordonnées. + +* FromTo.java +> Classe permettant de récupérer les coordonnées d'origine d'une pièce et les coordonnées de destination d'une pièce. + +* Main.java +> Classe principale qui lance le jeu. \ No newline at end of file -- GitLab