在 true 和 false 状态之间切换

switch between true and false state

我有一个代表玩家的对象,假设有 2 个玩家

//create a player object
function player(name,state,score) {
    this.name = name;
    this.state = state;
    this.score = score;
} 

 var players = [
new player('player1',true,0),
new player('player2',false,0)
];

所以我希望球员们一个接一个地走下去。为此,我使用 true 或 false state。所以当为真时,它对玩家 1 和 vs.

很重要(我计算玩家的正确答案并显示它们)

我现在有的是

$("#check").click(function(){
if(localCorrect == 2){

//counting number of correct cards and assigning it to the player
    var i=0; 
        if (players[i].state == true){
        var localscore = players[i].score;
        localscore++;
        score[i] = localscore;
//display the score
        $("span#"+players[i].name).html(score[i]);

        players[i].state = false;
        i++;
        players[i].state = true;
        //if(i=2)
        //{i=0}
        }

}else{
//some other thing
    }
});

我有这个 http://jsfiddle.net/ycycghwq/

所以我有两个问题:

  1. 我认为我对 var i 的声明是错误的(它代表一个玩家的索引,我有 2 个所以它应该算到 1 然后回到 0。但我想让它不依赖于特定的数字,所以它可以是 4 或 10 个玩家。

  2. 我需要切换当前播放器(i)的状态。 player1 需要为真,何时切换为假。然后需要将玩家 2 的状态从 false 切换为 true。 (所以如果我有超过 2 个玩家,我需要将下一个玩家的状态切换为 true 和 false)

初学者的脑子都快沸腾了。有人可以帮忙吗? 提前致谢!

  • 答案 1:

在设置之前在您的处理程序之外声明 i。将i++;写成i = (i+1) % num_of_players;并定义变量num_of_players% 是计算除法余数的模运算符。如果按照概述使用,它会从 0 重复迭代到 num_of_players-1。使用 players.length 代替 num_of_players 是等效的。

  • 答案 2:

玩家的状态在您创建玩家对象时初始化。在您给定的代码中,将 players[i].state = false;players[i].state = true; 替换为 players[i].state = !players[i].state;.

工作演示:this fiddle

  • 您不需要对布尔变量使用相等测试运算符; if (players[i].state) { ... 就够了。

  • 如果使用相等性测试,请使用类型安全变体 === 而不是 ==

我稍微修改了你的代码。现在你可以在数组中有 x 个玩家,他们会很好地切换他们的状态。我对最重要的部分进行了注释,因此我认为您阅读代码不会有问题。如果你刚刚问:)

JSFiddle: http://jsfiddle.net/ycycghwq/2/

var score = [0,0];
var localCorrect = 2;

$(document).ready(function(){

//create a player object
var Player = function(name, state, score) {
    this.name = name;
    this.state = state;
    this.score = score;
} 

var players = [
    new Player('player1',true,0),
    new Player('player2',false,0)
];

$("#check").click(function(){
    if(localCorrect == 2) {
        // iterate through all the players
        for(var iterator = 0; iterator < players.length; iterator++) {
            // check if there is array/object element with this key
            if (players.hasOwnProperty(iterator)) {
                var player = players[iterator];

                // check for player state
                if (player.state === true) {
                    // increment player score
                    player.score++;
                    score[iterator] = player.score;

                    $("span#" + player.name).html(score[iterator]);
                    player.state = false;

                    // check if there is next player in the array
                    // if not start from the first player
                    if (players.hasOwnProperty(iterator + 1)) {
                        var nextPlayer = players[iterator + 1];
                        nextPlayer.state = true;
                    } else {
                        var firstPlayer = players[0];
                        firstPlayer.state = true;
                    }

                    // exit the for loop
                    break;
                } else {
                    // some other thing
                }
            }
        }
    }
});
});

编辑:

您没有在玩家中创建变量 object/array。您为 for..in 循环创建一个变量迭代器。该变量代表数组的每个键(在本例中为玩家)。因此,对于循环的 2 次迭代,您的迭代器将为 0 和 1。您还可以使用它来遍历对象并获取它们的 属性 名称等等。

Documentation of for..in loop

无论如何,在这种情况下使用 for..in 循环而不是顺序 for 循环是我的错误:

for(var iterator = 0; iterator < players.length; iterator++)

这样我们就不需要将迭代器解析为整数。 详细了解何时使用 for..in 循环以及何时使用顺序 for 循环:

  • here
  • and here