Три компьютерные игры (по 30 байт каждая)

    Вдохновленная Shifticida (32 байта) и Самой маленькой гоночной игрой в мире (58 байт), я решила сделать Самую-самую маленькую компьютерную игру для x86. Вместо одной игры получились три. Увы, они не такие крутые, как гоночки, но зато они занимают всего по 30 байт каждая.

    Угадай-ка


    Игра для двух игроков. Первый игрок нажимает какую-нибудь кнопку на клавиатуре. После этого второй игрок перебирает кнопки на клавиатуре до тех пор, пока не нажмет на ту же кнопку, что и первый. Чтобы второй игрок не мучился очень уж долго, на экран выводятся подсказки. Когда нужная кнопка найдена, игра заканчивается.

    ;;Угадай-ка

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

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

    mov al, 13;;Возврат каретки
    int 29h

    mov ah,1 ;;Опрос клавиатуры
    int 21h

    cmp al, bl ;;Сравнение кодов клавиш
    je true ;;Если угадали, то переходим к true
    ja big ;;Если больше, то переходим к big

    ;Если не равно и не больше, значит, код нажатой клавиши меньше, чем код в bl,
    mov al, '-' ;так что выведем на экран символ "-"
    jmp still

    big:
    mov al, '+' ;Выведем на экран символ "+"
    jmp still

    true:
    int 20h ;;Конец игры


    Баше


    Классическая математическая игра, в которой вашим противником будет компьютер. Правила такие: на столе лежат 15 палочек, нужно по очереди брать от 1 до 3. Проигрывает тот, кому нечего брать со стола.

    Игра выводит на экран текущее количество палочек и ожидает ввода с клавиатуры (смело жмите 1, 2 или 3). После того, как человек сделает свой ход, компьютер тоже возьмет себе несколько палочек, и выведет оставшееся количество палочек на экран. Игра заканчивается вместе с палочками, и если вы победили, то увидите на экране сердечко. Предостережение: ввод с клавиатуры не фильтруется, так что вы можете взять сразу 15 или даже 200 палочек. Компьютер отреагирует на это так же, как и живой человек в подобной ситуации (может очень сильно обидеться).

    ;;Баше

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

    still: ;;Главный цикл

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

    mov ah, 1 ;;Ожидаем ввода с клавиатуры
    int 21h

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

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

    sub dl, 4 ;;Иначе компьютер дополняет ваш ход до 4
    jns still ;;Если палочки не кончились, то возвращаемся к началу главного цикла

    jmp fin ;;Иначе - завершаем программу

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

    fin:
    int 20h ;;Конец программы


    К сожалению, после второго раза играть в Баше становится скучно.

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


    Программа очень быстро прокручивает символы на экране (по одному, в левом верхнем углу). Чтобы зафиксировать текущий символ и перейти к следующему, нажимайте клавишу «Стрелка вправо». Если сможете получить три одинаковых символа, значит, либо у вас очень старый компьютер, либо вам очень везет!

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

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

    mov cx, 3 ;;Нужно вывести на экран три символа

    le: ;;Вывод символа
    push cx ;;Сохраним cx, потому что вызов таймера его затирает
    add bl, 2 ;;Переместим курсор

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

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

    jmp inf ;;Почти вечный цикл повторяется почти вечно

    re: ;;Пора выводить следующий символ или останавливать бандита
    pop cx ;; Для этого восстановим cx
    loop le ;; И продолжим цикл "Вывод символа"

    int 20h ;;Конец программы


    Заключение


    Исходный код игр я компилировала с помощью fasm. Запускать можно, например, в dosbox. Для Однорукого я рекомендую уменьшить CPU cycles.

    ex2.com — Угадай-ка
    poo2.com — Баше
    roll.com — Однорукий бандит

    P.S. Можно ли сделать игру еще меньшего размера? Конечно можно!
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 95

      +4
      >Конечно можно!
      Вывод на экран строки «You've just lost The Game».
        +13
        в 30 байт так просто не поместится, сама надпись съедает 25 байт, придётся сжимать
          +10
          Game Over тогда уж )
            +6
            Такая Короткая Игра.
              +1

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

                                            20 men vs. 1 niger
                                              +2

                                                +13
                                                Rasism is a criminal
                                                  +5
                                                  «Меня так в школе учили — в Германии живут немцы, в Китае — китайцы, евреи — в Израиле этом, а в Африке — негры»
                                                    +6
                                                    а на деле в Сибири живут узбеки, в Москве таджики, на Украине русские, а в Италии украинцы

                                                      0
                                                      Русские живут везде. Была мощная мотивация пожить где-нибудь еще.
                                                        +2
                                                        у меня до сих пор есть
                                                  +3
                                                  у вас отличная память! В каком году читали?
                                                    0
                                                    Интересная задачка. Набросает кто-нибудь набросает по быстрому алгоритм решения?
                                                      0
                                                      Зачем выбрасывать при недостатке продовольствия, когда можно съесть?
                                                        +1
                                                        Ну что ж они, расисты что ли?
                                                        0
                                                        Фэйк, набор-то компьютерный.
                                                          0
                                                          Почему компьютерный?
                                                            0
                                                            Возьмите любую книгу, выпущенную 30 лет назад где-нибудь не в СССР :)
                                                            Только с появлением компьютерного набора появилось такое уродское выравнивание по ширине.
                                                            ПС. Ни фига себе, мне кто-то ответил через месяц, а еще через 2 :)
                                                      • НЛО прилетело и опубликовало эту надпись здесь
                                                          0
                                                          Ваши игры — да в учебники по ассемблеру. Одновременно и интересно, и не слишком громоздко для начинающих.
                                                          • НЛО прилетело и опубликовало эту надпись здесь
                                                            0
                                                            На этом сайте (pouet.net) нашел свою давнюю работу с питерского демо-пати Chaos Construction 2000, 5 место в номинации 256 byte compo
                                                            www.pouet.net/prod.php?which=5317
                                                            –5
                                                            Не знаю на каком это ассемблере писано но эти игры можно еще уменьшить.
                                                            На тасме точно такая штука работает, там можна делать переходы без меток!!! Метка занимает 1 байт! Чтобы перейти без метки вперед надо знать сколько байт занимают следующие команды (например 10 байт) и тогда переход можно написать так «jmp $+10» и так переход сработает без метки. Назад тоже должно работать «jmp $-10»
                                                              +6
                                                              Наркоман штоле? Посмотрел бы для начала как твой пример будет выглядеть в дизассембелере и как выглядит код автора в нем же.
                                                                –2
                                                                Не знаю как у кого а у меня программы с такими переходами всегда нормально работали… Если уж делать мелкие проги то пора экономить каждый байт (и если сделать такую прогу без метки то она становилась меньше на байт)
                                                                  0
                                                                  Не знаю как у вас, а мой FASM превращает
                                                                  org 100h
                                                                  label:
                                                                  jmp label

                                                                  в следующий код:
                                                                  jmp 100h
                                                              –1
                                                              ПОСОНЫ, а по сети в них можно рубиться?
                                                                +2
                                                                Можно, я разрешаю.
                                                              • НЛО прилетело и опубликовало эту надпись здесь
                                                                  +1
                                                                  Боюсь, с сапером непросто будет. Для каждой клетки нужно проверять соседей — это минимум 7 проверок (а значит, в бинарник пойдет от 7 до 21 байт). А кроме этого, нужно выводить на экран и опрашивать клавиатуру (минимум 4 байта на каждую из этих задач). И команда завершения программы должна быть обязательно. Вот и выходит, что в лучшем раскладе, без генератора случайных чисел, 16 байт только на ввод-вывод и кусок игровой логики. Примерно так же я размышлял, когда решил не делать реализацию игры Жизнь — в 32 байта она просто не поместится (на x86, разумеется).
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                      0
                                                                      Или даже 2x2. Хорошая мысль!
                                                                  0
                                                                  Простите, а зачем эти адреса дотком приведены в заключении?
                                                                    +1
                                                                    Названия бинарников в zip-архиве.
                                                                    К.О.
                                                                      +19
                                                                      Вот и выросло поколение, которое не знает о com формате бинарников.
                                                                    +3
                                                                    {irony}Снова нету вариантов под Mac и Linux… Автор, почему не кроссплатформенная?! :( {/irony}
                                                                      0
                                                                      Если без иронии — заголовок pe или elf занимал бы места больше, чем код. Кстати, под Windows заработает скорее всего без проблем.
                                                                      +1
                                                                      Можно ещё сократить, первую и третью — до 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 ;;Конец программы
                                                                      
                                                                        0
                                                                        Выше всяких похвал! Спасибо за такие оптимизации, просто очень круто! Остается лишь признаться в том, что ассемблер я не знаю.
                                                                          +1
                                                                          Не надо скромничать, написание этого поста само по себе доказывает знание ассемблера. У меня, по-видимому, просто опыта больше, а опыт — дело наживное.
                                                                        0
                                                                        Баше интересная задумка. Аппаратную версию игры можно сожно создать исключительно на выключателях и лампах. А программная вообще не требует вычислений. Благодаря Баше я выиграл ящик пива в 2000 году, поспорив, что смогу написать игру на чистом HTML (уровня Internet Explorer 3.0).
                                                                          0
                                                                          Я когда-то восхищался программой для МК-61, которая была размером в 8 команд, это была игра Бридж. Аналогичные программы занимали всю память (более 100 команд), эта же реализовывала хитрый алгоритм. Правда кроме самого кода программы, нужно было еще заполнить почти все ячейки памяти нужными значениями для вычислений.

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

                                                                          Самое читаемое