Generate random chess position: Difference between revisions

Content added Content deleted
Line 704: Line 704:
replaceSquareByPos ((ChessPiece King Black), p2) b)
replaceSquareByPos ((ChessPiece King Black), p2) b)


placePawns :: PieceColor -> ChessBoard -> IO ChessBoard
placePawns :: ChessBoard -> IO ChessBoard
placePawns c b = num >>= go b
placePawns b = num >>= go b
where go :: ChessBoard -> Int -> IO ChessBoard
where go :: ChessBoard -> Int -> IO ChessBoard
go b'' 0 = pure b''
go b'' 0 = pure b''
go b'' n = do
go b'' n = do
p <- randomPos b''
pos <- randomPos b''
pawn@(ChessPiece _ color) <- randomPawn
if promoted c == snd p || isPosOccupied p b''
|| enpassant c == snd p || firstPos c == snd p
if promoted color == snd pos || isPosOccupied pos b''
|| enpassant color == snd pos || firstPos color == snd pos
then go b'' n
then go b'' n
else
else
go (replaceSquareByPos ((ChessPiece Pawn c), p) b'') (pred n)
go (replaceSquareByPos (pawn, pos) b'') (pred n)
promoted White = 8
promoted White = 8
promoted Black = 1
promoted Black = 1
Line 723: Line 724:


num :: IO Int
num :: IO Int
num = getStdRandom (randomR (1,8))
num = getStdRandom (randomR (1,16))

randomPawn :: IO Square
randomPawn = ChessPiece Pawn <$> rColor
where rColor :: IO PieceColor
rColor = getStdRandom (random)


placeRemaining :: ChessBoard -> IO ChessBoard
placeRemaining :: ChessBoard -> IO ChessBoard
Line 786: Line 792:
main =
main =
placeKings emptyBoard >>=
placeKings emptyBoard >>=
placePawns White >>=
placePawns >>=
placePawns Black >>=
placeRemaining >>=
placeRemaining >>=
draw</lang>
draw</lang>