【问题标题】:Draw squares for a game board in haskell在haskell中为游戏板绘制正方形
【发布时间】:2017-07-08 00:37:18
【问题描述】:

我希望能够使用 Haskell 和 Gloss 绘制象棋盘之类的东西。

我可以用任何其他语言做类似的事情

for( i=0; i < 10; i++){
   for( j=0; j < 10; j++){
      drawSquare(radius, i, j)
    }
}

就是这样,但我是haskell的新手,我不知道如何做到这一点。我正在使用 Gloss 并且可以手动绘制东西,但我希望能够在绘制 100 个正方形之前以程序方式创建它们,而不是 1 比 1。

【问题讨论】:

    标签: haskell draw gloss


    【解决方案1】:

    虽然我不熟悉光泽库,但您可能正在寻找类似列表理解的东西:

    drawBoard :: Int -> Int -> IO ()
    drawBoard w h = sequence_ [drawSquare radius i j | i <- [0 .. w], j <- [0 .. h]]
    

    【讨论】:

    • 我喜欢这种风格来定义范围并将其分配给变量。在光泽中,它看到您必须绘制“图片”才能发送到渲染器,所以它最终看起来像这样: squares :: Picture squares = Pictures [ (translate x y $ rectangleSolid 1 1) | x
    • Nitpick:这需要将 sequence_ 应用于 IO 操作列表。
    【解决方案2】:

    如果您在 IO monad 中工作,则可以使用相同的样式。比如

    printSquares :: IO ()
    printSquares =
       forM_ [0..9] $ \x ->
          forM_ [0..9] $ \y -> do
             putStrLn "Here's a square!"
             putStrLn ("Square(" ++ show x ++ ", " ++ show y ++ ")")
             -- add here the actual drawing Gloss commands
    

    我不熟悉 Gloss 来建议实际的绘图命令。


    更新:看起来 Gloss 的接口与使用 IO 的接口不同。你可能需要类似的东西

    squares :: Picture
    squares = Pictures [ square x y | x<-[0..9], y<-[0..9] ]
    
    square :: Float -> Float -> Picture
    square x y = Polygon [(x,y), (x+1,y), (x+1,y+1), (x,y+1) ]
       -- even better: use rectangleWire and then translate
       -- rectangleUpperWire also seems useful
    

    【讨论】:

    • 哦,我不知道你可以使用相同的样式,我会尝试。
    • @ZloySmiertniy 实际上,我不确定 Gloss 界面。也许这个答案完全偏离了轨道。也许在 Gloss 中,您必须将图像表示为形状列表/树。
    • 是的,我似乎必须创建一个图片,就像在这篇文章 andrew.gibiansky.com/blog/haskell/haskell-gloss 中一样,我无法弄清楚如何制作一个可变长度尺寸和颜色的板。样式 "[ square x y | x
    • 知道了!我做了一个像这样正方形的图片 :: 图片正方形 = 图片 [ (translate x y $ rectangleSolid 1 1) | x
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多