Суббота, 23.11.2024, 06:44
Приветствую Вас Гость | RSS
Главная | | Регистрация | Вход
Меню сайта
Форма входа
Поиск
Календарь
«  Февраль 2012  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
272829
Архив записей
Наш опрос
Оцените мой сайт
Всего ответов: 20
Мини-чат
Друзья сайта
  • Заказ Художник
  • Рыбалка
  • Новости
  • Наш университет io-96
  • Железо и другие
  • Наш Counter-Strike
  • Google ot Turbokherson
  • Google ot Turbokherson87
  • Android
  • Программы и Софт
  • Программирование
  • Лечение здоровья
  • О Ремонт компьютер
  • Наш сайт Turbokherson
  • Программирование ICQ 378204653 от Turbokherson
    Главная » 2012 » Февраль » 19 » Самая маленькая игра в мире (58 байт) ASSEMBLER
    13:44
    Самая маленькая игра в мире (58 байт) ASSEMBLER

    Самая маленькая игра в мире (58 байт)

    Для тех, кто читал статью в песочнице: добавил раздел «Можно ли сделать игру меньше?».

    Прочитав историю одного байта, вспомнил свою историю.

    Когда я учился в школе и только начинал программировать меня очень привлекал ассемблер и оптимизация. А именно — кропотливая оптимизация, с подсчетам тактов и байтов. На летних каникулах у меня с двоюродным братом появилась идея написать самую маленькую игру в мире.

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

    Сюжет и управление


    Вы несетесь по трассе на грузовике с двумя прицепами. Слева от вас разделительная полоса, справа обочина укрытая травой. На дороге встречаются люди и деревья (может ямы). Ваша задача: не сбивать людей и не врезаться в деревья (не попадать в ямы).
    Управление: стрелки влево-вправо — поворот; Esc — пауза.


    Скриншот




    Исходный код


    begin:
      ; ds указывает на видеопамять
      push 0b800H
      pop ds
      ; установить графический режим 40×25
      int 10H
      ; bx = 700H - смещение, по которому находиться грузовик
      mov bh, 7H
      
    main_loop:
      ; Задержка и вывод грузовика на экран
      xchg cx, ax  ; mov ah, 0
      int 1AH
      mov [bx], dl
    delay:
      int 1AH
      cmp [bx], dl
      je delay
      
      ; si - смещение следующего препятствия
      xchg ax, si
      add al, dl
      xchg ax, si
      
      xchg ax, cx   ; mov cx, 0
      
      ; Получение нажатой клавиши
      in al, 60H
      cmp al, 77
      jnz keytest1  
      ; вправо
      inc bx
      inc bx  
    keytest1:
      ; влево
      ja keytest2
      dec bx
      dec bx
    keytest2:
      ; очистка буфера клавиатуры
      mov ah, 0CH
      int 21H
      ; скролл экрана на 1 строчку
      mov ax, 0701H
      mov dx, 1827H
      int 10H
      
      ; вывод препятствия
      mov [si], ax
      ; вывод травы и разделительной полосы
      mov [di+51], dx
      ; проверка что перед грузовиком нет препятствий
      cmp [bx], dh
      ja main_loop
      
      ret

    Архив с исходником и бинарником (для компиляции использовался Tasm)

    Или Скачать тут /filesmou/wsg.zip

    Комментарии


    В XP программа работает, но таймер работает не гладко и сначала не обнулено состояние клавиатуры. В DosBox'е работает без проблем.

    В исходнике, две инструкции (push 0b800H и mov [di+51], dx) записаны в машинном коде (db 68H, 00H, 0b8H и db 89H, 55H, 51H), это связано с тем, что Tasm их не воспринимал в режиме компиляции по умолчанию. По-моему он требовал включения инструкций x386, хотя могу и ошибаться.

    Можно ли сделать игру меньше?


    Скорее всего — да. Много места занимает прокрутка экрана (8 байт) и задержка (10 байт). Если поменять направление движения (препятствия надвигаться снизу вверх), то скролл можно заменить быстрым выводом символа перевода строки (mov al, 0Ch; int 29h). Задержку можно заменить проверкой состояния двойного слова по адресу 0040:006Сh. Там должен находиться счетчик отсчетов таймера с полуночи (Timer ticks since midnight).

    UPD: Спасибо! Перенес в блог «Ассемблер»

    UPD2: Imp5 подсказывает, что я не совсем прав. Shifticida — игра для двоих игроков, которая занимает 32 байта. Так что правильное название топика: «Самая маленькая гоночная игра в мире»
    Просмотров: 1430 | Добавил: Turbokherson | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    Создать бесплатный сайт с uCozCopyright MyCorp © 2024