суббота, 19 декабря 2015 г.

EV3 Hunt the Wumpus. Игра "Охота на Вампуса"


Кто такой Вампус и зачем на него охотиться?




Hunt the Wumpus («Охота на Вампуса») — классическая текстовая компьютерная игра, написанная Грегори Йобом в 1972 году. Цель этой игры заключалась в том, чтобы, путешествуя по лабиринту, найти Вампуса и застрелить его. Часто саму игру называют просто «Вампусом». Вампус — фантастический большой и опасный монстр, обитающий в пещерах. Вампус источает отвратительный запах, имеет крайне чувствительный слух и питается людьми. Известно также, что Вампус очень тяжёл, ноги его имеют присоски, а сам он большую часть времени проводит в спячке.



Мир «Hunt the Wumpus» — это пещера из 20 пронумерованных комнат, каждая из которых соединена тоннелями с тремя другими, т. е. пещера представляет собой расплющенный додекаэдр.



В начале игры персонаж случайным образом оказывается в одной из комнат пещеры. В какой-то из комнат спит Вампус. Задача игрока — найти Вампуса и убить его. За ход он может либо выстрелить в одну из трёх соседних комнат, либо перейти в какую-нибудь из них.

Игрок имеет арбалет с пятью стрелами. Для убийства Вампуса достаточно и одной стрелы. Если стрела попала в Вампуса, то игрок победил и игра окончена. Стрелы у игрока не простые, а волшебные — они могут делать повороты во время полёта. Каждая стрела может пролететь 5 соседних комнат.

Путешествуя по лабиринту, игрок в ходе игры составляет представление о том, как связаны друг с другом комнаты в пещере. 




Стреляя, игрок должен указать номера комнат, через которые пролетит его стрела. Если он ошибётся с номерами комнат и, к примеру, укажет комнаты, не связанные общим тоннелем, то стрела начнёт летать по пещере случайным образом и может даже попасть в самого игрока. Если это произошло, то он проиграл.

Игрок проигрывает и в том случае, если он истратит все 5 стрел, но так и не убьёт Вампуса. Попав в какую-либо комнату, игрок мог почувствовать отвратительный запах, услышать шум или почувствовать сквозняк.


Источником отвратительного запаха является спящий Вампус. Запах чувствуется, если Вампус находится в какой-то из соседних комнат. Сквозняк и шум всегда доносятся из соседней комнаты, но неизвестно, из какой именно. В комнатах, откуда идёт сквозняк, находятся бездонные ямы, попав в которые, игрок погибает и, соответственно, проигрывает. Из 20 комнат в пещере две имеют ямы.

В комнатах, откуда доносится шум (таких комнат в пещере тоже две), обитают гигантские летучие мыши(«super bats»). Если игрок зашёл в комнату к этим мышам, то они хватают его и случайным образом переносят в любую другую комнату в пещере. В том числе, не исключён вариант, что мыши перенесут игрока в комнату с ямой или сбросят его на голову Вампусу.

Вампуса можно разбудить только двумя способами: войдя в комнату, где он спит, или выстрелив из лука в любой из комнат в пещере.

Если игрок окажется в одной комнате с Вампусом, то он проиграл — Вампус съедает его. Если же Вампус проснулся от звуков выстрела в пещере, то у игрока ещё есть шансы.
Проснувшись, Вампус может либо заснуть снова (с вероятностью 0,25), либо перейти спать в одну из соседних комнат. Кстати, комнаты с ямами и летучими мышами Вампусу не страшны. У него на ногах есть присоски, с помощью которых он выбирается из любой ямы, а его огромный вес не даёт гигантским летучим мышам его переносить. Если Вампус отправляется спать в комнату, где находится игрок, то игрок проигрывает, а Вампус получает обед.

Из истории игры


«Охота на Вампуса» — первая в истории текстовая, а также первая приключенческая игра. Она была чрезвычайно популярна в 1970—1980-е годы. Программистам эта игра так полюбилась, что, пользуясь её размером (около 200 строк кода, половину из которых занимают вывод на экран и комментарии), они встраивали её в различные программы. Известно, что в корпоративной операционной системе R&D была системная команда «to Wumpus», запускавшая игру.



Позже появились и графические версии этой игры, отличающиеся от оригинальной другими лабиринтами и ловушками. В настоящее время версии «Hunt the Wumpus» доступны в Интернете для большинства операционных систем и устройств, включая GNU/Linux, Commodore, Sinclair ZX Spectrum,SunOS, Macintosh, Palm Pilot и мобильные телефоны.



