import java.awt.*; import java.awt.event.*; public class Move { //basic set of variables public int srccol = 0; public int srcrow = 0; public int destcol = 0; public int destrow = 0; public int victcol = 0; public int victrow = 0; public int prtnrcol = 0; public int prtnrrow = 0; public int bencol = 0; //"beneficiary" if the enemy pawn which this move public int benrow = 0; //did not capture en passe and which has thus changed its enpasse status to false public int transforms = 0; // 1,2,3,4 - queen/rook/bishop/knight public int castle = 0; //1,2 - short/long public boolean enpasse = false; //does this move capture a pawn en passe? public boolean check = false; public boolean doublecheck = false; public boolean checkmate = false; public boolean stalemate = false; public String srcname = null; //"king/queen/rook/bishop/knight/pawn" public String srcowner = null; //"white/black" public boolean srcenpasse = false; //was the source piece vulnerable to enpasse? public boolean srccancastle = false; //was the source piece in pa position to castle? public String victname = null; //"king/queen/rook/bishop/knight/pawn" public String victowner = null; //"white/black" public boolean victenpasse = false; //was the victim piece vulnerable to enpasse? public boolean victcancastle = false; //was the victim piece in pa position to castle? //auxiliary set 1 public Square srcsqr = null; public Square destsqr = null; public Square victsqr = null; public Square prtnrsqr = null; //auxiliary set 2 public Piece srcpiece = null; public Piece victpiece = null; public Piece prtnrpiece = null; //auxiliary set 3 public Field srcfld = null; public Field destfld = null; public Field victfld = null; public Field prtnrfld = null; //fot easier analysis public double estimate = -1000; public Move() {clear();} public Move(Move m) { srccol = m.srccol; srcrow = m.srcrow; destcol = m.destcol; destrow = m.destrow; victcol = m.victcol; victrow = m.victrow; prtnrcol = m.prtnrcol; prtnrrow = m.prtnrrow; bencol = m.bencol; benrow = m.benrow; transforms = m.transforms; castle = m.castle; enpasse = m.enpasse; check = m.check; checkmate = m.checkmate; stalemate = m.stalemate; srcsqr = m.srcsqr; destsqr = m.destsqr; victsqr = m.victsqr; prtnrsqr = m.prtnrsqr; srcfld = m.srcfld; destfld = m.destfld; victfld = m.victfld; prtnrfld = m.prtnrfld; srcpiece = m.srcpiece; victpiece = m.victpiece; prtnrpiece = m.prtnrpiece; srcname = (m.srcname == null) ? null : new String(m.srcname); srcowner = (m.srcowner == null) ? null : new String(m.srcowner); srcenpasse = m.srcenpasse; srccancastle = m.srccancastle; victname = (m.victname == null) ? null : new String(m.victname); victowner = (m.victowner == null) ? null: new String(m.victowner); victenpasse = m.victenpasse; victcancastle = m.victcancastle; } //set check and add doublecheck if one check already exists public void addCheck() { if (check == true) doublecheck = true; else check = true; } //knowing only srccol,srcrow,destcol,destrow public boolean buildMoveFromSrcAndDest(Position p) { srcsqr = p.square[srccol][srcrow]; destsqr = p.square[destcol][destrow]; srcpiece = srcsqr.piece; //is this move self-consistent? if (!PositionAnalysis.checkConsistency(this,p)) return false; //establish castle PositionAnalysis.establishCastle(this,p); //we don't get transformation piece because computer will think it up //establish enpasse status of the move PositionAnalysis.establishEnpasseStatus(this,p); //establish victim attributes PositionAnalysis.establishVictim(this,p); //set src and victim pieces' characteristics PositionAnalysis.establishSourceAttributes(this); PositionAnalysis.establishVictimAttributes(this); //establish beneficiary, if any PositionAnalysis.establishBeneficiary(this,p); //is this move valid, i.e. made according to the rules? if (!PositionAnalysis.checkValidity(this,p)) return false; //is this move possible, i.e. does it expose my king to check? if (!PositionAnalysis.checkPossibility(this,p)) return false; //establish if it's a check, or doublecheck PositionAnalysis.establishMoveResults(this,p); return true; } //assumes: srccol,srcrow,destcol,destrow are set public boolean buildMoveFromSrcAndDest(Chess c) { srcfld = c.field[srccol][srcrow]; destfld = c.field[destcol][destrow]; srcsqr = c.curPos.square[srccol][srcrow]; destsqr = c.curPos.square[destcol][destrow]; srcpiece = srcfld.piece; //is this move self-consistent? if (!PositionAnalysis.checkConsistency(this,c)) return false; //establish castle PositionAnalysis.establishCastle(this,c); //get transformation piece, if necessary if (Chessboard.withinPawnRange(new Square(srccol,srcrow),new Square(destcol,destrow),srcpiece.owner)) Chess.establishTransformation(this); //establish enpasse status of the move PositionAnalysis.establishEnpasseStatus(this,c); //establish victim attributes PositionAnalysis.establishVictim(this,c); //set src and victim pieces' characteristics PositionAnalysis.establishSourceAttributes(this); PositionAnalysis.establishVictimAttributes(this); //establish beneficiary, if any PositionAnalysis.establishBeneficiary(this,c); //is this move valid, i.e. made according to the rules? if (!PositionAnalysis.checkValidity(this,c.curPos)) return false; //is this move possible, i.e. does it expose my king to check? if (!PositionAnalysis.checkPossibility(this,c.curPos)) return false; //establish if it's a check, or doublecheck PositionAnalysis.establishMoveResults(this,c.curPos); return true; } public void produceAuxiliaryVariables(Position p) { //at least source and destination should be known if (srcrow == 0 || srccol == 0 || destrow == 0 || destcol == 0) return; //set 1 srcsqr = p.square[srccol][srcrow]; destsqr = p.square[destcol][destrow]; if (victcol != 0 && victrow != 0) victsqr = p.square[victcol][victrow]; if (prtnrcol != 0 && prtnrrow != 0) prtnrsqr = p.square[prtnrcol][prtnrrow]; //set 2 srcpiece = srcsqr.piece; if (victsqr != null) victpiece = victsqr.piece; if (prtnrsqr != null) prtnrpiece = prtnrsqr.piece; } public void produceAuxiliaryVariables(Chess c) { //at least source and destination should be known if (srcrow == 0 || srccol == 0 || destrow == 0 || destcol == 0) return; //set 3 srcfld = c.field[srccol][srcrow]; destfld = c.field[destcol][destrow]; if (victcol != 0 && victrow != 0) victfld = c.field[victcol][victrow]; if (prtnrcol != 0 && prtnrrow != 0) prtnrfld = c.field[prtnrcol][prtnrrow]; //set 2 srcpiece = srcfld.piece; if (victfld != null) victpiece = victfld.piece; if (prtnrfld != null) prtnrpiece = prtnrfld.piece; } public void clear() { srccol = 0; srcrow = 0; destcol = 0; destrow = 0; victcol = 0; victrow = 0; prtnrcol = 0; prtnrrow = 0; bencol = 0; benrow = 0; transforms = 0; castle = 0; enpasse = false; check = false; checkmate = false; stalemate = false; srcsqr = null; destsqr = null; victsqr = null; prtnrsqr = null; srcpiece = null; victpiece = null; prtnrpiece = null; srcfld = null; destfld = null; victfld = null; prtnrfld = null; srcname = null; srcowner = null; srcenpasse = false; srccancastle = false; victname = null; victowner = null; victenpasse = false; victcancastle = false; } //"promise" of the move from general positional considerations public double positionalMerit() { double merit = 0; if (check) merit += 0.2; if (doublecheck) merit += 0.1; if (castle != 0) merit += 0.15; if (srcpiece.name.equals("pawn")) { if (srccol == 3 || srccol == 6) merit += 0.02; if (srccol == 4 || srccol == 5) merit += 0.05; if (srcpiece.owner.equals("white") && destrow == 6) merit +=0.05; if (srcpiece.owner.equals("white") && destrow == 7) merit += 0.1; if (srcpiece.owner.equals("black") && destrow == 3) merit +=0.05; if (srcpiece.owner.equals("black") && destrow == 2) merit += 0.1; if (enpasse) merit += 0.1; } if (srcpiece.name.equals("king")) { if (castle == 0) merit -= 0.05; } return merit; } public String toString() { if (srcsqr == null && srcfld == null) return ("invalid move: srcsqr/srcfld==null"); if (destsqr == null && destfld == null) return ("invalid move: destsqr/destfld==null"); if (srcpiece == null) return ("invalid move: srcpiece==null"); String str = ""; if (castle == 1) str = str + "0-0"; else if (castle == 2) str = str + "0-0-0"; else { str = str + srcpiece.abbreviation(); str = str + srcsqr.coords(); if (victpiece == null) str = str + "-"; else str = str + ":"; str = str + destsqr.coords(); if (transforms != 0) { if (transforms == 1) str = str + "Q"; if (transforms == 2) str = str + "R"; if (transforms == 3) str = str + "B"; if (transforms == 4) str = str + "Kt"; } } if (check == true) str = str + "+"; else if (checkmate == true) str = str + "X"; if (stalemate == true) str = str + "stalemate"; return str; } }