июнь 18, 2021

Mathsticks 10

Добавить в
Мои игры
Торрент
Скачать

Эта игра была написана для конкурса ASCII Basic Game 10Liner 2021.

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

Цель игры

Постарайтесь решить как можно больше уравнений и как можно быстрее!

Найдите правильное уравнение, перемещая только одно совпадение из одного места в другое.

Знаки уравнения не могут быть изменены, вы можете изменять только числа.

Вы должны ввести первую цифру, затем вторую и результат сложения.

За правильный ответ вы получаете балл и переходите к следующему уравнению.

Иначе игра заканчивается. Затем вы увидите количество набранных очков и продолжительность игры в секундах. Наивысший результат считается лучшим только в том случае, если он набран за самое короткое время. К этому стремятся все чемпионы!

Примечания

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

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

Проблемы кодирования

Что усложняет эту задачу, так это то, что программа должна уместиться не только в десять строк, но и в 72 символа в строке. Из-за этого я играл с разными идеями и в tВ конце я создал четыре версии, включая другой подход к поиску совпадений на экране, рандомизацию чисел и проверку ответов. Это потребовало перестановки множества команд, чтобы сжать их в одну строку, и поиска некоторых шаблонов после написания части кода, чтобы сделать вещи умнее. Или, короче, я все еще думаю, что есть способ сделать этот код более умным! Должны быть, верно? Это был своего рода вопрос о бесконечности возможных решений при ограниченном количестве доступных строк.

Самый простой трюк, который я использовал, заключался в распространении инициализации переменных с помощью READ и DATA. Итеративно мне нужно было переместить вещи в разные строки и посмотреть, подходит ли это. Много подкачки и сохранение места для символов, как у наиболее распространенных чисел, встречающихся в игре. «10» занимает два места, но при присвоении переменной «Z» занимает одно место!

Чтобы сэкономить место для символов, я также определил функцию рандомизации, которая сохранила всего несколько символов, но мне было нужно несколько.

Еще одна идея, позволяющая сэкономить некоторое количество символов, заключалась в том, чтобы определить графическое представление всех совпадений не в DATA, а с выводом значений на экран в виде символов PETSCII.

Я использовал тот же цвет, что и фон для их печати, поэтому они не видны, но вы можете найти их в самом верху экрана. Таким образом, вместо массива, который нужно было назначать из значений DATA, для чтения данных с экрана использовался PEEK.

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

В одной из ранних версий был наивный подход: ответ принимался за правильный только тогда, когда первая и вторая цифры точно совпадали с числами, рандомизированными программой. Но что может случиться, так это то, что когда программа рандомизирует 2 + 3 = 5, а игрок предоставляет 3 + 2 = 5, это будет считаться неправильным ответом?! Всем известно, что сложение коммутативно, то есть порядок не имеет значения. Поэтому программа должна вести себя так же. Но свободного места не осталось. Уже занято 10 строк кода!

Идеальным решением было бы перемещение совпадения с помощью указателя, а не ввод значений с клавиатуры. Затем программе нужно было только проверить, относятся ли формы всех совпадений к числам, но опять же, места не осталось! Использование INPUT вместо этого является самым коротким.

Казалось, что проект нельзя закончить, но я знал, что должен быть способ. И я нашел один, когда во время какой-то случайной прогулки у меня случился момент озарения. Я понял, что для решения этой проблемы я должен думатьо БАЛАНСЕ. Когда одна спичка идет куда-то еще, баланс все равно сохраняется, поэтому программа должна проверить ввод игрока, чтобы убедиться, что количество спичек такое же, и что уравнение имеет смысл. Конечно, при некоторых обстоятельствах есть место для каких-то других ответов, но это бывает редко. Таким образом, я сэкономил много места, повторно используя тот же код, который уже отображает совпадения на экране, чтобы добавить к нему еще одно измерение: не отображать, а подсчитывать количество совпадений, предоставленных из уравнения игрока. Это решение спасло проект!

В конце концов я узнал, что при автоматическом запуске игры вы будете получать одно и то же начальное число каждый раз, когда игра запускается. В результате все уравнения не были случайными, а следовали одной и той же последовательности при каждом запуске игры! Это вызвано отсутствием взаимодействия с пользователем. Мне удалось исправить это, вызвав RND(-IT), но в случае, если игра выполняется с автозапуском через эмуляцию, такое поведение можно исправить, прервав выполнение и снова запустив программу.

