如何在不完成循环的情况下进入或退出循环? (LUA)

时间:2016-02-29 19:37:44

标签: loops lua

我想为OpenComputers(minecraft mod)编写一个Mancala游戏,它使用Lua。然而,Mancala需要在它的中间进入主循环(六个罐子可供选择),从中间退出循环(将你的最后一块石头放在空锅中),然后从循环内进入循环(放置)在锅里的最后一块石头,必须拿起那个锅里的所有石头)。

我可以轻松地在侧面做mancalas,使用布尔值来播放玩家,以及if语句。

对于那些不熟悉Mancala的人,我有一个快速的流程图来解释我的问题:http://imgur.com/WubW1pC

我有一个想法是像这样的伪代码:

declare pots1[0,4,4,4,4,4,4], pots2[0,4,4,4,4,4,4] //pots1[0] and pots2[0] are that player's mancala

function side1(pot,player) //pot is the pot chosen by the player
    declare stones = pots1[pot]
    pots1[pot] = 0

    do
        pot = pot + 1
        stones = stones - 1
        pots1[pot] = pots1[pot] + 1
    while stones > 0 and pot < 6

    if pot == 6 and stones > 0 and player //If stones were dropped in pot 6 and player1 is playing, drop stone in his mancala
        pots1[0] = pots1[0] + 1
        stones = stones - 1

    if stones == 0 //If player1 is out of stones, check the pot for more stones. Pick up all stones in pot and continue.
        if pots1[pot] > 1

我不知道从哪里开始。

2 个答案:

答案 0 :(得分:1)

在您描述时退出并进入循环的唯一方法是使用Lua协同程序的yieldresume方法。 coroutine.yield允许您退出当前的协同程序/函数,但完全按原样保留其状态,因此后续coroutine.resume调用将从执行yield的确切位置继续。 yield也可以返回值,resume可以提供值,这样可以构建比从特定点恢复执行更复杂的逻辑。

您可以查看Chapter 9 in Programming in Lua以了解有关协同程序的详细信息。

答案 1 :(得分:0)

我不打算检讨Mancala的实施情况, 关于退出循环,如打破&#39;逻辑,

你可以用旧的方式做到:

function(stones, pot)    
    shouldIterate = true    
    while stones > 0 and shouldIterate do
        if pot == 6 then
            shouldIterate = false
        end
        pot = pot + 1
    end
end