chessai

college code for ai playing chess in java

git clone https://9o.is/git/chessai.git

commit 105148d8696e0aecb7a3efd36ae0fc506a5fe9a5
parent 044b7a0ebadc99641601159e1078d7f9087d1a5e
Author: Jul <jul@9o.is>
Date:   Sat,  1 Dec 2012 18:53:53 -0500

added rules per piece.

Diffstat:
Msrc/chess/ChessRules.java | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 129 insertions(+), 3 deletions(-)

diff --git a/src/chess/ChessRules.java b/src/chess/ChessRules.java @@ -1,7 +1,6 @@ package chess; -import chess.piece.ChessPiece; -import chess.piece.ChessType; +import chess.piece.*; /** * Check @@ -57,7 +56,13 @@ public class ChessRules { srcHasPiece() && insideBoard() && uninhabitedSpace() && - legalSkip(); + legalSkip() && + validRookMove() && + validKnightMove() && + validBishopMove() && + validQueenMove() && + validKingMove() && + validPawnMove(); } /* @@ -158,4 +163,125 @@ public class ChessRules { } return true; } + + private boolean validRookMove(){ + //Rank must be the same exclusive or file must be the same for a rook to move + final ChessPiece srcPiece = ChessPiece.find(state.get(src)); + final ChessType type = srcPiece.getType(); + if(type==ChessType.ROOK){ + + if(this.src.getRank()==this.dest.getRank()^this.src.getFileNumber()==this.dest.getFileNumber()){ + return true; + } + System.out.println("Rook Move Failed"); + return false; + } + return true; + } + + private boolean validKnightMove(){ + final ChessPiece srcPiece = ChessPiece.find(state.get(src)); + final ChessType type = srcPiece.getType(); + + if(type==ChessType.KNIGHT){ + if(Math.abs(this.src.getRank()-this.dest.getRank())==2&&Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())==1){ + return true; + } + else if(Math.abs(this.src.getRank()-this.dest.getRank())==1&&Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())==2){ + return true; + } + System.out.println("Knight Move Failed"); + return false; + } + return true; + } + + private boolean validPawnMove(){ + final ChessPiece srcPiece = ChessPiece.find(state.get(src)); + final ChessType type = srcPiece.getType(); + + if(type==ChessType.PAWN){ + final ChessPiece destPiece = ChessPiece.find(state.get(dest)); + //Pawn move up one + if (srcPiece.getColor()==ChessColor.WHITE){ + + if(this.src.getRank()+1==(this.dest.getRank())&&this.src.getFileNumber()==this.dest.getFileNumber()){ + return true; + } + //Pawn capture + + if(this.src.getRank()+1==(this.dest.getRank())&&Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())==1&&srcPiece.getColor()!=destPiece.getColor()&&destPiece != ChessPiece.NA){ + return true; + } + } + else{ + + if(this.src.getRank()==(this.dest.getRank()+1)&&this.src.getFileNumber()==this.dest.getFileNumber()){ + return true; + } + //Pawn capture + + if(this.src.getRank()+1==(this.dest.getRank()+1)&&Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())==1&&srcPiece.getColor()!=destPiece.getColor()&&destPiece != ChessPiece.NA){ + return true; + } + } + System.out.println("Pawn Cannot Capture"); + /*Pawns can also move 2 spaces on first turn + *Pawns can also capture en passant + Still functional without these features though*/ + System.out.println("Pawn Move Failed"); + return false; + } + return true; + } + + private boolean validBishopMove(){ + final ChessPiece srcPiece = ChessPiece.find(state.get(src)); + final ChessType type = srcPiece.getType(); + + if(type==ChessType.BISHOP){ + if(Math.abs(this.src.getRank()-this.dest.getRank())==Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())){ + return true; + } + System.out.println("Bishop Move Failed"); + return false; + } + return true; + } + + private boolean validKingMove(){ + final ChessPiece srcPiece = ChessPiece.find(state.get(src)); + final ChessType type = srcPiece.getType(); + + if(type==ChessType.KING){ + if(Math.abs(this.src.getRank())-Math.abs(this.dest.getRank())<2&&Math.abs(this.src.getFileNumber())-Math.abs(this.dest.getFileNumber())<2){ + return true; + } + System.out.println("King Move Failed"); + //Moves that get the king captured are invalid + return false; + } + return true; + } + + private boolean validQueenMove() { + return rook()^bishop(); + } + + private boolean rook() { + if(this.src.getRank()==this.dest.getRank()^this.src.getFileNumber()==this.dest.getFileNumber()){ + return true; + } + System.out.println("Queen Move Failed"); + return false; + } + + private boolean bishop() { + if(Math.abs(this.src.getRank()-this.dest.getRank())==Math.abs(this.src.getFileNumber()-this.dest.getFileNumber())){ + return true; + } + System.out.println("Queen Move Failed"); + return false; + } + }