Вдохновленная Shifticida (32 байта) и Самой маленькой гоночной игрой в мире (58 байт), я решила сделать Самую-самую маленькую компьютерную игру для x86. Вместо одной игры получились три. Увы, они не такие крутые, как гоночки, но зато они занимают всего по 30 байт каждая.
Игра для двух игроков. Первый игрок нажимает какую-нибудь кнопку на клавиатуре. После этого второй игрок перебирает кнопки на клавиатуре до тех пор, пока не нажмет на ту же кнопку, что и первый. Чтобы второй игрок не мучился очень уж долго, на экран выводятся подсказки. Когда нужная кнопка найдена, игра заканчивается.
Классическая математическая игра, в которой вашим противником будет компьютер. Правила такие: на столе лежат 15 палочек, нужно по очереди брать от 1 до 3. Проигрывает тот, кому нечего брать со стола.
Игра выводит на экран текущее количество палочек и ожидает ввода с клавиатуры (смело жмите 1, 2 или 3). После того, как человек сделает свой ход, компьютер тоже возьмет себе несколько палочек, и выведет оставшееся количество палочек на экран. Игра заканчивается вместе с палочками, и если вы победили, то увидите на экране сердечко. Предостережение: ввод с клавиатуры не фильтруется, так что вы можете взять сразу 15 или даже 200 палочек. Компьютер отреагирует на это так же, как и живой человек в подобной ситуации (может очень сильно обидеться).
К сожалению, после второго раза играть в Баше становится скучно.
Программа очень быстро прокручивает символы на экране (по одному, в левом верхнем углу). Чтобы зафиксировать текущий символ и перейти к следующему, нажимайте клавишу «Стрелка вправо». Если сможете получить три одинаковых символа, значит, либо у вас очень старый компьютер, либо вам очень везет!
Исходный код игр я компилировала с помощью fasm. Запускать можно, например, в dosbox. Для Однорукого я рекомендую уменьшить CPU cycles.
ex2.com — Угадай-ка
poo2.com — Баше
roll.com — Однорукий бандит
P.S. Можно ли сделать игру еще меньшего размера? Конечно можно!
Угадай-ка
Игра для двух игроков. Первый игрок нажимает какую-нибудь кнопку на клавиатуре. После этого второй игрок перебирает кнопки на клавиатуре до тех пор, пока не нажмет на ту же кнопку, что и первый. Чтобы второй игрок не мучился очень уж долго, на экран выводятся подсказки. Когда нужная кнопка найдена, игра заканчивается.
;;Угадай-ка
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. Можно ли сделать игру еще меньшего размера? Конечно можно!