Вдохновленный 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. Архив с этими тремя скомпилированными играми можно скачать прямо сейчас (осторожно, он тяжелый, целых 386 байт). Запускать можно, например, в dosbox. Для Однорукого я рекомендую уменьшить CPU cycles.
ex2.com — Угадай-ка
poo2.com — Баше
roll.com — Однорукий бандит
P.S. Можно ли сделать игру еще меньшего размера? Конечно можно!
http://habrahabr.ru/blogs/asm/119765
|