Pull to refresh

Comments 95

>Конечно можно!
Вывод на экран строки «You've just lost The Game».
в 30 байт так просто не поместится, сама надпись съедает 25 байт, придётся сжимать
Где-то в полдень мужик встает с дивана с глубокого похмелья, очень
долго ищет тапочки, надевает их, очень медленно, еле поднимая ноги идет на кухню. Проходя мимо клетки с попугаем снимает с нее (с клетки) покрывало, заходит на кухню достает из холодильника пиво, медленно с наслаждением пьет, идет обратно. Проходя мимо клетки с попугаем накидывает на нее покрывало, ложиться на диван и засыпает.
Голос из клетки — охуенно день прошел!
Если выводить в лоб через DOSовское 21h прерывание, то программа занимает 35 байт. А ту же Баше можно уместить байт эдак в 20 для процессора Z80, я уверен.
в свое время у нас на курсе по ассемблеру было задание соревнование
кто в меньшем числе байт проги выведет «Александр Сергеевич Пушкин» в трех вариантах — в строку как есть, лесенкой и в столбик.
выкручивались прямой работой с памятью.
не помню какой вариант был у победителя, но мой был, вроде, 58 байт.
во даже откопал в архивах два варианта, только сча не в чем скомпилить проверить в linuxe
В 36 байт точно уместить можно, без всяких извращений.
Я компилирую под linux с помощью fasm, и тестирую в dosbox или qemu.
UFO just landed and posted this here
Да-да, когда-то давно делал Баше на микросхемах логики.
Жульничество какое-то :)
У вас 6 наборов страничек для всех вариантов.
Но от этого игра не перестает быть полноценной игрой. Лет десять назад я свою игру (квест) тоже на чистом HTML делал, в Word 97. Вот смешно сейчас об этом вспоминать…
Хотел бы я посмотреть на подобную реализацию шахмат =D
UFO just landed and posted this here
UFO just landed and posted this here
Интерактивные книги, предположим, не Гаррисон придумал…
тыц
UFO just landed and posted this here
UFO just landed and posted this here
Сам гугл не смог бы хранить все комбинации.
От начала до конца комбинации хранить не обязательно. Поэтому достаточно будет сделать 4224 страниц: На поле 64 клетки, каждая клетка может иметь 33 состояния (путая или одна из 32 фигур); Всё умножаем на 2 для подсветки допустимых ходов.
64 клетки нужно возвести в степень 33, а не перемножить.
Ага, что-то я напутал. Но возводить в степень можно и клетки и фигуры. Просто получаются разные исходные данные: 64 ^ 33 — что стоит на каждой клетке, 32 ^ 64 — на какой клетке каждая фигура. Но кол-во фигур и тип могут меняться, поэтому лучше первый вариант.
Однако и я ошибся — оба эти числа меньше десяти в сотой степени, а значит меньше чем гугол.
Опять же надо учесть что ещё каких-то 20 лет назад иметь дома 1ТБ HDD считалось фантастикой, сегодня это реальность даже в бюджетных компах. Через 20 лет почему бы и не быть играм размером в {сами продолжите фразу в силу своей фантазии}
вы лучше посчитайте количество состояний доски в го. Доска 19х19 :)
В го же только черные и белые фишки? Три варианта на каждую клетку. Всего лишь число с 361 разрядом в троичной системе.
Это «Всего лишь» — 10 в степени 172, шахматы на 72 ноля меньше)
Верно, только что перевел. Так вот почему партия в го может длиться целую вечность…
UFO just landed and posted this here
UFO just landed and posted this here
мне кажется, что все-таки меньше. Позиция каждой фигуры в реальной партии может принимать 65 значений (64 на доске + 1 вне доски). Итого получаем максимум 65*32 = 2080 досок (причем некоторые будут совпадать из-за того, что одинаковые фигуры можно менять местами)
Еще один… Возводить в степень надо, а не перемножать.
Можно считать, что клетка может быть пустой, потом чёрная или белая фигура и количество фигур — на самом деле их всего 6. Так что не так и много состояний получается.
Да конечно, это был сарказм. Прикольное решение, очень даже.
UFO just landed and posted this here
В игре просто следующий алгоритм:
Сколько бы ты не взял спичек, компьютер возьмет столько, чтобы у вас в сумме получилось 4 спички.
Например: игрок берет 1 спичку, компьютер 3. Или игрок берет 3 спички, а компьютер 1.
неплохо придумано! но все же тут подгружаются другие странички ( хотя идея хорошо
в вашей игре реально выиграть? ))
UFO just landed and posted this here
В свое время мне попадалась книжка где Баше была реализована в спичечных коробках, причем согласно логике играющего человека такая конструкция даже имела самообучающийся механизм. :-)
Видимо, выигрышная стратегия, описанная на Википедии, не очень-то и выигрышная.
Конечно там глупость написана. Исправил. В любом случае, при стартовая позиции с 15 и 3 выигрышная стратегия будет для первого игрока. Второй может победить только если первый сделает ошибку.
Спасибо за исправления и пояснения. Теперь буду перепроверять информацию, в которой сомневаюсь.
Первые две на калькуляторе МК-52 делал :-) Классная штука была… Говорят, на нем даже пошаговые космические стратегии делали :-)
Делали! Посадка на Луну, например.
А я на своем Б3-21 делал даже шахматы (правда, проиграть им мог только человек, который играет в шахматы впервые в жизни).
Автору нужно полистать сборник игр под калькуляторы МК-52 — солидная подборка, а реализация алгоритмов на x86 займет как раз всего несколько десятков байт. Вдохновения вам!
С алгоритмами проблем нет. Проблемы есть с вводом и выводом. Например, вывод одного символа через 29h прерывание — это 4 байта к весу двоичного файла. На некоторых МК (про 52 ничего сказать не могу, никогда его в руках не держал) для ввода данных программа останавливалась и затем запускалась вручную, и это требовало всего одного шага.
Если у Вас был 61, то программировался он по-моему точно так же как 52. Просто в 52 была энергонезависимая долговременная память (Программы сохранялись после отключения питания)
У меня был Б3-21 (у него было вроде 80 шагов на программу и до 5 подпрограмм по 5 шагов, плюс 8 ячеек памяти). МК-61 только в руках держал, да с его эмулятором игрался.
Забавно :) Как раз недавно стал асм изучать, а такие вот игрушки дают стимул лично для меня.
Правила такие: на столе лежат 15 палочек, нужно по очереди брать от 1 до 3. Проигрывает тот, кому нечего брать со стола.
Почему-то сразу вспомнилась задачка:

