如何在javascript中创建具有多种条件的while循环?

如何在javascript中创建具有多种条件的while循环?,javascript,random,while-loop,multiple-conditions,Javascript,Random,While Loop,Multiple Conditions,我正在尝试创建一个扑克程序,它将生成一手5张随机牌。我遇到的一个问题是,该程序偶尔会生成同一张卡两次 我想到的解决这个问题的最好方法是实现一个类似这样的while循环 while (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3) { randSuit2 = Math.round(Math.random()*

我正在尝试创建一个扑克程序,它将生成一手5张随机牌。我遇到的一个问题是,该程序偶尔会生成同一张卡两次

我想到的解决这个问题的最好方法是实现一个类似这样的while循环

while (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3) { 

randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   

}
但这破坏了while循环的语法并拒绝运行

有没有办法创建一个类似于上面的while循环,并且有很多复杂的条件。。。只有一个在语法上是有效的


谢谢

是,添加更多括号

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3))  {
    // Do whatever
}

while循环将测试紧跟在
while
关键字后面的括号中的所有内容。您可以使用更多的圆括号或任何您喜欢的运算符在这些圆括号内无限嵌套条件,只要这些圆括号中的任何内容都可以计算为true或false。

是,请添加更多圆括号

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3))  {
    // Do whatever
}

while循环将测试紧跟在
while
关键字后面的括号中的所有内容。您可以使用更多的括号或任何您喜欢的运算符在这些括号中无限嵌套条件,只要这些括号中的任何内容都可以计算为true或false。

看起来您缺少了一个括号

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 &&      randSuit2 == randSuit3)) { 

randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   

}

看起来你少了一个括号

while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 &&      randSuit2 == randSuit3)) { 

randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   

}

只需使用括号将条件分组,如下所示:

while( (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) { 
randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   
}

只需使用括号将条件分组,如下所示:

while( (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) { 
randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   
}
对我来说,这听起来像一个问题,所以请注意,这个答案不是回答问题的主题,而是回答问题本身

首先,您应该使用,因为
Math.round
将为您提供非均匀分布:

function randomInt(max) {
    return Math.floor(Math.random() * (max + 1))
} 
然后你必须把这些值都存储在某个地方,对吗?那么为什么不使用对象或数组呢?我假设你用的是一副52张牌。如果你有这样的约定:

  • 心脏:指数0-12
  • 钻石:指数13-25
  • 俱乐部:指数26-38
  • 黑桃:索引39-51
那么您的“deck”表示就是一个int数组:

var deck = [];
for (var i = 0; i < 52; i++)
  deck.push(i);
并使用
playingDeck
实际分发您的卡。假设您想将前5张牌交给玩家1:

var player1Hand = playingDeck.splice(0, 5);
然后你的玩家1手牌将是一个五元素数组,其中元素是来自“游戏甲板顶部”(前五个元素)的标记。因此,如果您现在查询的
playingDeck.length
,将是
47
。你想给玩家2另外5张牌吗?相同代码:

var player2Hand = playingDeck.splice(0, 5);
如果你想在比赛中间洗牌?只需洗牌
playingDeck
,并将其分配给自身:

playingDeck = shuffle(playingDeck);
您也可以从顶部抽出一张卡片:

var card = playingDeck.shift();
(请注意,在本例中,它不是一个卡片列表–数组–而是一个卡片本身–编号。)

基本上可以使用任何你想要的,模拟真实的甲板

正如您所看到的,这是处理模拟卡的更自然的方法,您不必在循环中串联许多条件来绘制一些卡

我会使用我在开始时提到的约定,但请记住,如果您想使用不同的卡表示形式,也没关系:所描述的方法仍然有效,您不必更改代码;只有数组的值是不同的,所以只有甲板的生成是不同的。例如,可以有字符串:

var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */];
最后一个字母是诉讼,剩下的是信用卡的价值。或者您也可以实际使用对象:

var deck = [{"suit": "Hearts", "face": "1"}, /* etc */];
这真的没关系。什么让你更容易处理。但该方法的其余部分仍将保持不变

希望有帮助

我觉得这听起来像是一个问题,所以请注意,这个答案不是回答问题的主题,而是回答问题本身

首先,您应该使用,因为
Math.round
将为您提供非均匀分布:

function randomInt(max) {
    return Math.floor(Math.random() * (max + 1))
} 
然后你必须把这些值都存储在某个地方,对吗?那么为什么不使用对象或数组呢?我假设你用的是一副52张牌。如果你有这样的约定:

  • 心脏:指数0-12
  • 钻石:指数13-25
  • 俱乐部:指数26-38
  • 黑桃:索引39-51
那么您的“deck”表示就是一个int数组:

var deck = [];
for (var i = 0; i < 52; i++)
  deck.push(i);
并使用
playingDeck
实际分发您的卡。假设您想将前5张牌交给玩家1:

var player1Hand = playingDeck.splice(0, 5);
然后你的玩家1手牌将是一个五元素数组,其中元素是来自“游戏甲板顶部”(前五个元素)的标记。因此,如果您现在查询的
playingDeck.length
,将是
47
。你想给玩家2另外5张牌吗?相同代码:

var player2Hand = playingDeck.splice(0, 5);
如果你想在比赛中间洗牌?只需洗牌
playingDeck
,并将其分配给自身:

playingDeck = shuffle(playingDeck);
您也可以从顶部抽出一张卡片:

var card = playingDeck.shift();
(请注意,在本例中,它不是一个卡片列表–数组–而是一个卡片本身–编号。)

基本上可以使用任何你想要的,模拟真实的甲板

正如您所看到的,这是处理模拟卡的更自然的方法,您不必在循环中串联许多条件来绘制一些卡

我会使用我在开始时提到的约定,但请记住,如果您想使用不同的卡表示形式,也没关系:所描述的方法仍然有效,您不必更改代码;只有数组的值是不同的,所以只有甲板的生成是不同的。例如,可以有字符串:

var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */];
最后一个字母是诉讼,剩下的是信用卡的价值。或者您也可以实际使用对象:

var deck = [{"suit": "Hearts", "face": "1"}, /* etc */];
这真的没关系。什么让你更容易处理。但该方法的其余部分仍将保持不变


希望有帮助

将整个条件包装在
()
中,它可能会工作。将整个条件包装在
()