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

iæfai iaefai at me.com
Wed Oct 28 11:07:00 EDT 2009


I am not making an AI, I am using an existing AI, so how I store it  
internally will not be of consequence to it.

- iæfai

On 2009-10-28, at 8:00 AM, Andrew Wagner wrote:

> Just a note to let you know: it's virtually impossible to use a  
> linked-list-of-linked-list or two-dimensional-array board  
> representation as the basis of a serious AI. It's just too  
> inefficient (see http://www.cis.uab.edu/hyatt/boardrep.html for some  
> other options).
>
> That said, if you want to use this as the basis of being able to  
> play through games or something, it's great.
>
> On Wed, Oct 28, 2009 at 2:11 AM, Joe Fredette <jfredett at gmail.com>  
> wrote:
> Awesome, have you cabal-ized it? If not, it's pretty simple (look up  
> 'cabal' on the haskellwiki). Then you can upload it to hackage to be  
> toyed with.
>
> One thing that might be a cool direction to go w/ your project  
> (sounds like you intend to make a chess playing program, this is  
> somewhat orthogonal to that goal) is to build a "playback" machine.  
> For instance, I play chess with people by email on a fairly regular  
> basis. Specifically, we submit moves to one another in semi-standard 
> [1] algebraic chess notation. So I might see a game like:
>
>
> 1. Kb3 e5
> 2. d3  d6
> ...
> n. a4->a5 e6->d7
>
> Where the first move is White, moving his knight to B-3, then black  
> moves his pawn from e7 to e5. etc.
> a move followed by a * is a check, followed by two stars is a mate.  
> etc. You can poke at the wiki page for ACN for the appropriate  
> syntax. My suggestion is that- often times we go many days in  
> between moves, and so I don't keep track (in my head) of the last  
> few moves he made, which can sometimes indicate weak points/general  
> strategies. It would be _really_ nice to be able to replay old board  
> positions at will, given this ACN notation of the game. Might be a  
> nice (simple) use case for Parsec, and I imagine that most chess  
> engines will have something like that (assuming they operate on  
> STDIN/OUT) -- even if the syntax may be different. This will give  
> you the "backend" to plug it onto anyway.
>
> Anywho, good luck with your project, it looks nice!
>
> /Joe
>
> PS, Just noticed the little function you use to display the board  
> (and stuff). You may want to poke around the 2d Pretty printers on  
> hackage, they may make it easier/more extensible to render the  
> board. Also, `cout`? Someone's got a bit o' the ++ in 'em... :)
>
>
>
> [1] Okay, we mostly make it up, but it's _consistently_ arbitrary...
>
>
> On Oct 28, 2009, at 1:56 AM, 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 "----+")
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
>



More information about the Beginners mailing list