【问题标题】:switch between true and false state在真假状态之间切换
【发布时间】:2015-02-26 12:09:02
【问题描述】:

我有一个代表一个玩家的对象,假设是 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)

我初学者的大脑正在沸腾。有人可以帮忙吗?! 提前致谢!

【问题讨论】:

    标签: jquery boolean-logic boolean-expression


    【解决方案1】:

    我稍微修改了您的代码。现在你可以在数组中拥有 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
                    }
                }
            }
        }
    });
    });
    

    编辑:

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

    Documentation of for..in loop

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

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

    这样我们就不需要将迭代器解析为整数。 阅读更多关于何时使用 for..in 循环以及何时使用顺序 for 循环:

    【讨论】:

    • 非常感谢您提供的出色解决方案!它工作得很好! :-) 但正如我所说,我是一个初学者。您能否指出确切的内容和位置(播放器中的 var 迭代器)是什么?您是否在 player 对象/数组中创建一个变量作为字符串,然后将其转换为整数?也许是一个愚蠢的问题......但我正在努力理解。
    • 我已经编辑了我的答案。顺便说一句,你是保加利亚人吗? :)
    • 我真的很感激你在做什么。感谢您的编辑和文档。这将是一些研究:-) 是的,同时我已经阅读了一些关于 for in 和顺序循环的内容......这对我来说也是一个新的教训。这么多新东西!我是俄罗斯人,但在荷兰融入得很好:-)
    • 是的,我只需要再问一个问题:@collapsar 的解决方案(如下)也是一个有效的解决方案jsfiddle.net/8ff4eofv/10,无需循环即可完成。从语义和性能的角度来看,到底哪种方案实际上更好?
    • 我认为在这种特殊情况下@collapsar 的例子更好,但我相信你会发现我的回答很有帮助,一旦你理解了这个概念,你就会找到解决未来问题的简单方法。 :)) 保加利亚的欢呼声
    【解决方案2】:
    • 答案 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) { ... 就足够了。

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

    【讨论】:

    • 您好,谢谢您的回答。我已经尝试过了,但它不起作用。它工作一次。一切都像它应该发生的那样发生,除了代码仅在第一次单击按钮时做出反应。 jsfiddle.net/8ff4eofv/2 我想我需要一个循环的孩子,就像另一个答案中建议的那样。
    • 为了完整起见:您的小提琴内容不完整,我的回答包含一个小错误。请参阅工作版本here。下次将提供经验教训、完整和经过测试的代码:-)。感谢您测试建议。
    • 是的,你不会停止学习的东西 :-) 但这将轮到我对工作解决方案表示感谢。一个问题。我真的需要制作 i 和 num_players 全局变量吗?而且,我只需要问 - @Hristo Enev 的另一个答案也有效(上图)。但它是通过那里的循环完成的......所以伙计们,从语义和性能的角度来看,哪种方法更......足够,更好???
    • 技术是一样的。 @HristoEnev 的循环每次鼠标单击都会遍历玩家数组一次,以找到当前活动的玩家并修改他的状态,将活动标志传递给下一个玩家。这也是我的代码所做的,但是,我在索引变量i 中维护状态,因此不必搜索播放器数组。在生产代码中,您不会使用全局变量,而是添加属性来控制players 对象的状态。恕我直言,代码部分太小,以有意义的方式考虑性能。两种代码都各司其职(嘘:我更喜欢我的解决方案 ;-))。
    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多