Re: [Haskell-beginners] Chessboard Module, opinions on…

Andy Elvey andy.elvey at paradise.net.nz
Wed Oct 28 04:23:49 EDT 2009


iæfai wrote:
>
> I have just recently finished a 'ChessBoard' module that is meant to 
> represent a chess board. I could use some opinions and/or suggestions 
> on the module.
>
> To give an example of how this can be used right now, and was my 
> immediate goal, you can do this:
>
> *ChessBoard> putStr $ cout defaultBoard
> +----+----+----+----+----+----+----+----+
> | RB | NB | BB | QB | KB | BB | NB | RB |
> +----+----+----+----+----+----+----+----+
> | PB | PB | PB | PB | PB | PB | PB | PB |
> +----+----+----+----+----+----+----+----+
> |    |    |    |    |    |    |    |    |
> +----+----+----+----+----+----+----+----+
> |    |    |    |    |    |    |    |    |
> +----+----+----+----+----+----+----+----+
> |    |    |    |    |    |    |    |    |
> +----+----+----+----+----+----+----+----+
> |    |    |    |    |    |    |    |    |
> +----+----+----+----+----+----+----+----+
> | PW | PW | PW | PW | PW | PW | PW | PW |
> +----+----+----+----+----+----+----+----+
> | RW | NW | BW | QW | KW | BW | NW | RW |
> +----+----+----+----+----+----+----+----+
>
> I have not determined exactly how I will be making moves, but the 
> logic will not be in my program. I am going to be using a chess engine 
> in another process (I haven't chosen a chess engine yet that works on 
> both windows and mac through stdin/stdout).
>
> The module itself follows, I appreciate any thoughts you might have.
>
>
> module ChessBoard where
>
> import Data.Sequence
> import Data.Foldable
> import Data.Maybe
> import Data.List as List
>
> class NiceLook a where
>     cout :: a -> String
>
>
> data Piece = Bishop | Rook | Knight | King | Queen | Pawn | NoPiece
>     deriving (Show, Eq)
>
> instance NiceLook Piece where
>         cout Bishop = "B"
>         cout Rook   = "R"
>         cout Knight = "N"
>         cout Queen  = "Q"
>         cout Pawn   = "P"
>         cout King   = "K"
>         cout _      = " "
>
> data Colour = Black | White | NoColour
>     deriving (Show, Eq)
>
> instance NiceLook Colour where
>         cout Black = "B"
>         cout White = "W"
>         cout NoColour = " "
>
>         -- error "..." might be useful
>
> data Square = Square Piece Colour
>     deriving (Show, Eq)
>
> instance NiceLook (Square) where
>         cout (Square p c) = (cout p) ++ (cout c)
>
> data Row = Row (Seq Square)
>     deriving (Show, Eq)
>
> instance NiceLook (Row) where
>         cout (Row s) = "|" ++ foldMap (\x -> " " ++ cout x ++ " |") 
> s       -- thnx Saizan
>
> makeRow n = case (List.length n) of
>                 8 -> Row (fromList n)
>                 _ -> error "Row is not 8 squares"
>
> makeColouredSquares n c = makeRow $ map makeSquare (zip n (replicate 8 
> c))
>
> makeSquare (n,c) = Square n c
>
> pawns = [Pawn, Pawn, Pawn, Pawn, Pawn, Pawn, Pawn, Pawn]
> back = [Rook, Knight, Bishop, Queen, King, Bishop, Knight, Rook]
> blank = [NoPiece, NoPiece, NoPiece, NoPiece, NoPiece, NoPiece, 
> NoPiece, NoPiece]
>
> data Board = Board (Seq Row)
>     deriving (Show, Eq)
>
> instance NiceLook (Board) where
>     cout (Board c) = borderOutput ++ "\n" ++ (foldMap (\x -> cout x ++ 
> "\n" ++ borderOutput ++ "\n") c)
>
> defaultBoard = Board (makeColouredSquares back Black <|
>                       makeColouredSquares pawns Black <|
>                       makeColouredSquares blank NoColour <|
>                       makeColouredSquares blank NoColour <|
>                       makeColouredSquares blank NoColour <|
>                       makeColouredSquares blank NoColour <|
>                       makeColouredSquares pawns White <|
>                       makeColouredSquares back White <| empty)
>
>
> borderOutput = "+" ++ (List.foldr1 (++) $ replicate 8 "----+")
>
>
Hi iæfai! 
This is great!  Very nicely done! 

I was just wondering - I potter around with crosstab code in several 
programming languages, and this (the table-creation code in particular) 
could be quite handy in that area.  So, would you mind if I used this?  
I'll give credit of course! 
Many thanks for posting this neat bit of code! 
 - Andy



More information about the Beginners mailing list