RS Game Maker Community
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

 
Расширенный поиск
  Главная  Форум   Вики Блоги FAQ Игры Статьи Примеры Войти Регистрация  
Вики
Все желающие приглашаются редактировать вики. Можете писать о своих (или чужих) играх, размещать туториалы, постить статьи - главное навесить категорию.
Страниц: 1 2 3 4   Вниз
  Печать  
Fungeoid [игра для программистов, головоломка]
0 Пользователей и 1 Гость смотрят эту тему.
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

18 Марта 2018 в 21:17
Пару лет назад я наткнулся на игрушки TIS-100 и MHRD, поиграл, понравились.
Долго вынашивал идею, что еще можно сделать "для программистов". Вспомнил про эзотерические языки, в частности, про Befunge.

Подробное описание языка под спойлером.
Befunge — стековый эзотерический язык программирования. Считается двумерным, так как программа на Befunge записывается в таблицу со сшитыми краями (тор), по которой в различных направлениях перемещается интерпретатор, исполняя команды, расположенные в её ячейках.

Язык имеет вот такие команды:
перемещение (9):
  • >   Двигаться вправо
  • <   Двигаться влево
  • ^   Двигаться вверх
  • v   Двигаться вниз
  • _   Двигаться вправо, если на вершине стека 0, иначе — влево.
  • |   Двигаться вниз, если на вершине стека 0, иначе — вверх.
  • ?   Двигаться в случайном направлении
  • #   Пропустить следующую ячейку ("трамплин")
  • @   Конец программы
манипулирование со стеком (3):
  • :   Поместить в стек копию вершины (forth:DUP)
  • \   Обменять местами вершину и подвершину (forth:SWAP)
  • $   Удалить вершину (forth:DROP)
модификация кода программы (2):
  • p   "PUT": со стека извлекаются координаты ячейки и ASCII-код символа, который помещается по этим координатам
  • g   "GET": со стека извлекаются координаты ячейки; ASCII-код символа по этим координатам помещается в стек
константы (2):
  • 0-9   Поместить число в стек
  • "   Начало/конец символьного режима, в котором ASCII-коды всех текущих символов программы помещаются в стек
стековые арифметические операции (5):
  • +   Сложение вершины и подвершины (forth:+)
  • -   Вычитание вершины и подвершины (forth:-)
  • *   Умножение вершины и подвершины (forth:*)
  • /   Целочисленное деление (forth:/)
  • %   Остаток от деления (forth:MOD)
