001 package rules;
002
003 import java.util.*;
004
005 import core.*;
006
007 /**
008 * Knight piece.
009 */
010
011 public class Knight extends Piece
012 {
013
014 protected String getName()
015 {
016 return "N";
017 }
018
019 public Knight(Color color, int lastMove)
020 {
021 super(color, lastMove);
022 }
023
024 public String pieceString()
025 {
026 return "knight";
027 }
028
029 /**
030 * @see Piece
031 */
032 public Collection<Move> moveCandidates(GameState g, Position here)
033 {
034 Board board = g.getBoard();
035 Collection<Move> answer = new ArrayList<Move>();
036 int x = here.getX();
037 int y = here.getY();
038 int nx, ny;
039 for (int dx = -2; dx <= 2; dx++)
040 {
041 for (int dy = -2; dy <= 2; dy++)
042 {
043 if (Math.abs(dx * dy) != 2)
044 continue;
045 nx = x + dx;
046 ny = y + dy;
047 if (Position.isValid(nx, ny)) {
048 if (board.get(nx, ny).getColor() != getColor()) {
049 Position newPos = Position.get(nx, ny);
050 answer.add(new Move(here, newPos));
051 }
052 }
053 }
054 }
055 return answer;
056 }
057
058 /**
059 * @returns whether any piece of this type and a color
060 * threatens a given position pos.
061 * @requires g, from, to != null
062 */
063 public static boolean threatens(GameState g, Color c, Position pos)
064 {
065 Board board = g.getBoard();
066 int x = pos.getX(), y = pos.getY();
067 //Knight
068 for(int dx = -2; dx <= 2; dx++){
069 if (dx == 0)
070 continue;
071 for(int k = -1; k <= 1; k += 2){
072 int dy = k * (3 - Math.abs(dx));
073 if (!Position.isValid(x+dx, y+dy))
074 continue;
075 Piece p = board.get(x+dx, y+dy);
076 if (p.getColor() == c &&
077 p instanceof Knight)
078 return true;
079 }
080 }
081 return false;
082 }
083
084 public int hashCode() {
085 return 2*4 + (color == Color.WHITE ? 0 : 1);
086 }
087 }