在 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/
所以我有两个问题:
我认为我对 var i 的声明是错误的(它代表一个玩家的索引,我有 2 个所以它应该算到 1 然后回到 0。但我想让它不依赖于特定的数字,所以它可以是 4 或 10 个玩家。
我需要切换当前播放器(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。您还可以使用它来遍历对象并获取它们的 属性 名称等等。
无论如何,在这种情况下使用 for..in 循环而不是顺序 for 循环是我的错误:
for(var iterator = 0; iterator < players.length; iterator++)
这样我们就不需要将迭代器解析为整数。
详细了解何时使用 for..in 循环以及何时使用顺序 for 循环:
- here
- and here
我有一个代表玩家的对象,假设有 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/
所以我有两个问题:
我认为我对 var i 的声明是错误的(它代表一个玩家的索引,我有 2 个所以它应该算到 1 然后回到 0。但我想让它不依赖于特定的数字,所以它可以是 4 或 10 个玩家。
我需要切换当前播放器(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。您还可以使用它来遍历对象并获取它们的 属性 名称等等。
无论如何,在这种情况下使用 for..in 循环而不是顺序 for 循环是我的错误:
for(var iterator = 0; iterator < players.length; iterator++)
这样我们就不需要将迭代器解析为整数。 详细了解何时使用 for..in 循环以及何时使用顺序 for 循环:
- here
- and here