//public void putOnBoard(Square sq) puts the piece on the given square //Piece is always created with square,field data members equal to null import java.awt.*; import java.util.*; public class Piece { private int shape[][] = null; //shape tells how to draw the piece, 0 -bkgnd, 1 - piece's color private Color color = null; //color with which to draw the piece private Square square = null; //square where the piece stands private Field field = null; //field where the piece is displayed public String name = null; //"king/queen/rook/knight/bishop/pawn" public String owner = null; //"white/black" //makes sense only for pawns public boolean enpasse = false; //can be taken en passe //makes sense only for kings and rooks public boolean cancastle = true; public Piece() {} //default shape and color for this piece public Piece(String own, String nm) { owner = new String(own); name = new String(nm); setShape(name); color = (owner.equals("white")) ? Colors.dwpiece : Colors.dbpiece; } public Piece(String own, String nm, int[][] s, Color c) { owner = own; name = nm; shape = s; color = c; } //take owner,name,shape,color,enpasse,cancastle from Piece parameter public Piece(Piece p) { if (p==null) return; //leave the piece with default(i.e. null) data members shape = p.getShape(); color = p.getColor(); name = p.getName(); owner = p.getOwner(); enpasse = p.enpasse; cancastle = p.cancastle; } public int[][] getShape() {return shape;} public Color getColor() {return color;} public Square getSquare() {return square;} public Field getField() {return field;} public String getName() {return name;} public String getOwner() {return owner;} public void setSquare(Square s) {square = s;} public void setField(Field f) {field = f;} private void setShape(String nm) { if (nm.equals("king")) shape = Shapes.dking; else if (nm.equals("queen")) shape = Shapes.dqueen; else if (nm.equals("rook")) shape = Shapes.drook; else if (nm.equals("bishop")) shape = Shapes.dbishop; else if (nm.equals("knight")) shape = Shapes.dknight; else if (nm.equals("pawn")) shape = Shapes.dpawn; } //piece (it's a pawn) remembers its new name and shape //Note! shape will be actually redrawn only after the call to putOnField()! public void transform(String newPiece) { name = newPiece; setShape(newPiece); } public void transform(int newPiece) { if (newPiece !=1 && newPiece != 2 && newPiece != 3 && newPiece != 4) { System.out.println("cannot transform " + name + " into " + newPiece); return; } switch(newPiece) { case 1: name = "queen"; break; case 2: name = "rook"; break; case 3: name = "bishop"; break; case 4: name = "knight"; break; } setShape(name); } //analytically public void putOnSquare(Square sq) { sq.setPiece(this); //tell this square that I have occupied it if (square != null) square.setPiece(null); //tell previously occupied square that I'm relocating square = sq; //remember where I stand now } //GUI public void putOnField(Field fld) { fld.setPiece(this); //tell this field that I have occupied it; field remembers me and updates image if (field != null) field.setPiece(null); //tell previously occupied field that I'm leaving it field = fld; //remember where I stand now } public double value() { if (name.equals("king")) return 300; if (name.equals("queen")) return 9; if (name.equals("rook")) return 4.5; if (name.equals("bishop")) return 3.1; if (name.equals("knight")) return 3; if (name.equals("pawn")) return 1; return -2; //something's wrong } //1 - greater value that p; -1 - smaller value than p; 0 - equal value public int compare(Piece p) { if (value() > p.value()) return 1; if (value() < p.value()) return -1; return 0; } //1 - greater name that p; -1 - smaller name than p; 0 - equal value //where king > queen > rook > bishop > knight > pawn public int compareName(Piece p) { String n1 = getName(); String n2 = p.getName(); if (n1.equals(n2)) return 0; //htey are the same if (n1.equals("king")) {return 1;} if (n1.equals("queen")) {if (n2.equals("king")) return -1; else return 1;} if (n1.equals("rook")) {if (n2.equals("king") || n2.equals("queen")) return -1; else return 1;} if (n1.equals("bishop")) {if (n2.equals("knight") || n2.equals("pawn")) return 1; else return -1;} if (n1.equals("knight")) {if (n2.equals("pawn")) return 1; else return -1;} if (n1.equals("pawn")) {return -1;} return -2; //something's wrong } public String abbreviation() { if (name.equals("king")) return "K"; if (name.equals("queen")) return "Q"; if (name.equals("rook")) return "R"; if (name.equals("bishop")) return "B"; if (name.equals("knight")) return "Kt"; if (name.equals("pawn")) return ""; return "wrong name"; } //receives a [9][9] array of references to Squares //returns a Vector of moves public Vector possibleMoves (Square[][] s) { Vector temp; //vector of squares if (name.equals("king")) temp = square.kingMoves(s); else if (name.equals("queen")) temp = square.queenMoves(s); else if (name.equals("rook")) temp = square.rookMoves(s); else if (name.equals("bishop")) temp = square.bishopMoves(s); else if (name.equals("knight")) temp = square.knightMoves(s); else if (name.equals("pawn")) temp = square.pawnMoves(s); else temp = new Vector(); //System.out.println("Piece " + abbreviation() + square.coords() + " suggests " + temp.size() + " moves"); return temp; } public String toString() { String str = owner + " " + name + " on " + square.toString(); return str; } }