Implement reverse engineering of castling

pull/1/merge
Thibault Duplessis 2012-03-05 22:28:02 +01:00
parent ee71e36c3a
commit 4f48bef2d3
2 changed files with 15 additions and 3 deletions

View File

@ -1,5 +1,8 @@
package lila.chess
import Pos.posAt
// does not support chess960 castles!
final class ReverseEngineering(fromGame: Game, to: Board) {
val from = fromGame.board
@ -7,11 +10,20 @@ final class ReverseEngineering(fromGame: Game, to: Board) {
def move: Option[(Pos, Pos)] =
if (from.pieces == to.pieces) None else findMove
private def findMove: Option[(Pos, Pos)] = {
private def findMove: Option[(Pos, Pos)] =
findMovedPieces match {
case List((pos, piece)) findPieceNewPos(pos, piece) map { np (pos, np) }
case _ None
case List((pos1, piece1), (pos2, piece2)) if (piece1 is King) && (piece2 is Rook)
findCastle(pos2) map { np (pos1, np) }
case List((pos1, piece1), (pos2, piece2)) if (piece1 is Rook) && (piece2 is King)
findCastle(pos1) map { np (pos2, np) }
case _ None
}
private def findCastle(rookPos: Pos): Option[Pos] = rookPos.x match {
case 1 posAt(3, rookPos.y)
case 8 posAt(7, rookPos.y)
case _ None
}
private def findPieceNewPos(pos: Pos, piece: Piece): Option[Pos] = for {

View File

@ -10,7 +10,7 @@ sealed trait Side {
object Side {
lazy val all = List(KingSide, QueenSide)
val all = List(KingSide, QueenSide)
def kingRookSide(kingPos: Pos, rookPos: Pos): Option[Side] =
if (kingPos.y == rookPos.y)