我正在尝试创建一个可以生成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循环...只有一个在语法上有效的?
谢谢!
答案 0 :(得分:3)
是的,添加更多括号。
while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) {
// Do whatever
}
while循环将在while
关键字之后立即测试括号中的所有内容。您可以使用更多括号或任何您喜欢的运算符在这些括号内无限地嵌套条件,只要这些括号中的任何内容都可以被评估为真或假。
答案 1 :(得分:1)
看起来你错过了一个括号
while ((randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) {
randSuit2 = Math.round(Math.random()*3);
randFace2 = Math.round(Math.random()*13);
}
答案 2 :(得分:1)
只需使用括号对条件进行分组,如下所示:
while( (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3)) {
randSuit2 = Math.round(Math.random()*3);
randFace2 = Math.round(Math.random()*13);
}
答案 3 :(得分:0)
听起来像是XY problem,所以请注意,这个答案不会回答问题的主题,而是回答问题本身。
首先,您应该使用Math.floor,因为Math.round
会为您提供非均匀分布:
function randomInt(max) {
return Math.floor(Math.random() * (max + 1))
}
然后你必须将所有这些值存储在某个地方,对吧?那你为什么不使用对象或数组呢?我假设你正在使用一副52张牌。如果你有一个类似的惯例:
然后你的“deck”表示只是一个int数组:
var deck = [];
for (var i = 0; i < 52; i++)
deck.push(i);
现在你可以创建一个“游戏套牌”,只需改变常规游戏:
// Using the Fisher Yates shuffle: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
function shuffle(array) {
var len = array.length;
var shuffled = array.slice();
while (len--) {
random = randomInt(len + 1);
// swap
shuffled[len] = [shuffled[random], shuffled[random] = shuffled[len]][0];
}
return shuffled;
}
// creating a new, shuffled deck from the original
var playingDeck = shuffle(deck);
并使用playingDeck
实际分发您的卡片。假设你想把前5张牌给玩家1:
var player1Hand = playingDeck.splice(0, 5);
然后你的player1Hand将是一个五元素数组,其中元素是来自“游戏牌组顶部”的标记(前五个元素)。因此,如果您现在查询playingDeck.length
,则为47
。你想给玩家2提供其他5张牌吗?相同的代码:
var player2Hand = playingDeck.splice(0, 5);
如果你想在比赛中间洗牌?只需随机播放playingDeck
并将其分配给自己:
playingDeck = shuffle(playingDeck);
您还可以从顶部绘制一张卡片:
var card = playingDeck.shift();
(请注意,在这种情况下,它不是卡片阵列 - 但是卡片本身 - 数字。)
基本上使用你想要的任何Array methods,模拟一个真正的套牌。
正如您所看到的,处理模拟卡片是一种更自然的方式,您不必在循环中连接多个条件来绘制一些卡片。
我会使用我在开头提到的约定,但请记住,如果你想要一个不同的卡片表示,它也没关系:所描述的方法仍然有效,你不必更改代码;只有数组的值不同,所以只有甲板的生成。例如,你可以有字符串:
var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */];
最后一个字母是诉讼,遗骸是卡的价值。或者你也可以实际使用一个对象:
var deck = [{"suit": "Hearts", "face": "1"}, /* etc */];
真的没关系。什么使您更容易处理。但其余的方法仍然是一样的。
希望它有所帮助!