簡體   English   中英

Haskell紙牌游戲中的不同策略

[英]Different Strategies in a card game in Haskell

我正在為此紙牌游戲(稱為Algo或Coda)編寫不同的AI,目的是使它們彼此對戰。 由於缺乏對Haskell的經驗,我將不同的策略硬性地結合到了代碼上,並且我目前擁有同一游戲的3個版本,但AI的組合有所不同。 讓我舉一個例子。

簡而言之,游戲包括猜測對手的牌,在一個回合中,玩家面對兩到三個選擇的時刻:

  1. 選擇要宣布的卡作為猜測;
  2. 如果猜測是正確的,請選擇繼續猜測或結束輪到他/她;
  3. 當聽到對手的猜測時,從中選擇哪個信息摘要。

假設a1,b1和c1是時刻1的可能動作。類似地,a2,b2和c2是時刻2的,而a3,b3和c3是時刻3的。

在我所有的文件中,我都有一個AI文件,其策略為a1,b1,c1,與AI的策略為a2,b2,c2。 和另外兩個具有不同策略的文件。

但是,我想擁有一個名為“游戲”的模塊,該模塊具有接收各種玩家並根據每個玩家在每個選擇時刻所擁有的策略來運行游戲的功能。

解決這個問題的一個主意是定義數據類型:

data Player = Player {moment1::StateOfTheGame -> Guess, 
                      moment2::StateOfTheGame -> Bool, 
                      moment3::Guess -> EpistemicState}

但是他們我不知道如何定義功能moment1,moment2和moment3。

我的另一個想法是將策略定義為一個類,並為數據類型Player編寫每個策略的實例。 但是我不確定如何闡明這個想法。

我如何擁有一個名為“游戲”的模塊,該模塊具有接收各類玩家並應用每個玩家在每個選擇時刻所具有的策略來運行游戲的功能?

為每種策略制作一個模塊。 從模塊中導出實現播放器所需的功能。 在您的主程序中,創建一個播放器並將傳入的功能傳遞給播放器的構造函數。 程序的其余部分可與播放器一起使用,因此,無論您給函數起什么名字,都可以通過播放器的“界面”訪問它們。 它應該是高階函數的相當直接的應用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM