001 package rules; 002 003 import java.util.*; 004 005 import core.Color; 006 import core.Move; 007 import core.Piece; 008 import core.Position; 009 010 011 /** 012 * Pawn piece. 013 */ 014 public class Pawn extends Piece 015 { 016 017 protected String getName() 018 { 019 return "P"; 020 } 021 022 public String pieceString() 023 { 024 return "pawn"; 025 } 026 027 public Pawn(Color color, int lastMove) 028 { 029 super(color, lastMove); 030 } 031 032 /** 033 * @see Piece 034 */ 035 public Collection<Move> moveCandidates(GameState g, Position here) 036 { 037 Board board = g.getBoard(); 038 Collection<Move> answer = new ArrayList<Move>(); 039 int x = here.getX(); 040 int y = here.getY(); 041 int direction = getColor() == Color.WHITE ? 1 : -1; 042 int end = getColor() == Color.WHITE ? 7 : 0; 043 if (board.get(x, y+direction).getColor() == Color.NONE) 044 { 045 Position newPos = Position.get(x, y + direction); 046 answer.add(new Move(here, newPos)); 047 if (y == 7 - end + direction && getLastMove() == 0) { 048 if (board.get(x, y+2*direction).getColor() == Color.NONE) { 049 newPos = Position.get(x, y + 2 * direction); 050 answer.add(new Move(here, newPos)); 051 } 052 } 053 } 054 for (int dx = -1; dx <= 1; dx += 2) 055 { 056 if(!Position.isValid(x+dx, y+direction)) 057 continue; 058 Piece p = board.get(x+dx, y+direction); 059 if (p.getColor() == getColor().otherColor()) { 060 answer.add(new Move(here, Position.get(x + dx, y + direction))); 061 } 062 063 // Check for en passant 064 if (y == end - 3 * direction) { 065 Piece otherPawn = board.get(x+dx, y); 066 if (otherPawn instanceof Pawn 067 && otherPawn.getColor() == getColor().otherColor() 068 && otherPawn.getLastMove() == g.getMoveNum()) { 069 Move m = new Move(here, Position.get(x + dx, y + direction)); 070 answer.add(m); 071 } 072 } 073 } 074 return answer; 075 } 076 077 /** 078 * @see Piece 079 */ 080 public static boolean threatens(GameState g, Color color, Position pos) 081 { 082 Board board = g.getBoard(); 083 int x = pos.getX(), y = pos.getY(); 084 //Pawn 085 int dy = (color == Color.WHITE ? -1 : 1); 086 for(int dx = -1; dx <= 1; dx += 2){ 087 if (!Position.isValid(x+dx, y+dy)) 088 continue; 089 Piece p = board.get(x+dx, y+dy); 090 if (p.getColor() == color && 091 p instanceof Pawn) 092 return true; 093 } 094 return false; 095 } 096 097 public int hashCode() { 098 return 2*5 + (color == Color.WHITE ? 0 : 1); 099 } 100 }