|
Программирование 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 |
|
|