Haskell中的Nim:用于创建电路板的递归函数

Haskell中的Nim:用于创建电路板的递归函数,haskell,recursion,Haskell,Recursion,我正在使用haskell创建一个名为nim的游戏。简短地总结一下游戏: 通过拨打nim,然后拨打一个最多9的号码,我为游戏创建了棋盘: >> nim 3 这是工作,因为它应该。游戏如下:你可以移除任意行中任意数量的星星,但你必须移除至少一颗星星。不能在同一回合中删除第1行和第2行中的星星。移除最后一颗星的人获胜 好的,所以游戏按它应该的方式进行,但是当我在每次回合后打印棋盘时会出现问题 假设我有上面的电路板,并输入删除1(从第1行删除1颗星) 这就是我得到的: 0 2 * * 3

我正在使用haskell创建一个名为nim的游戏。简短地总结一下游戏: 通过拨打nim,然后拨打一个最多9的号码,我为游戏创建了棋盘:

>> nim 3
这是工作,因为它应该。游戏如下:你可以移除任意行中任意数量的星星,但你必须移除至少一颗星星。不能在同一回合中删除第1行和第2行中的星星。移除最后一颗星的人获胜

好的,所以游戏按它应该的方式进行,但是当我在每次回合后打印棋盘时会出现问题

假设我有上面的电路板,并输入删除1(从第1行删除1颗星)

这就是我得到的:

0 
2 * *
3 * * *
  1 2 3
0仍应为1

这些是我负责印制电路板的职能
putRow
获取行号和星号。这两个参数是相同的,但是我没有把函数改为只接受1

putBoard
获取代表游戏棋盘的列表。putBoard[1,2,3]根据上面的游戏创建棋盘。我在第一个元素中运行putStr,然后在列表的其余部分递归调用putRow

putRow :: Int -> Int -> IO ()
putRow row num = do putStr (show row)
                    putStr " "
                    putStrLn (concat (replicate num "* "))

putBoard :: Board -> IO ()
putBoard (x:xs) =    putRow x x >> putBoard xs
putBoard [] = putStr " 1 2 3"
putBoard[]
稍后将被替换以在板下创建列编号,但这是以后的事情。现在它只是一个字符串,只适用于boardsize 3的游戏

这是一个函数,用于在指定行和星号时处理移动

move :: Board -> Int -> Int -> Board
move board row num = [update r n | (r, n) <- zip [1..] board]
   where update r n = if r == row then (n - num) else n
move::Board->Int->Int->Board

move board row num=[update r n |(r,n)您的函数
putRow
接受两个参数:行号
row
,以及该行中的星号
num

当您从
putBoard
调用该函数时,您正在为
行和
num
传递相同的
x

putRow x x
所以,难怪左边的数字与星星的数目相匹配

您需要做的是为
num
传递
x
(即星星数),但为
行传递行的实际索引

putRow idx x
但是从哪里获得
idx
?好吧,让我们看看:第一次调用
putBoard
idx
将是
1
。然后每次递归调用
putBoard
,这将打印下一行,因此
idx
应该增加1。让我们记下:

putBoard :: Int -> Board -> IO ()
putBoard idx (x:xs) = putRow idx x >> putBoard (idx+1) xs
putBoard idx [] = putStr " 1 2 3"
但是现在,无论谁调用
putBoard
,都必须提供首字母
1

putBoard 1 board
这有点不方便,所以您可以将其封装在如下的内部函数中:

putBoard :: Board -> IO ()
putBoard = go 1
  where
    go idx (x:xs) = putRow idx x >> go (idx+1) xs
    go idx [] = putStr " 1 2 3"

我是haskell的新手,目前正在制作一个类似的游戏。我试过运行你的代码,但是如何运行移动功能?棋盘的类型是什么?
putBoard :: Board -> IO ()
putBoard = go 1
  where
    go idx (x:xs) = putRow idx x >> go (idx+1) xs
    go idx [] = putStr " 1 2 3"