52 карты с генератором случайных чисел JS

Я изучаю JS, и новый проект, над которым я работаю, касается карточной игры с 52 картами. Я пытаюсь смешать все карты, чтобы раздать их по местам, где находятся игроки. Я стараюсь сначала раздать только карту игрока, чтобы увидеть, работает ли мой код, но он просто показывает одну случайную карту, хотя каждый игрок должен получить 13 карт.

function Start() {

  let Karten = new Array();

  Karten[0] = "1h.png";
  Karten[1] = "2h.png";
  Karten[2] = "3h.png";
  Karten[3] = "4h.png";
  Karten[4] = "5h.png";
  Karten[5] = "6h.png";
  Karten[6] = "7h.png";
  Karten[7] = "8h.png";
  Karten[8] = "9h.png";
  Karten[9] = "10h.png";
  Karten[10] = "soldath.png";
  Karten[11] = "queenh.png";
  Karten[12] = "kingh.png";
  Karten[13] = "1k.png";
  Karten[14] = "2k.png";
  Karten[15] = "3k.png";
  Karten[16] = "4k.png";
  Karten[17] = "5k.png";
  Karten[18] = "6k.png";
  Karten[19] = "7k.png";
  Karten[20] = "8k.png";
  Karten[21] = "9k.png";
  Karten[22] = "10k.png";
  Karten[23] = "soldatk.png";
  Karten[24] = "queenk.png";
  Karten[25] = "kingk.png";
  Karten[26] = "1ka.png";
  Karten[27] = "2ka.png";
  Karten[28] = "3ka.png";
  Karten[29] = "4ka.png";
  Karten[30] = "5ka.png";
  Karten[31] = "6ka.png";
  Karten[32] = "7ka.png";
  Karten[33] = "8ka.png";
  Karten[34] = "9ka.png";
  Karten[35] = "10ka.png";
  Karten[36] = "soldatka.png";
  Karten[37] = "queenka.png";
  Karten[38] = "kingka.png";
  Karten[39] = "1p.png";
  Karten[40] = "2p.png";
  Karten[41] = "3p.png";
  Karten[42] = "4p.png";
  Karten[43] = "5p.png";
  Karten[44] = "6p.png";
  Karten[45] = "7p.png";
  Karten[46] = "8p.png";
  Karten[47] = "9p.png";
  Karten[48] = "10p.png";
  Karten[49] = "soldap.png";
  Karten[50] = "queenp.png";
  Karten[51] = "king.png";





  var zufall = Math.floor(Math.random() * Karten.length);

  document.getElementById("Karten").src = Karten[zufall];

}
<div id = "alles">
  <div id = "Spieler1">
    spieler1
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
    <img id = "Karten">
  </div>
  <div id = "Spieler2">
    spieler2
  </div>
  <div id = "Spieler3">
    spieler3
  </div>
  <div id = "Spieler4">
    spieler4
  </div>
</div>

Обратите внимание, что у вас не может быть нескольких элементов с одинаковым идентификатором.

Carsten Løvbo Andersen 23.02.2023 08:28

К вашему сведению: Karten[51] = "king.png"; наверное должно быть Karten[51] = "kingp.png";

DarkBee 23.02.2023 08:42

намекнули, что нельзя повторять один и тот же идентификатор. Идентификатор должен быть уникальным. Таким образом, одним из решений может быть просто наличие 13 различных элементов img с разными идентификаторами: karten1, karten2... или вы можете просто использовать класс и выбирать элементы img, используя document.getElementsByClassName

Diego D 23.02.2023 08:47

лично я бы рекомендовал использовать литерал массива. Это бы сократило код. Затем вы должны создать второй массив, который использует первый массив в случайном порядке. Если вы раздаете карты, их нужно удалить из 2-го массива, чтобы их нельзя было раздать снова.

tacoshy 23.02.2023 08:48

я на самом деле пробовал это с классом, но это не сработало, и спасибо за ваше замечание

Amir004 23.02.2023 08:48

почему это не сработало? что вы пробовали с классом?

tacoshy 23.02.2023 08:48

Как упоминал @CarstenLøvboAndersen, атрибут id должен быть уникальным в вашем HTML. Таким образом, вы можете сделать что-то вроде <img class = "card" id = "player-1-card-1" src = "..." alt = "..."> и т. д., где атрибут class может иметь несколько классов, разделенных пробелами, но карты или карты будет достаточно для темы CSS, а идентификатор будет конкатенацией пользователя и номера карты, потому что karten1 предложено @DiegoD будет повторяться 4 раза, поэтому не уникален.

Patrick Janser 23.02.2023 08:51

изображения не отображались, но когда я попробовал это с идентификаторами, по крайней мере, я отобразил одно случайное изображение

Amir004 23.02.2023 08:54

Конечно, это потому, что вы перезаписываете одно и то же изображение 4 раза, поскольку не используете уникальные идентификаторы, как уже упоминалось несколько раз.

DarkBee 23.02.2023 09:14

@ Amir004 Amir004 неясно, нужно ли вам решить проблему, которая у вас есть в коде, которым вы поделились, или вы действительно хотите иметь рабочую колоду. Правильный способ решить эту проблему — иметь колоду, перетасовать ее и просто выбрать карту в том порядке, в котором они были после перетасовки. Мое первое предложение было направлено на то, чтобы заставить этот код работать без ошибок. Но это не правильная стратегия для начала

Diego D 23.02.2023 09:27

