0

我理解使用setTimeoutsetInterval延迟方法的启动,但我遇到了一个问题。我想让三个 cpu 玩家(在纸牌游戏中)“轮流”。他们应该轮到他们,然后在下一个开始之前有 500 毫秒。这是我想要构建轮流的代码(目前,这是没有人的,所以我希望它连续运行):

var whoseTurn = 0;
while (true) {
            setTimeout(takeTurn(players[whoseTurn]), 500);
            whoseTurn = (whoseTurn + 1) % 3;
        }

在一个单独的函数中:

function takeTurn(player) {
        //Now taking a turn
    }

问题是,在setTimeout被调用之后,我在第一个函数中的代码继续运行,使得延迟几乎毫无用处。

4

2 回答 2

0
var whoseTurn = 0;
while (true) {
        setTimeout(takeTurn(players[whoseTurn]), 500);
        whoseTurn = (whoseTurn + 1) % 3;
}

所以..这将创建一个计时器,然后在一个紧密的循环中增加转弯。它甚至没有调用 takeTurn,因为你正在调用它(通过提供参数)。不是你想要的。

一种解决方法是调用 setInterval,并在每次循环结束时增加转弯。但这不会让转弯是可变长度的。(即如果需要 100 毫秒,那么下一回合将在 400 毫秒内到来。

构建它的正确方法是启动第一回合一次,然后在每回合结束时启动一个计时器:

function takeTurn() {
    player = players[whoseTurn];
    //Now taking a turn
    whoseTurn = (whoseTurn + 1) % 3;
    setTimeout(takeTurn, 500);
}

setTimeout(takeTurn, 500);
于 2013-06-03T23:35:42.633 回答
0

第一种方法是使用 setTimeout 或 setInterval,无论您喜欢什么

var turnsInt = null
  , whoseTurn = 0
  , players = [....]

function takeTurn() {
   var player = players[whoseTurn]
   ... do stuff

   whoseTurn=(whoseTurn+1)%players.length
}

turnsInt = setInterval(takeTurn, 500)

... some other code in some other place to stop it

if(cond) {
   clearInterval(turnsInt)
}

另一种方法是使用 jquery 承诺实现创建承诺链

$.when(takeTurn(1)).then(takeTurn(2)).then(takeTurn(3))


function takeTurn(whoseTurn) {
    var def = $.Deffered()

    ... do stuff

    setTimeout(function() {
       def.resolve()
    }, 500)       

    return def
}
于 2013-06-03T23:44:53.600 回答