[Из песочницы] Создание игры «Слова из Слова»

Добрый день! Хочу представить Вашему вниманию проект-игру «Слова из Слова». Относительно недавно я стал изучать web-программирование и, так как лучший учитель — это практика, решил написать свой вариант довольно-таки известной игры «Слова из Слова». Основная цель — использование чистого Javascript без подключения дополнительных библиотек.

image
Вид игрового поля

Описание игры


Задача игрока — из букв представленного на экране слова составлять другие. Составленное слово должно быть нарицательным именем существительным в единственном числе, уменьшительно-ласкательные формы, а также сокращения не принимаются. Минимальная длина — 3 буквы. За каждое отгаданное слово начисляются очки в зависимости от его длины (базовая ставка за каждую букву, умножаемая на коэффициент). Базовая ставка равняется десяти очкам. Коэффициент рассчитывается следующим образом:
  • три буквы — 1;
  • от четырех до пяти букв — 1.25;
  • от шести до семи букв — 1.5;
  • от восьми до девяти букв — 1.75;
  • более девяти букв — 2.

На каждом уровне игрок может заработать дополнительные очки, выполняя определенные условия:
  • отгадать 40 проц. возможных слов на уровне (1 000 очков);
  • отгадать три слова, начинающихся на ту же букву, что и слово уровня (500 очков);
  • отгадать все возможные слова на уровне (50 000 очков).

Отгаданные игроком слова отображаются на игровом поле в алфавитном порядки, сгруппированные по количеству букв в слове. Игрок может посмотреть значение каждого, нажав на него. Результаты охраняются каждый раз после верно отгаданного слова.

Использованные техники и приемы


В ходе работы над приложением использовались элементы подхода MVC (model, view, controller). В отдельные компоненты также вынесено управление звуком, обработка результатов игры и общие методы для всего приложения.
Общая структура приложения
GAME = {
    "utils":{}, // общие инструменты
    "sounds":{}, // обработка звуков
    "view":{}, // представление
    "controller":{}, // обработка поведения
    "model":{}, // основные данные
    "results":{} // обработка результатов
}
GAME.init(place) // инициализация приложения
GAME.namespace(ns_string) // создание пространств имен


В процессе разработки ощутил все преимущества использования замыканий и немедленно вызываемых функций. Так, их использование избавило от постоянного поиска элементов на странице посредством getElementById и т.п.
Пример использования замыканий
controller.play = (function () {
            // блокировка множественного нажатия
            var cancelClick = false;

            return function (letter) {
                if (cancelClick) return;

                cancelClick = true;

                setTimeout(function () {
                    cancelClick = false;
                }, 200)
                
                //код функции
             })()


Этапы выполнения приложения


В процессе инициализации приложения создаются все необходимые html-элементы, формируются объекты-списки для упрощения доступа к ним.
Содержимое html до инициализации

    

Правила

Необходимо составлять слова из показанного на экране слова. Слово должно быть нарицательным именем существительным в единственном числе. Уменьшительно-ласкательные формы, а также сокращения не принимаются. Минимальная длина слова - 3 буквы.

Управление

Чтобы выбрать букву, кликните мышкой. Повторный клик по последней выбранной букве снимает выделение.

Клавиша Esc отменяет ввод всего слова.

Клавиша Backspace (←) отменяет ввод последней буквы.

Игровые бонусы

Первая звезда - отгадать 40% возможных слов на уровне. Бонус: 1 000 очков.

Вторая звезда - отгадать три слова, начинающихся на ту же букву, что и слово уровня. Бонус: 500 очков.

Третья звезда - отгадать все возможные слова на уровне. Бонус: 50 000 очков.

Подсказки

Показать определение неотгаданного слова. Стоимость подсказки: 100 очков

Показать неотгаданное слово. Стоимость подсказки: 500 очков.

Элементы интерфейса

Управление звуком.

Вызов игрового меню.

Прогресс на уровне.



Содержимое html после инициализации

    

Слова из слова

Игрок: 123
Уровень: 1
Очки: 0

Подсказки:

Показать определение неотгаданного слова. Показать неотгаданное слово целиком.
Первая звезда Вторая звезда Третья звезда
Выключить звук Меню Помощь
р
о
д
и
н
а

Все информация о прохождении игроком уровня сохраняется в объекте GAME.model.level
Хранение информации о прохождении
level = {
     "1":{
       "wordForLevel":"родина",
       "foundWords":["род","анод","аир"],
       "missions": {
             "progress":3,
             "firstStar":true,
             "secondStar":true,
             "thirdStar":true
             }
         }
      }

Для того, чтобы как-то сохранять прогресс и не задействовать при этом серверные скрипты и базы данных, был выбран способ сохранения в localStorage браузера. Кроме того, реализовал «таблицу рекордов» для игроков, которые используют это приложение в одном и том же браузере
Метод сохранения
/**
     * Сохранение результатов.
     * @method GAME.controller.storeResults
     * @param {string} name
     * Имя игрока.
     */
    controller.storeResults = function (name) {
        var results = {
            level: GAME.utils.createClone(model.level),
            score: model.score
        }
        results = JSON.stringify(results);
        window.localStorage.setItem(name, results);
    }

Таким образом, представляю Вам на обсуждения мой проект. Буду рад выслушать конструктивную критику и предложения как в комментариях, так и в личном общении. Если интересуют подробности, с удовольствием расскажу о процессе написания подробнее.
Ссылка на репозиторий GitHub

Комментарии (3)

  • 22 августа 2016 в 16:33

    0

    Такую игру бы на смартфоны, был бы отличный таймкиллер.

  • 22 августа 2016 в 16:42

    0

    Так есть уже. Вовсю играю.
  • 22 августа 2016 в 16:44

    0

    Неплохо было бы прикрутить внешний ресурс со словами…

© Habrahabr.ru