20 men vs. 1 niger
«Меня так в школе учили — в Германии живут немцы, в Китае — китайцы, евреи — в Израиле этом, а в Африке — негры»
а на деле в Сибири живут узбеки, в Москве таджики, на Украине русские, а в Италии украинцы

Русские живут везде. Была мощная мотивация пожить где-нибудь еще.
у вас отличная память! В каком году читали?
Интересная задачка. Набросает кто-нибудь набросает по быстрому алгоритм решения?
Зачем выбрасывать при недостатке продовольствия, когда можно съесть?
Возьмите любую книгу, выпущенную 30 лет назад где-нибудь не в СССР :)
Только с появлением компьютерного набора появилось такое уродское выравнивание по ширине.
ПС. Ни фига себе, мне кто-то ответил через месяц, а еще через 2 :)
UFO just landed and posted this here
Ваши игры — да в учебники по ассемблеру. Одновременно и интересно, и не слишком громоздко для начинающих.
UFO just landed and posted this here
Не знаю на каком это ассемблере писано но эти игры можно еще уменьшить.
На тасме точно такая штука работает, там можна делать переходы без меток!!! Метка занимает 1 байт! Чтобы перейти без метки вперед надо знать сколько байт занимают следующие команды (например 10 байт) и тогда переход можно написать так «jmp $+10» и так переход сработает без метки. Назад тоже должно работать «jmp $-10»
Наркоман штоле? Посмотрел бы для начала как твой пример будет выглядеть в дизассембелере и как выглядит код автора в нем же.
Не знаю как у кого а у меня программы с такими переходами всегда нормально работали… Если уж делать мелкие проги то пора экономить каждый байт (и если сделать такую прогу без метки то она становилась меньше на байт)
Не знаю как у вас, а мой FASM превращает
org 100h
label:
jmp label

