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