#javascript #arrays #loops #random
#язык JavaScript #массивы #петли #Случайный
Вопрос:
Моя цель-сделать простую карточную игру. У меня есть ошибка, из-за которой иногда он не помещает один из объектов в массив. Сначала я подумал, что выбранное число не поместится между операторами if для объявления значений объектов.
Я попытался переопределить выбранный номер вручную сразу после того, как он получил случайное значение. Потом это сработало. Цифры, с которыми у меня возникли проблемы, таковы: 36, 38, 24, 25, 37 когда это было случайным, но когда я определил выбранный номер вручную, он работал так, как должен.
Как я могу это исправить?
изображение того, когда код выходит из строя
изображение того, когда это работает
function log(txt) { console.log(txt); } let cards = []; let hand = []; // fill card deck for (let i = 1; i lt; 53; i ) { cards.push(i); } // index for to make the random math not to choose a number over the highest index of cards[] // loop for picking some random card with a value for (let i = 0; i lt; 3; i ) { // random index to choose let randomNumber = Math.floor(Math.random() * cards.length); log(randomNumber); // random number let pickedNumber = cards[randomNumber]; log(pickedNumber); // remove the picked card const index = cards.indexOf(pickedNumber); if (index gt; -1) { cards.splice(index, 1); } let finalValue; let card = { value: finalValue, suit: "", }; // these if statements are for deviding the cards from 52 to 4x13 if (pickedNumber lt; 14) { card.value = pickedNumber; card.suit = "♥"; hand.push(card); } else if (pickedNumber gt; 13 amp;amp; pickedNumber lt; 26) { card.value = pickedNumber -= 13; card.suit = "♣"; hand.push(card); } else if (pickedNumber gt; 26 amp;amp; pickedNumber lt; 39) { card.value = pickedNumber -= 26; card.suit = "♦"; hand.push(card); } else if (pickedNumber gt; 39 amp;amp; pickedNumber lt; 53) { card.value = pickedNumber -= 39; card.suit = "♠"; hand.push(card); } // reduce maxIndex to dont overpick index } log(hand);
Комментарии:
1. Этот цикл
for (let i = 1; i lt; 53; i )
составляет 51 итерацию.
Ответ №1:
Более полное представление колоды карт довольно просто и хорошо рекомендуется.
В приведенном ниже фрагменте freshDeck
перечислена полная стандартная колода, используемая push()
для добавления карт. Фишер-Йейтс shuffle()
тасует колоду, slice()
просматривает карты и splice()
перемещает карты из одной стопки (массива) в другую.
function freshDeck() { const suits = [ "♥", "♣", "♦","♠"]; const values = ["A","2","3","4","5","6","7","8","9", "10","J","Q","K"] let deck = [] for (const suit of suits) { for (const value of values) { deck.push({ suit, value }) } } return deck } // fy shuffle, thanks to https://stackoverflow.com/a/2450976/294949 function shuffle(array) { let currentIndex = array.length, randomIndex; while (currentIndex != 0) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex--; [array[currentIndex], array[randomIndex]] = [ array[randomIndex], array[currentIndex]]; } return array; } // create a deck let deck = freshDeck() console.log(`the deck has ${deck.length} cards`) console.log(`the first few cards are ${JSON.stringify(deck.slice(0,3))}`) // suffle the deck shuffle(deck) console.log(`nafter a shuffle, the first few cards are ${JSON.stringify(deck.slice(0,3))}`) // deal a hand of cards let hand = deck.splice(0, 5) console.log(`ndealt a hand with ${JSON.stringify(hand, null, 0)}`) console.log(`nafter dealing, the deck has ${deck.length} cards`)
Ответ №2:
У вас есть ошибка в ваших утверждениях IF. В каждом наборе вам не хватает номера
if (pickedNumber lt; 14) { ... } else if (pickedNumber gt; 13 amp;amp; pickedNumber lt; 26) { ... } else if (pickedNumber gt; 26 amp;amp; pickedNumber lt; 39) { ... } else if (pickedNumber gt; 39 amp;amp; pickedNumber lt; 53) { ... }
Посмотрите, как в приведенном выше блоке кода, если число 26 или 39, оно не будет принято. Когда мы меняем значение lt; 26
на lt;= 26
, это позволяет его обнаружить.
if (pickedNumber lt;= 14) { // ... } else if (pickedNumber gt; 14 amp;amp; pickedNumber lt;= 26) { ... } else if (pickedNumber gt; 26 amp;amp; pickedNumber lt;= 39) { ... } else if (pickedNumber gt; 39 amp;amp; pickedNumber lt;= 53) { ... }