Как создать вывод перемешанной колоды карт
Это небольшой урок создан для того, чтобы укрепить навыки использования JavaScript, а также разобраться в некоторых базовых аспектах теории информации и логики программирования.
-
Этот урок состоит из трех частей:
- Теоретическая часть
- Практика
- Логическая часть
Теоретическая часть
-
Перед тем, как приступить к практической части урока, рекомендуется прочитать следующие статьи
- Wikipedia: Генератор псевдослучайных чисел
- Learnjavascript.ru: Массивы – методы
- Wikipedia: Тасование Фишера — Йетса
Практика
Задание 1. С помощью alert() вывести на экран рандомную карту.
Задание 2. Вывести перемешанную колоду карт.
Названия мастей: hearts – червы, spades – пики, diamonds – бубны, clubs – трефы. Туз – Ace,король – King, королева – Queen, валет – Jack.Первое задание не такое сложное. Достаточно создать два массива, один с мастями и один с рангами. Потом можно создать две переменные: одна из которых хранит рандомную масть, а другая – рандомный ранк. Рандоный элемент можно вывести с помощью функции Math.random(), умноженную на длину массива (массив ранка или масти). Потом сделать вывод на подобие: Your card is Jack of Spades!
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]; }
Логическая часть
- Представьте, что вам необходимо разработать карточную игру "Дурак". Попробуйте разработать логику следующих алгоритмов:
- Как бы вы создали интерфейс игры? (к примеру, снизу экрана 6 карт открытых, сверху 6 карт закрытых (карты компьютера), партия на столе (динамика: подброс новой карты), колода карт сбоку)
- Как бы вы разработали алгоритм работы с козырной масти? (к примеру, присвоение элементу козырной масти флага var trump = true, если карта козырная. Работа с ролями карт (обычная, козырная))