.model tiny, pascal
.code
.386
org 100h
LOCALS
chain struc ; структура для хранения
x dw ? ; каждого звена змейки
y dw ?
c dw ?
chain ends
struct_size equ 6 ; размер структуры
begin:
mov ax, 03h ; запись секторов накопителя
int 10h
@00:
mov ah, 09h ; вывод меню на экран
lea dx, menu
int 21h
mov ah, 1 ; ввод с клавиатуры с отображением на экране
int 21h
cmp al, '1'
jz @1
cmp al, '2'
jz @0
cmp al, '3'
jz @3
jmp @0
@1:
mov ah, 9
lea dx, about
int 21h
jmp @00
@3:
ret
@0:
call InitDelay ; инициализация задержки
call Randomize ; инициализируем генератор псевдослуч. чисел
; устанавливаем видеорежим
mov ax, 0013h ; видеорежим VGA 320x200 256 цветов
INT 10h
call randcolor ; генерируем цвет для 1-го DAC регистра
; устанавливаем змейку в начальное положение
mov ax, zmeika[0].x
mov cx, zmeika[0].y
mov dx, zmeika[0].c
xor bx,bx
@@init_zmeika: ; цикл инициализации змейки
add bx, struct_size
add ax, rect_size + 1
mov zmeika[bx].x, ax ; координата x звена
mov zmeika[bx].y, cx ; координата у у всех звеньев одинаковая
mov zmeika[bx].c, dx ; все звенья одинаковым цветом
cmp bx, len ; цикл продолжается пока не закончатся звенья
jl @@init_zmeika
; очищаем экран
mov al, 0 ; цвет фона (чёрный)
call CLR
; рисуем змейку
call DrawZmeika
; генерим бонус
call GenBonus
; рисуем бонус квадрат
push bonus.x ; координата x
push bonus.y ; координата у
push bonus.c ; цвет
call FillRect
; для начала ждём нажатия клавиши
mov ah, 00h
int 16h
@@main_loop:
mov ah, 01h ; проверяем нажатие клавиши
int 16h
jz @@skip ; если никакая клавиша не была нажата то переходим на @@skip
mov ah, 00h ; получаем значение нажатой клавиши
int 16h
cmp ah,2dh ; если нажаты Alt+x
je @@exit ; то выход
cmp ah, 4bh ; если не нажата left
jne @@check_right ; переходим на проверку right
cmp direction, 1 ; если змейка движется вправо
je @@move_right ; то игнорируем нажатие влево
@@move_left:
mov direction, -1 ; устанавливаем направление движения влево
jmp @@skip
@@check_right:
cmp ah, 4dh ; если не нажата right
jne @@check_up ; переходим на проверку up
cmp direction, -1 ; если змейка движется влево
je @@move_left ; то игнорируем нажатие вправо
@@move_right:
mov direction, 1 ; устанавливаем направление движения вправо
jmp @@skip
@@check_up:
cmp ah, 48h ; если не нажата up
jne @@check_down ; переходим на проверку down
cmp direction, 2 ; если змейка движется вниз
je @@move_down ; то игнорируем нажатие вверх
@@move_up:
mov direction, -2 ; устанавливаем напрвление движения вверх
jmp @@skip
@@check_down:
cmp ah, 50h ; если не нажата down
jne @@skip ; переходим на отрисовку змейки
cmp direction, -2 ; если змейка движется вверх
je @@move_up ; то игнорируем нажатие вниз
@@move_down:
mov direction, 2 ; устанавливаем направление движения вниз
@@skip:
call MoveZmeika ; процедура движения змейки
call CheckDeath ; проверяем выход за границы экрана
jc @@exit ; если вышла то завершение программы
call CheckBonus ; проверяем бонус
jnc @@no_bonus ; если не наехали на бонус то переходим дальше
call randcolor ; изменяем цвет
add len, struct_size ; увеличиваем змейку на одно звено
call GenBonus ; генерим новый бонус
push bonus.x ; х бонуса
push bonus.y ; у
push bonus.c ; цвет
call FillRect ; рисуем новый бонус
mov eax, speed ; увеличиваем скорость движения
sub
Помогите!
Доброго времени суток! Помогите пожалуйста... Нужно, чтобы змейка не умирала, когда доходит до пределов экрана, и чтоб она не выходила за пределы экрана...