Как создать вывод перемешанной колоды карт

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

    Этот урок состоит из трех частей:
  1. Теоретическая часть
  2. Практика
  3. Логическая часть

Теоретическая часть

    Перед тем, как приступить к практической части урока, рекомендуется прочитать следующие статьи
  1. Wikipedia: Генератор псевдослучайных чисел
  2. Learnjavascript.ru: Массивы – методы
  3. Wikipedia: Тасование Фишера — Йетса

Практика

Задание 1. С помощью alert() вывести на экран рандомную карту.

Задание 2. Вывести перемешанную колоду карт.

Названия мастей: hearts – червы, spades – пики, diamonds – бубны, clubs – трефы. Туз – Ace,король – King, королева – Queen, валет – Jack.

Первое задание не такое сложное. Достаточно создать два массива, один с мастями и один с рангами. Потом можно создать две переменные: одна из которых хранит рандомную масть, а другая – рандомный ранк. Рандоный элемент можно вывести с помощью функции Math.random(), умноженную на длину массива (массив ранка или масти). Потом сделать вывод на подобие: Your card is Jack of Spades!

Не забудьте, что Math.random() возращает значение от 0 до 1. Рекомендуется использовать функцию округления Math.floor() для его результата.

Для чистоты написания кода необходимо уметь правильно называть переменные, чтобы они передавали всю суть данных, которые они хранят. Как бы вы назвали переменную, которая хранит рандомную масть? рандомный ранк?
            var randomRank = ranks[Math.floor(Math.random() * ranks.length)];
            var randomSuit = suits[Math.floor(Math.random() * ranks.length)];
        

Второе задание немного сложнее. Когда получилось вывести одну карту, становится понятным, что в следующем необходимо вывести массив карт. Для этого необходимо, чтобы каждая рандомная карта записывалась в массив, длинной в 51 элемент (первый элемент нулевой). Но тут нужно учесть важный момент. Math.random() выдает случайные элементы, он не отвечает за то, что элементы повторяться не будут. То есть, велика вероятность того, что в итоге выведется колода карт с повторяющимися в нем картами, а такого быть не должно. Для этого к этому уроку одной из рекомендацией было прочитать алгоритм тасования Фишера-Йетса.

Основная процедура тасования Фишера-Йетса аналогична случайному вытаскиванию записок с числами из шляпы или карт из колоды, один элемент за другим, пока элементы не кончатся. Алгоритм обеспечивает эффективный и строгий метод таких операций, гарантирующий несмещённый результат.
– Wikipedia

Прочтите статью и попробуйте использовать этот алгоритм в решении задания.

            var deck = new Array();
            for (var i = 0; i < ranks.length; i++){
                for (var j = 0; j < suits.length; j++){
                    deck.push(ranks[i] + " of " + suits[j]);
                }
            }
            for (var i = deck.length - 1; i > 0; i--){
                var j = Math.floor(Math.random() * (i + 1));
                var randomDeck = deck[i];
                deck[i] = deck[j];
                deck[j] = randomDeck;
            }
            var randomDeck = new Array(51);
            for (var i = 0; i < deck.length; i++){
                randomDeck[i] = "<\br/\>" + deck[i];
            }
        

Логическая часть

    Представьте, что вам необходимо разработать карточную игру "Дурак". Попробуйте разработать логику следующих алгоритмов:
  1. Как бы вы создали интерфейс игры? (к примеру, снизу экрана 6 карт открытых, сверху 6 карт закрытых (карты компьютера), партия на столе (динамика: подброс новой карты), колода карт сбоку)
  2. Как бы вы разработали алгоритм работы с козырной масти? (к примеру, присвоение элементу козырной масти флага var trump = true, если карта козырная. Работа с ролями карт (обычная, козырная))