Я получаю случайную ошибку при создании карт для своей колоды в JavaScript

#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) {  ...  }