в следующий код:
jmp 100h
UFO just landed and posted this here
Боюсь, с сапером непросто будет. Для каждой клетки нужно проверять соседей — это минимум 7 проверок (а значит, в бинарник пойдет от 7 до 21 байт). А кроме этого, нужно выводить на экран и опрашивать клавиатуру (минимум 4 байта на каждую из этих задач). И команда завершения программы должна быть обязательно. Вот и выходит, что в лучшем раскладе, без генератора случайных чисел, 16 байт только на ввод-вывод и кусок игровой логики. Примерно так же я размышлял, когда решил не делать реализацию игры Жизнь — в 32 байта она просто не поместится (на x86, разумеется).
UFO just landed and posted this here
Простите, а зачем эти адреса дотком приведены в заключении?
Вот и выросло поколение, которое не знает о com формате бинарников.
{irony}Снова нету вариантов под Mac и Linux… Автор, почему не кроссплатформенная?! :( {/irony}
Если без иронии — заголовок pe или elf занимал бы места больше, чем код. Кстати, под Windows заработает скорее всего без проблем.
Можно ещё сократить, первую и третью — до 24 байт, вторую — до 27 байт.
  • выходить из COM-программы можно не по int 20h, а по ret; в бинарнике второй программы это даже используется, в отличие от исходника;
  • int 29h сохраняет ah, так что «mov ah,1» и «int 29h» можно поменять местами, а пару команд «mov al,imm1» и «mov ah,imm2» можно заменить на одну «mov ax,imm2*256+imm1»;
  • если в мешанину условных переходов закрадывается безусловный, это повод подумать, нельзя ли переупорядочить код, избавляясь от безусловного перехода.

Первая программа:

org 100h
;;Угадай-ка

 int 16h ;;Ожидаем нажатие на клавишу
 mov bl, al ;;Сохраняем код клавиши в память

 still: ;;Главный цикл
 int 29h ;;Вывод символа на экран

 mov ax, 1*256+13;;al=13 - Возврат каретки, ah=1 - Опрос клавиатуры
 int 29h

 int 21h

 cmp al, bl ;;Сравнение кодов клавиш
 mov al, '+'
 ja still
 mov al, '-'
 jb still

 true:
 ret

Вторая программа:

org 100h
;;Баше

 mov dl, 15+4 ;;Поместим в dl количество палочек

 still: ;;Главный цикл
 sub dl, 4
 js fin

 mov ax, 1*100h+'|' ;;Выведем символ палочки 
 mov cl, dl ;;с помощью цикла,
 disp: ;;ровно cl раз
 int 29h ;;вызвав прерывание 29h
 loop disp

 int 21h

 sub al, '0' ;;Переводим ASCII-код в число

 cmp dl, al ;;Забрали последнюю палочку - значит, победили
 jne still

 win:
 int 29h ;;Выведем сердечко

 fin:
 ret

Третья программа:

;;Однорукий бандит

 push 0b800H ;;Обращаемся к видеопамяти
 pop ds 

 le: ;;Вывод символа
 inc bx
 inc bx ;;Переместим курсор

 inf: ;;Почти вечный цикл
 int 1AH ;;Вызываем таймер
 add dl, bl ;;Мешаем игроку победить, быстро нажимая клавишу "Вправо"
 mov [bx], dl ;;Выводим текущий символ на экран

 ;;Обработчик клавиатуры
 in al, 60H
 cmp al, 77 ;;Нажата кнопка "Стрелка влево", переходим к следующему символу
 jnz inf ;;Почти вечный цикл повторяется почти вечно

 re: ;;Пора выводить следующий символ или останавливать бандита
 cmp bx, 6
 jnz le

 ret ;;Конец программы
Выше всяких похвал! Спасибо за такие оптимизации, просто очень круто! Остается лишь признаться в том, что ассемблер я не знаю.
Не надо скромничать, написание этого поста само по себе доказывает знание ассемблера. У меня, по-видимому, просто опыта больше, а опыт — дело наживное.
Баше интересная задумка. Аппаратную версию игры можно сожно создать исключительно на выключателях и лампах. А программная вообще не требует вычислений. Благодаря Баше я выиграл ящик пива в 2000 году, поспорив, что смогу написать игру на чистом HTML (уровня Internet Explorer 3.0).
Я когда-то восхищался программой для МК-61, которая была размером в 8 команд, это была игра Бридж. Аналогичные программы занимали всю память (более 100 команд), эта же реализовывала хитрый алгоритм. Правда кроме самого кода программы, нужно было еще заполнить почти все ячейки памяти нужными значениями для вычислений.
Sign up to leave a comment.

Articles