EV3 версия игры


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



Для сборки мы использовали робототехническую платформу LEGO Mindstorms EV3 в ее образовательной версии. Вам понадобятся все 4 датчика из набора и большой мотор. Датчики используются следующим образом:

  • Порт 1. Гироскоп отслеживает "направление вашего взгляда" в мире игры и разворачивает персонажа
  • Порт 3. Датчик-кнопка используется для выстрела (для указания команды выстрела и последующего спуска тетивы после указания маршрута стрелы)
  • Порт 2. Датчик-кнопка служит для перемещения "в направлении взгляда"
  • Порт 4. Цвето-световой датчик подсвечивает события в игре (синий - все спокойно, красный - рядом опасность)


Для того, чтобы вы смогли собрать игру мы подготовили пошаговую инструкцию по сборке, ее можно скачать по ссылке. Для просмотра необходима программа LEGO Digital Designer или Adobe Reader. Не иатягивайте тетиву слишком туго, детали LEGO могут не выдержать такой нагрузки. Для тетивы арбалета лучше использовать эластичную нитку.


Программу вы также можете скачать по ссылке. Озвучка игры произведена генератором голоса с сайта www.ivona.com



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

В момент запуска программы рекомендуем расположить арбалет на ровной горизонтальной поверхности и не трогать его в первые 2-3 секунды. В это время производится устранение дрейфа гироскопа.

Карта пещеры взята нами из классической игры и имеет следующий вид:


Для удобства ориентации на карте Вы можете склеить себе 3D-модель додекаэдра и подписать на нем номера комнат.




Как играть в игру?


После того, как арбалет собран, программа закачана в блок и запущена, Вы услышите 3-х минутное вступление, из которого узнаете о мире игры и ее целях. Прервать болтовню можно в любой момент, нажав на выстрел.

После этого происходит расстановка персонажей на карте и начинается игра. Первый ход - игрока. Вы оказываетесь в одной из комнат пещеры, номер комнаты Вы  услышите и увидите на экране. Кроме этого появится и будет произнесена информация о номерах комнат, в которые Вы видите проходы и о возможных опасностях.
На каждом из ходов Вы должны выбрать - на что потратите свой ход - на движение или выстрел. Чтобы перейти в соседнюю комнату - однократно нажмите на кнопку под большим пальцем. После этого нужно выбрать в какую из трех соседних комнат вы пойдете. Для этого нужно развернуться на нее (вы услышите и увидите на экране подсказки, в какую комнату ведет проход перед вами) и снова нажать кнопк движения.
Если вместо движения Вы решите выстрелить - нужно нажать на кнопку выстрела. После этого нужно указать 5 последовательных комнат, через которые полетит стрела, разворачиваясь на них и нажимая движение. Затем нажать на выстрел. Можно выстрелить ближе, чем на 5 комнат, нажав ан выстрел на любом из 5 шагов планирования маршрута стрелы.
Вы можете выиграть только одним способом - попасть стрелой в Вампуса, а вот погибнуть у игрока - целых семь способов:
1) зайдя в комнату, где спит Вампус
2) от неудачного выстрела Вампус может проснуться и пойти Вас искать - если он зайдет в комнату, где вы сейчас находитесь - Вы проиграли
3) Вы можете провалиться в одну из двух бездонных ям
4) Летучие мыши могут схватить Вас и сбросить в комнате, где спит Вампус
5) У Вас могут закончиться стрелы
6) Летучие мыши могут сбросить Вас в бездонную яму
7) Вы можеет попасть стрелой сами в себя

Как выглядит наша программа?


Программу мы написали в среде LEGO EV3-G. Так как EV3-G не поддерживает многомерные массивы, нам пришлось сделать "эмуляцию" двумерного массива с помощью пользовательских блоков. При желании вы можете посмотреть в программе как это реализовано.


Голосовое вступление, как и прочая игровая озвучка, записано с помощью генератора голоса IVONA-MAXIM:



