2015-10-30 143 views
0

我正在嘗試在Haskell中製作遊戲。現在,我正在研究敵方碰撞:即如果敵人與玩家發生衝突,則得分會重置爲0,敵人就會死亡。但是,我只是不能完全工作,如何更改遞歸函數中的變量

我已經考慮過一個do塊,但這是不正確的(我不想返回IO)。我找不到任何點我在正確的方向,使我懷疑,如果它甚至有可能...

的(那種醜陋的)的代碼我是這樣的:

newEnemies = updateEnemies enemies 
    updateEnemies :: [Point] -> [Point] 
    updateEnemies [] = [] 
    updateEnemies (x:xs) | hitPlayer (nextLocation x) = -- TODO: Reset multipliers 
                 updateEnemies xs 
         | otherwise = nextLocation x : updateEnemies xs 
     where 
     hitPlayer :: Point -> Bool 
     hitPlayer (x, y) | abs (fst newPosition - x) < 10 && abs (snd newPosition - y) < 10 
          = True 
         | otherwise = False 
     nextLocation loc = (loc + ((dirToPlayer loc) * (100, 100) * (timeStep, timeStep))) 
     dirToPlayer loc = normalizeV (playerPosition - loc) 

你們中的一個人能否指出我的方向是正確的,還是我習慣了命令式語言?

謝謝!

+2

如果你的功能沒有返回分數,你如何期望它重置分數?如果你想重構那麼我建議你使用一個狀態monad。相反,如果你想從你當前的代碼中增加進度,那麼考慮做'updateEnemies :: Score - > [Point] - >(Score,[Point])''。在命中的情況下,你返回'(0,updateEnemies xs)'。 –

+0

那麼,我正在嘗試做什麼不起作用?我很害怕。無論如何,我會嘗試一些其他的東西! – AwesomeUnicorn

回答

1

全部updateEnemies實際上是將nextLocation應用到輸入列表的每個元素,然後丟棄hitPlayer的每個元素。主體因此可以簡化爲:

updateEnemies xs = filter (not . hitPlayer) $ map nextLocation xs 

,或者,如果你喜歡的東西多點,免費電話:

updateEnemies = filter (not . hitPlayer) . map nextLocation 

此外,通過使用保護定義hitPlayer來決定是否返回TrueFalse是錯的;其他語言的等效錯誤將寫入if (condition) return true; else return false;。直接返回測試結果!

hitPlayer (x, y) = abs (fst newPosition - x) < 10 && abs (snd newPosition - y) < 10