если вы не смогли использовать document.getElementsByClassName как вы потерпели неудачу? если у вас просто есть класс, такой как player1 и player2, и вообще нет идентификатора, и вы устанавливаете атрибут class элементов img так, чтобы, когда вы делаете document.getElementsByClassName('player1'), он возвращал список элементов, как это не работает в вашем сценарии? Есть дюжина способов решить эту проблему... о деталях спорить бессмысленно. Кстати, поскольку это не было ясно сказано, если идентификатор не уникален, getElementById просто не удастся

Diego D 23.02.2023 09:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
11
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
  1. Идентификаторы должны быть уникальными
  2. СУХОЙ, не повторяйся
  3. Перетасуйте массив перед его использованием

Вот расширенная версия, которую стоит изучить

const getShuffledArr = arr => { if (arr.length === 1) { return arr}; const rand = Math.floor(Math.random() * arr.length); return [arr[rand], ...getShuffledArr(arr.filter((_, i) => i != rand))]; }; // https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array
const karten = getShuffledArr(["h", "k", "a", "p"].flatMap(farbe => Array.from({length: 10})
  .map((_, i) => `${i+1}${farbe}.png`).concat(["soldat", "queen", "kingh"].map(card => `${card}${farbe}.png`)))); // shuffled array

const len = karten.length;
const handLength = 13;
const start = () => { 
  document.getElementById("alles").innerHTML = Array.from({length: 4})
    .map((_, i) => `<div class = "spieler" id = "spieler${i+1}"><h3>Spieler ${i+1}</h3>
    ${Array.from({length: 13})
      .map((_, i) => `<img src = "${karten.pop()}" />`).join('')} // we could sort here
  </div>`).join('');
};
window.addEventListener("DOMContentLoaded",start)
<div id = "alles">
 
</div>

В вашем коде есть много проблем, которые начинаются с ошибочной концепции.

У вас есть массив из 52 карт, выберите случайную карту и покажите ее в руку игроку 1.

Там ваша концепция уже терпит неудачу. Это позволяет скрипту теоретически дать всем 4 игрокам одну и ту же карту 13 раз. Если вы раздаете карты игрокам, то одна и та же карта может существовать только один раз.

  1. Вы должны перетасовать свою колоду карт, где вы можете использовать алгоритмы перетасовки, как описано здесь
  2. Вам нужно создать копию массива с помощью метода Array.from()
  3. Затем вам нужно раздать карты игрокам и удалить эту карту из колоды с помощью метода Array.prototype.shift().
  4. И последнее, но не менее важное: вы должны отображать карты, динамически добавляя изображения с помощью функции createElement.

// creates a deck of 52 cards dynamically
const KARTEN = [
  'Karo 2',
  'Karo 3',
  'Karo 4',
  'Karo 5',
  'Karo 6',
  'Karo 7',
  'Karo 8',
  'Karo 9',
  'Karo 10',
  'Karo Bube',
  'Karo Dame',
  'Karo König',
  'Karo Ass',
  'Herz 2',
  'Herz 3',
  'Herz 4',
  'Herz 5',
  'Herz 6',
  'Herz 7',
  'Herz 8',
  'Herz 9',
  'Herz 10',
  'Herz Bube',
  'Herz Dame',
  'Herz König',
  'Herz Ass',
  'Pik 2',
  'Pik 3',
  'Pik 4',
  'Pik 5',
  'Pik 6',
  'Pik 7',
  'Pik 8',
  'Pik 9',
  'Pik 10',
  'Pik Bube',
  'Pik Dame',
  'Pik König',
  'Pik Ass',
  'Kreuz 2',
  'Kreuz 3',
  'Kreuz 4',
  'Kreuz 5',
  'Kreuz 6',
  'Kreuz 7',
  'Kreuz 8',
  'Kreuz 9',
  'Kreuz 10',
  'Kreuz Bube',
  'Kreuz Dame',
  'Kreuz König',
  'Kreuz Ass'
];
const HAND_SPIELER_EINS = document.querySelector('#kartenSpieler1');

document.querySelector('button').addEventListener('click', function() {
  leereHaende();
  mischeKarten();
});

// clears the hands of the players 
function leereHaende() {
  while (HAND_SPIELER_EINS.firstChild) {
    HAND_SPIELER_EINS.removeChild(HAND_SPIELER_EINS.lastChild);
  }
  kartenSpielerEins = [];
}

// creates a shuffled copy of the deck
let gemischteKarten;

function mischeKarten() {
    for (let i = KARTEN.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1));
        [KARTEN[i], KARTEN[j]] = [KARTEN[j], KARTEN[i]];
    }
    
    gemischteKarten = Array.from(KARTEN);
    
    verteileKarten();
}


// distribute cards to 4 players
let kartenSpielerEins = [];
  
function verteileKarten() {
  for (let i = 13; i > 0; i--) { 
    kartenSpielerEins.push(gemischteKarten.shift());
  }
  
  kartenAnzeigen();
}


// displays the cards
function kartenAnzeigen() {
  for (let i = 0; i < kartenSpielerEins.length; i++) {
    let neueKarte = document.createElement('img');
    neueKarte.alt = kartenSpielerEins[i];
    HAND_SPIELER_EINS.appendChild(neueKarte);
  }
}
img {
  display: block;
}
<button>Teile Karten Aus</button>

<div id = "kartenSpieler1"></div>

Другие вопросы по теме