gpt4 book ai didi

haskell - Haskell 中的游戏

转载 作者:行者123 更新时间:2023-12-02 04:08:55 26 4
gpt4 key购买 nike

我一直在尝试用 Haskell 制作游戏,但在途中遇到了一些问题。
首先,这是所有这些的输出:

Main> symbol 3  
1: *
2: **
3: ***

First Player
Line: 3
Symbols: 2

1: *
2: **
3: *

Second Player
Line: 1
Symbols: 1

1:
2: **
3: *

First Player
Line: 3
Symbol: 1

1:
2: **
3:

Second Player
Line: 2
Symbols: 2

Second Player Wins!

然后,功能:

import System.IO    
import Data.List

--The Game Data Structure

data Player = Player Bool
instance Show Player where
show ( Player False ) = " First "
show ( Player True ) = " Second "
First : : Player
First = Player False
next : : Player −> Player
next ( Player b ) = Player ( not b )

type Symbol = Int
type Line = Int

-- The Function to update the game each time something happens

updateGame :: [ Symbol ] −> Line −> Symbol −> [ Symbol ]
updateGame game line symbol = take ( line − 1) game ++
game !! (line − 1) − symbol : drop line game

getLine : : [ Symbol ] −> IO Line
getLine game = getNumber "Line: "
(\n −> n >= 1 && n <= length game &&
game !! (n − 1) /= 0)

getSymbols : : [ Symbol ] −> Line −> IO Symbol
getSymbols game line = getNumber "Symbols: "
(\n−> n> 0 && n<=game !! (line−1))

endOfGame : : [ Symbol ] −> Bool
endOfGame game = sum gane == 0

symbol :: Int −> IO ()
symbol n = do
winner <− play [1..n] first
putStrLn $ show winner ++ " Player Won! "

我认为我刚刚编写的所有函数都是 100% 正确的,但其中有三个函数我正在努力解决:

getNumber :: String −> (Int −> Bool) −> IO Int  
getNumber = do
num <- fmap read getLine
if num > 0 || num <= (y :: Line)
then return (Just num)
else putStrln "Invalid Number!" >> return Nothing

这个我不确定语法,因为尽管它对我来说有点意义(按代码的逻辑来说),但我不确定它是否做了它应该做的事情。

showGame :: [Symbol] −> IO ()    
play :: [Symbol] −> Player −> IO Player

现在我知道我应该编写一些代码来说明我对正确解决方案的尝试,但是对于这两个函数我完全一无所知。我的意思是,我知道他们应该做什么,但我想我广泛的 java 背景让我的生活每次我在 Haskell 中尝试新东西时都变得痛苦......尽管如此,第一个函数(showGame)应该打印出一个游戏“棋盘” ”,就像我之前展示的那样,但就像下面的函数一样,我不知道如何在 Haskell 中执行行号和符号“增加”,我的意思是,我已经习惯了 for 循环或 while 循环在java中处理这种情况,每次我必须在Haskell中“复制”它时我都会陷入困境。第二个是游戏本身。在java中我会做一个“do..while”循环并完成它,但我不知道它在Haskell中是如何工作的。

如果你们能帮助我,那就太好了,因为我为此付出了很多努力,向很多人寻求帮助和提示,这让我如此接近“结束”,它会就这样留下来完全是浪费时间......

最佳答案

getNumber :: String −> (Int −> Bool) −> IO Int  
getNumber = do

这已经不对了:getNumber 是一个有两个参数的函数,但您不接受任何参数,并尝试立即进入 IO monad1。只需像在任何其他函数中一样匹配参数即可!我想应该是

getNumber question requirement = do

其中问题将是一个提示。接下来,

   if num > 0 || num <= (y :: Line)

y 是什么?我认为您根本不应该在那里进行任何硬编码比较,但使用提供的谓词!

   if requirement num

此外,

      then return $ Just num
else putStrln "Invalid Number!" >> return Nothing

不起作用,因为您必须返回一个Int,签名中没有Maybe。由于您仍然无法接受任何输入,因此您可能需要实现一个循环(即在失败情况下递归)。结果可能是:

askForNumber :: String −> (Int −> Bool) −> IO Int  
askForNumber question requirement = do
putStr question
num <- fmap read getLine
if requirement num
then return num
else do
putStrLn "This does not meet the requirements! Please try again..."
askForNumber question requirement

至于其他函数:showGame 显然足以在屏幕上显示这些 ** 行。这非常简单:您可以使用 replicate n '*' 重新生成 n 个星号列表。由于字符列表是一个字符串,因此您可以简单地 putStrLn 它。

play 需要是一个实际的循环,即在 endOfGame symbolState 为 false 时在最后递归。

<小时/>

1事实上,函数也形成一个 monad,因此原则上可以这样开始定义......但这绝对不是您在这里所追求的。

关于haskell - Haskell 中的游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20204746/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com