hcheckers-0.1.0.2: src/Rules/Russian.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeFamilies #-}
module Rules.Russian (
Russian, russian, russianBase
) where
import Data.Typeable
import Core.Types
import Core.Board
import Core.Evaluator
import Rules.Generic
-- import Debug.Trace
newtype Russian = Russian GenericRules
deriving (Typeable, HasBoardOrientation)
instance Show Russian where
show = rulesName
instance HasTopology Russian where
boardTopology _ = Diagonal
instance GameRules Russian where
type EvaluatorForRules Russian = SimpleEvaluator
initBoard rnd r = board8 rnd r
boardSize _ = (8, 8)
initPiecesCount _ = 24
boardNotation _ = chessNotation
dfltEvaluator r = defaultEvaluator r
parseNotation _ = parseChessNotation
rulesName _ = "russian"
possibleMoves (Russian rules) side board = gPossibleMoves rules side board
mobilityScore (Russian rules) side board = gMobilityScore rules side board
updateRules r _ = r
getGameResult = genericGameResult
pdnId _ = "25"
getAllAddresses r = addresses8 r
russianBase :: GenericRules -> GenericRules
russianBase =
let rules this = (abstractRules this) {
gManCaptures = manCaptures this
}
in rules
russian :: Russian
russian = Russian $
let rules = russianBase rules
in rules
manCaptures :: GenericRules -> CaptureState -> [PossibleMove]
manCaptures rules ct@(CaptureState {..}) =
let captures = gPieceCaptures1 rules ct
-- when last horizontal reached, pass promoted piece to
-- next moves check; so it will continue capture as a king
-- if it can
nextMoves pm = genericNextMoves rules ct True pm
in concat $ flip map captures $ \capture ->
let [move1] = translateCapture ctPiece capture
moves2 = nextMoves move1
in if null moves2
then [move1]
else [catPMoves move1 move2 | move2 <- moves2]