стековые логические операции (2):
  • !   Отрицание: нуль на вершине заменяется на 1, ненулевое значение — на 0 (forth:0=)
  • `   Сравнение "больше, чем": если подвершина больше вершины, в стек помещается 1, иначе 0 (forth:>)
ввод-вывод (4):
  • &   Запросить у пользователя число и поместить его в стек
  • ~   Запросить у пользователя символ и поместить в стек его ASCII-код
  • .   Распечатать вершину стека как целое число (forth:.)
  • ,   Распечатать символ, соответствующий ASCII-коду на вершине стека (forth:EMIT)

И пример программы от туда же:
>                          v
@,,,,,,,,,,,,"Hello World!"<
Более наглядный пример:
22+
В стек будет помещена двойка, потом еще двойка.
Когда интерпретатор наткнется на "+" - он достанет со стека два числа, сложит их и поместит в стек результат.

На первый взгляд язык может показаться не много сложным, но по факту же, с ним можно разобраться за 15 минут, написав пару программ.

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

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

В данный момент, спустя пару часов разработки, у меня есть интерпретатор и почти готовый редактор. Думаю 3-4 дня потрачу на то, чтобы навести порядок, продумаю как делать "задания" и кину вам демку.

Скриншотик для затравки:
На скриншоте - почти готовый редактор. Почти - по тому, что я пока не знаю как сделать его удобным для редактирования "2д-тянпрограмм".
Цветастые полосы - это возможные траектории выполнения кода программы. Строятся на лету, при вводе кода.

Глобальные задачи:
  • Допилить редактор
  • Придумать удобный менеджер миссий
  • Прикрутить таблицу рекордов
  • Разобраться с дизайном, сюжетом, графической частью (если она вообще будет)
  • Релизнуться в стиме

Последнее редактирование: 18 Марта 2018 в 21:44 от Илья

 
Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 41 16 Апреля 2018 в 00:14
Run либо не работает, либо ему что-то от меня требуется, не могу понять что.
Руками считать количество инструкций неудобно.
И ещё, Esc для закрытия опасен, я вот сейчас случайно закрыл, и пытаюсь понять что у меня там было пришлось повторно делать.

EDIT: поменял на rctlr, работает. Клавиши return и enter не работают.

EDIT2:

Красная ячейка лишняя, без неё выйдет 245/18
Хотя признаюсь, я поглядел в исходники и узнал, что делает каждая функция.

EDIT3: input.txt, твой вариант можно ускорить на 38 шагов, добавив лишь две инструкции.

EDIT4: нашёл баг, счётчик инструкций не уменьшается при удалении инструкции.

EDIT5:

EDIT6:

EDIT7:
Лучше пойду спать. Если кто побъёт этот рекорд - флажок в руки, я уверен что быстрее только спамом инструкций.
Последнее редактирование: 16 Апреля 2018 в 01:11 от Кто-тo
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 42 16 Апреля 2018 в 11:26
Run либо не работает, либо ему что-то от меня требуется, не могу понять что.
Ммм, мне тут в голову мысль пришла - а не перешел ли ты, случайно, в один из режимов? Возможно, это был режим отладки/режим выбора направления курсора. Скорее всего, последний. В чем его суть - когда нужно сменить направление курсора - нажимаем ctrl, затем стрелку, куда будем двигаться.

Наверное, стоит менять цвет полоски внизу при смене режимов, чтобы акцентировать на этом внимание.

И ещё, Esc для закрытия опасен, я вот сейчас случайно закрыл
Эх, сорян. Я уберу это сегодня, да.

EDIT: поменял на rctlr, работает. Клавиши return и enter не работают.
Блин, очень странно. Перепроверю все сегодня, но все таки, мне кажется, что ты случайно вошел в какой-либо режим.

EDIT4: нашёл баг, счётчик инструкций не уменьшается при удалении инструкции.
Спасибо, починю =)

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 43 16 Апреля 2018 в 15:55
EDIT: поменял на rctlr, работает. Клавиши return и enter не работают.
Блин, очень странно. Перепроверю все сегодня, но все таки, мне кажется, что ты случайно вошел в какой-либо режим.
Я разобрался в режимах, особенно что режим выбора направления включается сразу после ввода _ и |, дело не в них.
Даже сразу после запуска игры, если нажимать Enter, ничего не происходит. Но в модифицированном файле при нажатии изменённой клавиши оно работает.
Я считаю, что это баг в Löve 11.0.0, либо они опять что-то поменяли.

Кстати о вводе _ и |. После нажатия стрелки пусть курсор переходит на одну ячейку, чтобы дважды стрелочку не нажимать.

EDIT: Ни в 11.1, ни в 0.10.2 со старым файлом не работает. Во всех трёх случаях использовалась 64-битная Windows версия.
Последнее редактирование: 16 Апреля 2018 в 16:15 от Кто-тo
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 44 16 Апреля 2018 в 22:32
И ещё, Esc для закрытия опасен
Закрытие по ESC убрал.

нашёл баг, счётчик инструкций не уменьшается при удалении инструкции
Вроде бы исправил. Сейчас при нажатии delete инструкции пересчитываются.

Хотя признаюсь, я поглядел в исходники и узнал, что делает каждая функция.
Таки нужно будет сделать туториал =)

Кстати о вводе _ и |. После нажатия стрелки пусть курсор переходит на одну ячейку, чтобы дважды стрелочку не нажимать.
Тоже сделал. Если вход в режим выбора направления курсора произошел автоматически, то после выбора направления будет совершен переход.
Если же вход в режим выбора направления был произведен игроком, то перехода не будет.

Наверное, стоит менять цвет полоски внизу при смене режимов, чтобы акцентировать на этом внимание.
Это тоже сделал, правда цвета там ужасные, потом подберу нормальные.



Ну а теперь перейдем к твоему багу - увы, я не смог его воспроизвести.
Тестил на трех разных машинах (2 из них - Win10 64), на трех разных версиях Löve (11.1, 11, 0.10.2).
Везде все работает =(

Единственное, что я могу предложить сейчас - билд, в котором при нажатии на кнопку, будет выводится, собственно, нажатая кнопочка.
Так мы сможем глянуть что у тебя вообще происходит при нажатии на enter.

П.С. Сама "последняя нажатая кнопочка" будет отображаться в левом верхнем углу.
Прикреплённые файлы
* fungi.love.zip (170.92 Кб - загружено 21 раз.)

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 45 16 Апреля 2018 в 22:52
При нажатии Enter выводит kpenter, т.е. Numpad'овский.
Должно быть особенность ноутбука Prestigio 133S, поскольку у него физически нет места под Numpad, и клавиши Num Lock с Fn никак не влияют на отсылаемый код клавиши.
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 46 17 Апреля 2018 в 22:46
Отлично, разобрались =)

Сейчас фиксану это и постараюсь добавить новое задание, более интересное.

UPD: По ходу сегодня демки не будет. Хотел по быстрому сделать две "мелких" штуки, все вылилось в исправления десятка багов и полное не понимание сути происходящего.
Последнее редактирование: 18 Апреля 2018 в 00:10 от Илья

Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 47 19 Апреля 2018 в 00:08
Сегодня сделал отображение текущей позиции в списках входных и выходных данных. Указатель стоит на следующем числе, которое будет передано в программу и, соответственное, на следующем числе, которое должно быть возвращено программой.

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

Скоро будет новая демка, как раз с задачкой на последовательности, а пока скрин =)


Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 48 20 Апреля 2018 в 00:05
Я таки сделал новое задание и демку =)

Суть задачи - нужно найти длины последовательностей, которые заканчиваются нулями. Прям как сишные строки, ага.

Мое решение под спойлером (как всегда, без намека на оптимизацию):

И новая демка, для запуска нужен LOVE 11/11.1

П.С. Сейчас придет Кто-то и напишет реализацию в два раза быстрее, отвечаю.
Прикреплённые файлы
* fungi.love.zip (171.57 Кб - загружено 19 раз.)

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 49 20 Апреля 2018 в 03:01
Самый быстрый, который возможно сделать - 615.
Я не скажу как, поэтому выкладываю второй по скорости вариант. Если никто не догадается, то я его выложу.
input.txt
Не очень
Активный участник
**

Репутация: 19
Offline Offline

Сообщений: 145


12.8 Gb

Ответ № 50 20 Апреля 2018 в 03:05
Илья, ты зачем стек перевернул?)


UPD
Самый быстрый, который возможно сделать - 615.
Это если без читов.

Хотя я кажется понял, как это сделать. Эх, было бы поле 16х16...

UPD 2
Что, если я скажу тебе, что это можно честно пройти за 320 циклов?
(Блин, чем я занимаюсь в два часа ночи...)
Последнее редактирование: 20 Апреля 2018 в 04:22 от input.txt
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 51 20 Апреля 2018 в 12:35
Самый быстрый, который возможно сделать - 615.
Я не скажу как, поэтому выкладываю второй по скорости вариант. Если никто не догадается, то я его выложу.
Да, классная реализация =)

Илья, ты зачем стек перевернул?)
Мне кажется, так правильнее. Ведь во всех книжках есть аналогия со "стаканом", в который помещают значения. "Перевернутый" стек - как раз очень похож на стакан =)

Это если без читов.
Блин, вот такого читинга я и боялся, ага. Как думаете, как обезопасить игру от таких решений? Тупо сделать поле меньше - не хочется =(

Что, если я скажу тебе, что это можно честно пройти за 320 циклов?
Эм, как? Это интригует =)

UPD: Сегодня будет важный пост, будем выбирать куда двигаться дальше =)

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 52 20 Апреля 2018 в 16:02
Блин, вот такого читинга я и боялся, ага. Как думаете, как обезопасить игру от таких решений? Тупо сделать поле меньше - не хочется =(
Сделать обязательным чтение ввода.
Можно ещё сделать обязательным вывод после ввода необходимых значений, но это может добавить головной боли в будущем.

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

Хотя если убрать !, и переставить местами ветки, выйдет 615/12
UPD 2
Что, если я скажу тебе, что это можно честно пройти за 320 циклов?
(Блин, чем я занимаюсь в два часа ночи...)
Показывай. Хотя у меня предчувствие, что ты сделал без смены направления спамом инструкций. Но это будет быстрее чем мой честный 613.
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 53 20 Апреля 2018 в 16:15
Сделать обязательным чтение ввода.
Точно, хорошее решение =)

Раз мы начали о предложениях, я считаю что стоит добавить возможность сдвигать сетку, с или без переноса стартовой позиции
Ммм, кажется я понял о чем ты. Т.е. в твоем случае, чтобы не писать код в самой последней строчке, просто "сдвигаем" сетку на верх, и все.
Так же?

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 54 20 Апреля 2018 в 16:37
Скорее вниз, чтобы начало программы оставалось на той же изначальной инструкции, но при этом программа не уходила через край сетки.
Хотя гораздо проще сделать не сдвиг, а выбор стартовой позиции.
Вот пример, используя прошлое задание:
ПоказатьОригинал
ПоказатьС тем, что я предлагаю

Зелёный - стартовая позиция.
На баланс это никак не повлияет, только упростит понимание происходящего.
input.txt
Не очень
Активный участник
**

Репутация: 19
Offline Offline

Сообщений: 145


12.8 Gb

Ответ № 55 20 Апреля 2018 в 21:18
Мне кажется, так правильнее. Ведь во всех книжках есть аналогия со "стаканом", в который помещают значения. "Перевернутый" стек - как раз очень похож на стакан =)
Тогда пусть стакан снизу заполняется

Блин, вот такого читинга я и боялся, ага. Как думаете, как обезопасить игру от таких решений? Тупо сделать поле меньше - не хочется =(
В TIS-100 на каждое задание четыре теста, из них один рандомный (каждый раз разный)

А теперь решение 320 / 153:
ПоказатьСпойлер
ПоказатьСПОЙЛЕР
Ну или как-то так

Но это будет быстрее чем мой честный 613.
Не знаю, какой смысл ты вкладываешь в понятие "честный". Для меня это решение, печатающее правильный ответ для любых корректных входных данных.
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 56 20 Апреля 2018 в 21:24
Хотя гораздо проще сделать не сдвиг, а выбор стартовой позиции.
Ага, я понял. Это классная идея, нужно прикрутить =)

Такс, ну а теперь, собственно, перейдем к "серьезным" вопросам =)

Сколько бы задачек вам интересно было решить с текущим функционалом?
Я пришел к тому, что нужно штук 10. У меня есть вот такой список задачек:

Реализованные:
  • Умножение чисел на два
  • Нахождение ABS
  • Нахождение длины последовательности

В запасе:
  • Если N < 0 => -1, N == 0 => 0, N > 0 => 1 - имхо, скучная фигня, т.к. слишком похожа на задачку с ABS
  • Сумма последовательности - вроде интересно, но очень похоже на "Нахождение длины последовательности"
  • Нахождение min и max числа в последовательности
  • Сортировка последовательности
  • Вывести обратную последовательность
  • Нахождение подряд идущих одинаковых чисел

Т.е. имеем 3 готовых задачки, еще 4 точно можно сделать, итого 7. Подкинете идей для задач?



Далее - не хочется же останавливаться на 10 задачах, верно? Нужно придумать другие интересные варианты геймплея.

У меня есть следующие идеи:
  • Запилить простенький пиксельный дисплей, скажем 32х32, и рисовать на нем. Если честно, мне не очень нравится такой вариант из за того, что не понятно, какие интересные задачки кроме вывода графиков можно сделать с его помощью.
  • Реализовать команды (p g) из Befunge, которые модифицируют код программы. Пилить задачки которые невозможно пройти без модификации кода. Тут проблема всего одна - нужно быть сверхразумом, чтобы пилить такие задачи, мне кажется.

Может быть, у вас есть какие-то идеи?

UPD: input.txt, набиваю ответ =)

Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 57 20 Апреля 2018 в 21:36
Тогда пусть стакан снизу заполняется
Блин, тут в чем проблема - стек может быть большой. Не понятно, как его в таком случае обрезать и помещать на экран. В текущем варианте такой проблемы просто нет, отчасти по этому я его и выбрал.

В TIS-100 на каждое задание четыре теста, из них один рандомный (каждый раз разный)
У меня, по сути, каждое задание рандомное. Только ГПСЧ не инициализирован, по этому он всегда одни и те же числа генерит =)

А вообще, задачка выглядит вот так:
Task = {}

function Task.getName()
  return "- FIRST TASK -"
end

function Task.getDescription()
  return {
    "> READ N FROM INPUT",
    "> MULTIPLE N BY 2",
    "> SEND N TO OUTPUT",
  }
end

function Task.getStreams()
  local input = {}
  local output = {}
  for i = 0, 39 do
    input[i] = math.random(1, 99)
output[i] = input[i] * 2
  end
  return input, output
end

return Task;

А теперь решение 320 / 153:
Классно выглядит, жаль, что я еще не прикрутил сохранение и загрузку "программ", было бы интересно пускануть это.

Да вообще, был бы интересно пускануть все ваши проги, не только эту.

Кто-тo
Ветеран форума
*****

Репутация: 81
Offline Offline

Сообщений: 1 112


Ответ № 58 20 Апреля 2018 в 21:37
Но это будет быстрее чем мой честный 613.
Не знаю, какой смысл ты вкладываешь в понятие "честный". Для меня это решение, печатающее правильный ответ для любых корректных входных данных.
Честный наверное не лучшее слово, которое я выбрал.
Его, как минимум, можно определить как тот, который из входных данных получает выходные, и не сломается от смены ввода и вывода.
Показать613/12, про который я упомянул
У меня, по сути, каждое задание рандомное. Только ГПСЧ не инициализирован, по этому он всегда одни и те же числа генерит =)
Для изначального варианта seed лучше оставить один на все варианты, чтобы было проще разобраться. Вот когда уже первый окажется решён правильно, тогда уже следует запускать второй набор данных, случайный, чтобы знать что программа на самом деле решает задачу.
Так останется и «соревнование» на быстрый/компактный, и проверка на «честное» решение.
Классно выглядит, жаль, что я еще не прикрутил сохранение и загрузку "программ", было бы интересно пускануть это.
Проще всего взять «сырые» данные, возможно сжать какой нибудь библиотекой, обернуть результат в base64, и копировать в буфер обмена.
Последнее редактирование: 20 Апреля 2018 в 21:51 от Кто-тo
Илья
Ветеран форума
*****

Репутация: 100
Offline Offline

Сообщений: 1 571

Ответ № 59 21 Апреля 2018 в 16:29
Хотел сегодня накидать меню, но видимо не успею, т.к. наткнулся на какую-то странную ошибку:
https://stackoverflow.com/questions/49955267/attempt-to-call-method-load-nil-value

Тупо не могу создать несколько экземпляров одного и того же класса.

input.txt
Не очень
Активный участник
**

Репутация: 19
Offline Offline

Сообщений: 145


12.8 Gb

Ответ № 60 21 Апреля 2018 в 18:50
О вреде глобальных переменных: ты переопределяешь Task в tasks/task_*.lua
Если писать local Task = {}, то всё ок. Правда непонятно почему Task.new() во втором случае вообще вызывался, так как Task к этому моменту уже должен был перезаписаться.
Страниц: 1 2 3 4   Вверх
  Печать  
 
Перейти в:  

RSGMC (gmakers.ru) © 2007—2018
Счётчик–@Mail.ru