Собственно нужно, чтобы змейка не умирала, когда доходит до пределов экрана, и чтоб она не выходила за пределы экрана... Помогите пожалуйста! Вот код | Код | .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
|
|