我對 Haskell 相當陌生,并試圖創建游戲黑白棋(奧賽羅)的游戲板。此后,我想用它來回傳一個起始玩家和棋盤的初始起始位置。所以兩個問題。
- 生成游戲計劃
我有兩種資料型別用于不同的玩家和可能的動作。
data Player = Black | White
deriving (Eq,Show)
{- Game moves.
Pass represents a passing move. Move i represents a move to field i.
INVARIANT: 0 <= i <= 63 in Move i
-}
data Move = Pass | Move Int
deriving (Eq,Show)
我最初的想法是創建一個關聯串列(字典),其中每個鍵值對構成板上的一個欄位。所以鍵是(0...63),值可以是黑/白或空。但是,不能將 Player 資料型別修改為包括 Empty。
要玩游戲,我需要創建一個函式來回傳啟動的玩家和初始棋盤。起始位置應如下所示:

所以我想我可以使用 Haskell 內置的 Data.Map 創建一個空棋盤,然后創建初始位置,然后將這兩者結合起來,得到一個完整的游戲棋盤和初始位置。
fields :: [Integer]
fields = [x | x <- [1 .. 63]]
type Field = Maybe Player
emptyBoard :: Data.Map.Map Integer (Maybe a)
emptyBoard = Data.Map.fromList (zip fields (repeat Nothing))
startBoard =
Data.Map.fromList
[ (27, White),
(36, White),
(28, Black),
(35, Black)
]
initialBoard = Data.Map.union startBoard emptyBoard
遵循這種對董事會的思考方式:

但是,在 Prelude 中運行它時,我得到:
<interactive>:42:45: error:
* Couldn't match type `Maybe a0' with `Player'
Expected type: Data.Map.Internal.Map k Player
Actual type: Data.Map.Internal.Map k (Maybe a0)
* In the second argument of `Data.Map.Internal.union', namely
`emptyBoard'
In the expression: Data.Map.Internal.union startBoard emptyBoard
In an equation for `initialBoard':
initialBoard = Data.Map.Internal.union startBoard emptyBoard
如何創建與 startBoard 相同型別的 emptyBoard?
- 初始位置
我的第二個問題是創建游戲狀態。所以,像這樣的東西。
-- Board consists of tuples with integers and Player or empty
data Board = Board [(Integer, Field)]
-- type State = () is required to be a type synonym
type State = (Player, Board)
因此,在創建我的函式以生成初始游戲時,使用如下內容:
initial :: Player -> State
initial p = if p == Black then (Black, initialBoard) else (White, initialBoard)
initial 的型別宣告不能更改。盡管如此,我還是收到了智能感知的警告:
? Couldn't match expected type ‘Board’
with actual type ‘Data.Map.Map k0 Player’
? In the expression: initialBoard
所以,總結一下。1)如何生成僅填充中間欄位而其余欄位為空的 startBoard 和 2),包含玩家的初始游戲計劃和棋盤起始位置。
uj5u.com熱心網友回復:
如何生成僅填充中間欄位而其余為空的起始板
你寫的startBoard非常適合這個。不要想太多事情。emptyBoard完全扔掉initialBoard。通過簡單地不包含該鍵來表示空方格Map將比具有映射到的顯式鍵更簡單Nothing。
如何生成包含玩家和棋盤起始位置的初始游戲計劃
雅只是元組他們了。
type State = (Player, Map Integer Player)
initial :: Player -> State
initial p = (p, startBoard)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517114.html
標籤:哈斯克尔
上一篇:我必須在我的Haskell代碼中添加什么才能適用于所有情況?
下一篇:檢查矩陣是否至少有一列和一行
