我想为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
我不知道从哪里开始。
答案 0 :(得分:1)
在您描述时退出并进入循环的唯一方法是使用Lua协同程序的yield
和resume
方法。 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