Построчное объяснение
  • Строка №0:

    0rEs,z,s$,m$,v:dEfnr(x)=int(rN(1)*x):pOv,5:pOv +1,6:x=rN(-ti):gO5:dA60,10

    Длина: 72

    Эта строка выполняется только один раз. Он начинается с присвоения значений, используемых для нескольких расчетов и отображения экрана, определения функции для рандомизации, используемой для извлечения двух цифр для уравнения, а также для удаления и добавления спички. Прежде чем перейти к строке 5, выполняется трюк, чтобы перетасовать начальное число рандомизации.
    • Строка №1:

      1fori=0to6:t=fnr(8):u=pE(1024+c)aN2^i:y=-(u>0): w=-(l=0aNy=1aNt>4):m=m+y

      Длина: 71

      Процедура для отображения числа из совпадений. Используется также для подсчета совпадений числа (хранится в переменной M). Переменная T содержит результат рандомизации и является одним из компонентов, используемых для определения того, следует ли добавить совпадение к номеру или удалить его. Переменная W содержит флаг, если совпадение должно быть удалено из числа.
    • Строка №2:

      2v=-(l=1aNy=0aNt>4):l=l-(w+v>0):on-(l<3aN( v=1or(y=1aNw=0)))goS3:next:reT

      Длина: 72

      Переменная V содержит флаг, если совпадение должно быть добавлено к числу . Переменная L хранит информацию о том, было ли совпадение уже взято или добавлено, она продвигается вверх. В случае, если совпадение должно отображаться, выполняется GOSUB к строке 3.
    • Строка 3:

      3pO214,int(i/3)*4+o-int(o/z)*z:dA"{clr}{blu}{CBM -Y}$]{CBM-Z}.{CBM-Q}{CBM-F}%{CBM-B}{CBM-P}","{вниз}{влево}B{вниз}{влево}B{ down}{left}BCCC",53280

      Длина: 68

      Здесь начинается рендеринг соответствия на экране.
    • Строка №4:

      4pO211,4+o/z-(i=2ori=5)*4:sY58640:?"{red}Q{orng}"mI( m$,1-(i=0ori=3ori=6)*9,9):reT

      Длина: 72

      Продолжение рендеринга соответствия.
    • Строка №5:

      5?s$:l=0:m=0:o=4:a=fnr(9):b=fnr(9):c =a:goS1:o=68:i=0:goS3:i=1:o=86:goS3

      Длина: 71

      Очистка экрана и рандомизация обоих цифры уравнения. Отобразить первый digit, за которым следует знак плюса.
    • Строка №6:

      6o=114:c=b:goS1:o=177:i=0:goS3:o=179:goS3:d=a+b: c=d/z:o=224:on-(d>9)goS1

      Длина: 72

      Отобразить вторую цифру, за которой следует знак равенства, затем отобразить десятки вторая цифра (если есть).
    • Строка №7:

      7o=o-s*(d>9):c=d+(d>9)*z:goS1:on-(l<2)gO5: l=3:x=ti:n=m:m=0:input"{down}{down}{wht}a";j

      Длина: 72

      Отобразите остальную часть результата. С этого момента начинается отсчет времени. Введите первую цифру.
    • Строка №8:

      8input"b";k:input"=";r:f=f+(ti-x)/s:c=j:goS1:c =k:goS1:c=r/z:e=r>9:g=g+1

      Длина: 71

      Введите вторую цифру и результат. Все переходы GOSUB 1 используются для подсчета количества совпадений с ответом, предоставленным игроком. Время, затраченное на ответ, добавляется к общему времени, хранящемуся в переменной F. Прогресс в баллах указывается в переменной G.
    • Строка №9:

      9on-(e)goS1:c=r+(e)*z:goS1:on-(j+k=raNn=m)gO5:? a"+"b"="d;g-1"pts in"f"s"

      Длина: 72

      В случае, если совпадение не было заменено, резервный используется для перетасовки уравнения. В случае правильного ответа будет перемешано другое уравнение (ПЕРЕХОД К 5). В противном случае игра окончена. Отображение набранных очков и затраченного времени. Программа завершает выполнение здесь, так как ниже нет следующих строк.
    От автора

    Получите удовольствие от других игр, представленных на конкурс ASCII Basic Game 10Liner!

    Спасибо https://lvllvl.com/c64/за отличное встраивание эмулятора JS!

    Посетите сайт www.commocore.com, чтобы узнать о других играх и проектах с открытым исходным кодом!

    Бартош Жолинский

Как скачать Mathsticks 10 через торрент

Всего несколько простых шагов:

  • Устанавливаем программу μTorrent, через которую мы будем скачивать торренты
  • Выбираем и скачиваем подходящий торрент-файл репака Mathsticks 10
  • Двойным кликом открываем скаченный файл, программа μTorrent запустится автоматически и предложит выбрать место для сохранения дистрибутива.
  • После того как репак скачается, запускайте его. Начнется установка и... это все, приятной игры!