В массиве L мы храним начальное (и последующее на время игры) положение игрока (ячейка 1), Вампуса (ячейка 2_, бездонных ям (3 и 4) и летучих мышей (5 и 6).
В "двумерном" массиве S - карту пещеры, каждая строка содержит три номера комнат, с которыми связана комната с номером, соответствующим номеру данной строки.
В массиве arrows будем хранить маршрут стрелы во время планирования выстрела.



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



Блок INFO оповещает игрока об опасностях - наличии в соседних комнатах Вампуса, бездонных ям и летучих мышей: выводом на экран, голосом и цветом подсветки датчика.



Во время хода игрока он выбирает, на что потратит свой ход. Выбрав команду "идти" он попадает в блок движения, с помощью которого он перемещается в соседнюю комнату. Этот блок также проверяет ход игрока на игровые ситуации, допустимые в моменты передвижений по карте.



Выбрав команду "выстрел" игрок запускает блок планирования маршрута стрелы. Полет стрелы может пролегать через 1..5 комнат, в которых проверяется совпадение с комнатами Вампуса и игрока.



Упрощенно, на псевдокоде наша программа выглядит следующим образом:

// массив S содержит карту пещеры
МАССИВ S(20,3) = {2,5,8,
                  1,3,10,
                  2,4,12,
                  3,5,14,
                  1,4,6,
                  5,7,15,
                  6,8,17,
                  1,7,9,
                  8,10,18,
                  2,9,11,
                  10,12,19,
                  3,11,13,
                  12,14,20,
                  4,13,15,
                  6,14,16,
                  15,17,20,
                  7,16,18,
                  9,17,19,
                  11,18,20,
                  13,16,19}

// массив L с номерами комнат 1я ячейка игрок , 2 = Вампус, 3 & 4 = ямы, 5 & 6 = летучие мыши
МАССИВ L(6) 

// выбираем случайным образом номера комнат, в которых будут располагаться в начале игры игрок, Вампус, две ямы и две летучие мыши, в одной комнате на старте не может быть более одной сущности

ПЕЩЕРА = 0  - начальная пещера
ЦИКЛ_ПОКА ПЕЩЕРА < 6
  НОМЕР = СЛУЧАЙНОЕ_ЧИСЛО(20) 
  // проверяем, нет ли в ней кого-то
  // триггер 1=комната открыта, 0=комната используется
  ОК = 1  
  СЧЕТЧИК i ОТ 1 ДО ПЕЩЕРА
    // если истина - комната используется
    ЕСЛИ НОМЕР=L(i) ТОГДА ОК = 0 
  СЛЕДУЮЩИЙ i
  // если комната свободна, заполняем ее
  ЕСЛИ ОК=1 ТОГДА   
    ПЕЩЕРА = ПЕЩЕРА + 1
    L(ПЕЩЕРА) = НОМЕР    
КОНЕЦ_ЦИКЛА_ПОКА

// количество стрел у игрока
A=5 
// номер комнаты, где сейчас игрок
L=L(1) 
// F - исход игры
F = 0   

// НАЧАЛО ОСНОВНОГО ИГРОВОГО ЦИКЛА

ЦИКЛ_ПОКА (F=0)

  БЛОК(ИНФО)
  ЖДАТЬ НАЖАТИЯ КНОПКИ (2 ИЛИ 3)
  // Выбор Идти или стрелять
  ЕСЛИ НАЖАТА КНОПКА(2) ТОГДА БЛОК (ВЫСТРЕЛ)
  ЕСЛИ НАЖАТА КНОПКА(3) ТОГДА БЛОК (ИДТИ)

КОНЕЦ_ЦИКЛА_ПОКА

// КОНЕЦ ОСНОВНОГО ИГРОВОГО ЦИКЛА

ЕСЛИ F=1 ТОГДА СКАЗАТЬ "Вы победили!"
ЕСЛИ F=-1 ТОГДА СКАЗАТЬ "Вы вошли в комнату Вампуса и он Вас съел"
ЕСЛИ F=-2 ТОГДА СКАЗАТЬ "Вы попали стрелой сами в себя и проиграли"
ЕСЛИ F=-3 ТОГДА СКАЗАТЬ "Вы потратили все стрелы, но так и не убили Вампуса, Вы проиграли"
ЕСЛИ F=-4 ТОГДА СКАЗАТЬ "Вы провалились в бездонную яму и проиграли"
ЕСЛИ F=-5 ТОГДА СКАЗАТЬ "Ваш выстрел разбудил Вампуса, он пошел Вас искать, нашел и съел"
ЕСЛИ F=-6 ТОГДА СКАЗАТЬ "Летучие мыши сбросили Вас прямо на Вампуса и он Вами пообедал"
ЕСЛИ F=-7 ТОГДА СКАЗАТЬ "Летучие мыши сбросили Вас прямо в бездоннуя яму. Вы проиграли"

КОНЕЦ_ПРОГРАММЫ

// далее - подпрограммы

БЛОК (ИНФО)
  СЧЕТЧИК J ОТ 2 ДО 6
    СЧЕТЧИК K ОТ 1 to 3
      ЕСЛИ S(L(1),K)=L(J) ТОГДА
        ЕСЛИ J = 2 ТОГДа СКАЗАТЬ "Я чувствую запах Вампуса!"
        ЕСЛИ J = 3 ИЛИ J = 4 ТОГДА СКАЗАТЬ "Я чувствую сквозняк!"
        ЕСЛИ J = 5 ИЛИ J = 6 ТОГДА СКАЗАТЬ  "Я слsшу летучих мышей!"      
    СЛЕДУЮЩИЙ K
  СЛУДУЮЩИЙ J
  СКАЗАТЬ "Вы находитесь в комнате ";L(1)
  СКАЗАТЬ "Туннели ведут к комнаты " S(L,1),S(L,2),S(L,3)
  Print

БЛОК (ВЫСТРЕЛ)
  L=L(1)
  СКАЗАТЬ "У Вас осталось", A, "стрел"
  СКАЗАТЬ "Выберите 5 комнат, связанных общим тоннелем"

  // массив с маршрутом стрелы
  Arrow = {0,0,0,0,0,0}

  Arrow(1) = L(1)

  P = 1
  ЦИКЛ_ПОВТОРЕНИЯ (5)
    ЕСЛИ НЕ (F = 0) ТОГДА ВЫХОД_ИЗ_ЦИКЛА
    P = P + 1
    ЖДАТЬ НАЖАТИЯ КНОПКИ (2 ИЛИ 3)
    // Выбор маршрут или стрелять
    ЕСЛИ НАЖАТА КНОПКА(2) ТОГДА ВЫХОД_ИЗ_ЦИКЛА
    ЕСЛИ НАЖАТА КНОПКА(3) ТОГДА 
      Arrow(P) = S(Arrow(P-1),БЛОК (ГИРОСКОП))
    // вы можте попасть стрелой в себя
    ЕСЛИ Arrow(P) = L(1) ТОГДА F=-2
    ЕСЛИ Arrow(P) = L(2) ТОГДА F=1
  КОНЕЦ_ЦИКЛА
    А = А - 1
    ЕСЛИ F=0 ТОГДА СКАЗАТЬ "Выстрел был неудачный, Вы не попали в Вампуса"
    ЕСЛИ СЛУЧАЙНОЕ_ЧИСЛО(100) > 75 ТОГДА
      L(2) = S(L(2),СЛУЧАЙНОЕ_ЧИСЛО(3))
      ЕСЛИ L(2) = L(1) ТОГДА F=-5
    ЕСЛИ А = 0 ТОГДА F=-3

БЛОК (ИДТИ)

  ЦИКЛ (ВСЕГДА)
    СКАЗАТЬ "Вы можете перейти в комнаты с номерами" S(L(1),1), S(L(1),2), S(L(1),3)
    ЕСЛИ НАЖАТА КНОПКА(3) ТОГДА ВЫХОД_ИЗ_ЦИКЛА
  КОНЕЦ_ЦИКЛА

  L(1) = S(L(1),БЛОК (ГИРОСКОП))

  ЕСЛИ L(1) = L(2) ТОГДА F=-1
  ЕСЛИ L(1) = L(3) ИЛИ L(1) = L(4) ТОГДА F=-4
  ЕСЛИ L(1) = L(5) ИЛИ L(1) = L(6) ТОГДА
    L(1) = СЛУЧАЙНОЕ_ЧИСЛО(20)
    СКАЗАТЬ "Летучие мыши схватили Вас и перенесли в комнату", L(!)
    ЕСЛИ L(1) = L(2) ТОГДА F = -6
    ЕСЛИ L(1) = L(3) ИЛИ L(1) = L(4) ТОГДА F = -7

БЛОК (ГИРОСКОП)
  G = СЕНСОР(ГИРОСКОП) + 36000 % 360
  ЕСЛИ G >= 0 И G <=120 ТОГДА ВЕРНУТЬ(1)
  ЕСЛИ G > 120 И G <=240 ТОГДА ВЕРНУТЬ(2)
  ЕСЛИ G > 240 И G <=359 ТОГДА ВЕРНУТЬ(3)




2 комментария:

  1. Здравствуйте, можете ли вы сделать модель арбалета и программы для домашней версии EV3?

    ОтветитьУдалить
    Ответы
    1. Уже сделали вот ссылка https://karandashsamodelkin.blogspot.ru/2015/12/ev3-home-31313.html

      Удалить

Самое популярное