Javascript Пытаюсь перетасовать массив моей колоды карт, но не могу понять, как передать массив в

Я работаю над личным проектом / смотрю уроки, чтобы развлечься, создавая игру для школы. В конце концов, это военная карточная игра, в которую я играл в детстве - побеждает наибольшее число. Я пытаюсь рандомизировать свой массив карточек, у меня есть 52 объекта, которые хранятся так, как я хочу, но теперь я столкнулся с этим препятствием.

<!DOCTYPE html>
<html lang = "en">
    <head>
        <meta charset = "UTF-8">
        <title>
            War Cards!
        </title>
    </head>
    <body>
        <div id = "wrapper">
            <div id = "start"></div>
            <div id = "message"></div>
            <div id = "board">
                <div id = "player1" class = "players">
                    <div class = "score"></div>
                    <div class = "hand"></div>
                </div>
                <div id = "player2">
                    <div class = "score"></div>
                    <div class = "hand"></div>
                </div>
            </div>
            <div id = "action">
                <button id = "btnBattle" type = "button" class = "btn">
                    Fight!
                </button>
            </div>
        </div>

        <script src = "js/jquery-3.3.1.min.js">
        </script>
        <script>
            $('document').ready(function() {
                var suits = ["spades", "hearts", "clubs", "diams"];
                var cardFace = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
                var cards = [];
                var players = [[], []];
                var firstRun = true;
                var fightButton = document.querySelector("#btnBattle");

                fightButton.addEventListener('click', battle);

                function battle()
                {
                    if (firstRun)
                    {
                        firstRun = false;
                        buildCards();
                        shuffleArray();
                    }
                    console.info('Works');
                }


                function buildCards()
                {
                    cards = [];
                    for (s in suits)
                    {
                        var suitNew = suits[s][0].toUpperCase();
                        for(n in cardFace)
                        {
                            var card = {
                                suit:suits[s],
                                num:cardFace[n],
                                cardValue:parseInt(n) +2,
                                icon:suitNew
                            }
                            cards.push(card);
                        }
                    }
                    console.info(cards);
                }

                function shuffleArray(array)
                {
                    for(var x = array.length -1; x > 0; x--)
                    {

                        var ii = Math.floor(Math.random() * (x + 1))
                        var temp = array[x];
                        console.info(temp)
                    }
                    return array;
                }










            });

        </script>
    </body>
</html>

См. Перемешивание Фишера-Йетса. Это довольно просто реализовать.

Amadan 17.12.2018 04:26

Не забудьте объявить переменные s и n внутри функции buildCards ...

traktor 17.12.2018 05:32
Поведение ключевого слова "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) для оценки ваших знаний,...
2
2
110
2

Ответы 2

Избегайте добавления всего в глобальную область видимости. Ниже я возвращаю карты из buildCards() и передаю карты в shuffleArray() (который я скопировал из здесь, поскольку ваша исходная функция shuffleArray фактически не перемещала какие-либо элементы):

var suits = ["spades", "hearts", "clubs", "diams"];
var cardFace = ["2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"];
var players = [[], []];
var firstRun = true;

function battle()
{
    if (firstRun)
    {
        firstRun = false;
        var cards = buildCards();
        var randomized = shuffleArray(cards);
        console.info(randomized);
    }
    console.info('Works');
}


function buildCards()
{
    var cards = [];
    for (s in suits)
    {
        var suitNew = suits[s][0].toUpperCase();
        for(n in cardFace)
        {
            var card = {
                suit:suits[s],
                num:cardFace[n],
                cardValue:parseInt(n) +2,
                icon:suitNew
            }
            cards.push(card);
        }
    }
    
    return cards;
}

function shuffleArray(array) {
  var m = array.length, t, i;

  // While there remain elements to shuffle…
  while (m) {

    // Pick a remaining element…
    i = Math.floor(Math.random() * m--);

    // And swap it with the current element.
    t = array[m];
    array[m] = array[i];
    array[i] = t;
  }

  return array;
}

battle();

Это работает! Я понимаю все, что вы делали, вплоть до функции shuffleArray, не могли бы вы объяснить эту часть немного подробнее? У меня всего 4 недели в классе javascript, ха-ха

MrMakeVio 17.12.2018 04:44

Что вы хотите знать о функции shuffleArray? Я просто искал в Google "fisher-yates shuffle javascript", нашел первый метод и скопировал его отсюда: bost.ocks.org/mike/shuffle

ugh StackExchange 17.12.2018 04:46

@FrankerZ, эта конкретная функция перемешивания уничтожает свой входной массив как часть своей логики реализации .. Ой!

traktor 17.12.2018 05:40

@ traktor53 Как ни странно, я должен был прочитать весь пост. Лучшая реализация была в конце (в результате я обновил свой пост)

ugh StackExchange 17.12.2018 05:43

Кажется, существует проблема с различием между формальными и фактическими аргументами при объявлении и вызове функций.

Формальные аргументы

Когда вы объявляете функцию, вы даете ее аргументам имена параметров формальный, чтобы вы могли ссылаться на них внутри функции. У них нет фактического значения до вызова функции. НАПРИМЕР. в объявлении функции перемешивания

function shuffle( array) {....

array - формальный аргумент.

Фактические аргументы

Формальные аргументы заменяются фактическими аргументами при вызове функции.

НАПРИМЕР. чтобы перемешать массив cards, вы бы назвали shuffle как

shuffle( cards);

предоставление cards в качестве аргумента действительный.


Обратите внимание, что функция перемешивания, похоже, реализует алгоритм Фишера-Йейтса, но в ней отсутствуют две строки, которые меняют местами записи массива x и ii.

Вот копия функции перемешивания с отсутствующими строками:

function shuffle( a) { // fisher yates algorithm ;
    for( var i = a.length; --i;) {
        var j = Math.floor( Math.random() * (i+1));
        var temp = a[i]; // swap entries at i and j
        a[i] = a[j];
        a[j] = temp;
    }
}

Вы можете изменить формальное имя параметра a и ссылки на него в теле функции на array, если хотите.

Обратите внимание, что элементы массива перемешиваются «на месте», поэтому нет необходимости возвращать значение параметра массива, поскольку оно не изменилось.

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