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

我想为 OpenComputers(Minecraft 模组)编写 Mancala 游戏,并使用 Lua。 然而,Mancala 需要在其中的主循环中进入循环(有六个盆可供选择),在中间退出循环(将最后一个石头放入空盆中),并从循环中进入循环(将最后一个石头放入盆中,必须从该盆中拾起所有石头)。

我可以很容易地使用一个代表哪个玩家在进行的布尔值和 if 语句处理侧面的 mancalas。

我有一个简单的流程图来说明我的问题,对于那些不熟悉 Mancala 的人来说:http://imgur.com/WubW1pC

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

declare pots1[0,4,4,4,4,4,4], pots2[0,4,4,4,4,4,4] //pots1 [0] 和 pots2 [0] 是那个玩家的 mancala

function side1(pot,player) //pot 是玩家选择的盆
    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 //如果在第 6 盆中放下了石头并且 player1 在玩,将石头放在他的 mancala 中
        pots1[0] = pots1[0] + 1
        stones = stones - 1

    if stones == 0 //如果 player1 没有石头了,请检查盆中是否有更多的石头。 拿起盆中的所有石头并继续。 
        if pots1[pot] > 1

我不确定从这里该往哪里走。

点赞
用户1442917
用户1442917

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

你可能想查看《Lua程序设计》第9章以了解有关协程的详细信息。

2016-02-29 20:11:26
用户9608077
用户9608077

我不打算评审 Mancala 实现, 关于类似“break”逻辑的退出循环,

您可以按照旧的方式进行:

function(stones, pot)
    shouldIterate = true
    while stones > 0 and shouldIterate do
        if pot == 6 then
            shouldIterate = false
        end
        pot = pot + 1
    end
end
2016-02-29 23:50:20