簡體   English   中英

如何在JavaScript中使用多種條件創建While循環?

[英]How can I create a while loop with many conditions in javascript?

我正在嘗試創建一個撲克程序,該程序將生成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)) { 

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);   
}

對我來說,這聽起來像是XY問題 ,因此請注意,此答案不是針對問題的主題而是針對問題本身。

首先,您應該使用Math.floor ,因為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);

現在,您可以創建一個“游戲甲板”,將常規游戲甲板改組一下:

// 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 您想將其他5張卡片提供給玩家2嗎? 相同的代碼:

var player2Hand = playingDeck.splice(0, 5);

而且,如果您想在游戲中途洗牌? 只需隨機播放playingDeck並將其分配給它自己:

playingDeck = shuffle(playingDeck);

您也可以從頂部繪制一張卡片:

var card = playingDeck.shift();

(請注意,在這種情況下,它不是卡的列表-陣列-而是卡本身-編號。)

並基本上使用您想要的任何Array方法來模擬真實套牌。

如您所見,這是處理模擬卡的一種更自然的方法,您不必在循環中串聯許多條件來繪制某些卡。

我會使用我一開始提到的約定,但是請記住,如果您希望使用不同的卡表示形式,也可以:描述的方法仍然有效,無需更改代碼; 只有數組的值不同,因此只有套牌的生成。 例如,您可能有字符串:

var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */];

最后一個字母是西裝,剩下的是卡的價值。 或者您實際上也可以使用一個對象:

var deck = [{"suit": "Hearts", "face": "1"}, /* etc */];

真的沒關系。 是什么讓您更輕松地應對。 但是其余方法將保持不變。

希望能幫助到你!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM