Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model tiny
- .data
- ;АДРЕСА ОБРАБОТЧИКОВ
- oldseg09 dw ?
- oldofs09 dw ?
- oldseg1c dw ?
- oldofs1c dw ?
- ;МОЯ
- self_snake_x db 0,1,2,3,4,5,6,7
- db 640 dup('?')
- self_snake_y db 8 dup(0)
- db 640 dup('?')
- self_len_snake dw 8
- self_direction db 'r'
- self_next_dir db 'r'
- self_dir_dx db 1
- self_dir_dy db 0
- self_past_tail_x db 0
- self_past_tail_y db 0
- ;ДРУГАЯ
- other_snake_x db 31,30,29,28,27,26,25,24
- db 640 dup('?')
- other_snake_y db 8 dup(19)
- db 640 dup('?')
- other_len_snake dw 8
- other_direction db 'l'
- other_dir_dx db -1
- other_dir_dy db 0
- other_past_tail_x db 24
- other_past_tail_y db 19
- ;ФЛАГИ ДЛЯ ОБРАБОТЧИКА
- flag_exit db 0
- ticks_after_step db 0
- ticks_in_step db 1
- flag_step db 0
- ticks_after_note db 0
- ticks_in_note db ?
- flag_music db 0
- flag_was_crash db 0
- ;ЯБЛОКИ
- length_for_win db 25
- ticks_after_apples db 0
- ticks_in_generate_apples db 20
- apples_x db 640 dup(?)
- apples_y db 640 dup(?)
- apples_len dw 0
- flag_add_apple db 0
- qwe dw 0
- ;КАРТИНКИ
- self_snake db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0,48,48,48,48,48,48,48,48, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- other_snake db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0,32,32,32,32,32,32,32,32, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- head_snake db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0,111,111,111,111,111,111,111,111, 0
- db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- earth db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- apple db 7,7,7,7,6,7,7,7,7,7
- db 7,7,7,7,7,6,7,7,7,7
- db 7,7,4,4,4,6,4,4,7,7
- db 7,4,4,4,4,6,4,4,4,7
- db 4,4,4,4,4,4,4,4,4,4
- db 4,4,4,4,4,4,4,4,4,4
- db 7,4,4,4,4,4,4,4,4,7
- db 7,7,4,4,4,4,4,4,7,7
- db 7,7,7,4,4,4,4,7,7,7
- db 7,7,7,7,7,7,7,7,7,7
- ;ДЛЯ РИСОВАНИЯ
- x dw ?
- y dw ?
- ;P.S все картинки 10x10
- w dw 10
- h dw 10
- pixels_to_cell db 10
- ;МУЗЫКА
- frequency dw 0,9121, 8609, 8126, 7670, 7239, 6833, 6449, 6087, 5746, 5423, 5119, 4831 ; малая
- dw 4560, 4304, 4063, 3834, 3619, 3416, 3224, 3043, 2873, 2711, 2559, 2415 ; 1
- dw 2280, 2152, 2031, 1917, 1809, 1715, 1612, 1521, 1436, 1355, 1292, 1207 ; 2
- dw 1140, 1076, 1015, 0958, 0904, 0857, 0806, 0760, 0718, 0677, 0646, 0603 ; 3
- beat db 6,2, 6,2, 6,2,3,2,9,6,4,3
- db 6,2, 6,2, 6,2, 3,2, 6, 3, 2,6,9
- db 6,2, 6,2, 6,2,3,2,9,6,4,3
- db 6,2, 6,2, 6,2, 3,2, 6, 3, 2,6,9 ,0ffh
- melody db 14,0,14,0,12,0,8,0,7,0,7,0
- db 17,0,17,0,12,0,12,0,12,14,0,14,0
- db 14,0,14,0,12,0,8,0,7,0,7,0
- db 17,0,17,0,12,0,12,0,12,14,0,14,0 ,0ffh
- port_b equ 61h
- command_reg equ 43h
- latch2 equ 42h
- index_note dw 0
- ;РЕЗУЛЬТАТ
- result db 0
- str_win db 'You won',2,10,'$'
- str_draw db 'Draw',10,'$'
- str_lose db 'You lose',10,'$'
- str_not_complited db 'The game was not completed',10,'$'
- ;ГЕНЕРАТОРЫ РАНДОМНЫХ ЧИСЕЛ
- RND_const dw 8405h
- RND_seed1 dw ?
- RND_seed2 dw ?
- ;СЛЕДОВАНИЕ
- ; с учётом повышения вероятности прямолинейного движения
- possible_directions db 20 dup(?)
- count_possible_directions db 0
- .code
- org 100h
- locals
- start:
- ;УСТАНАВЛИВАЕМ НАЧАЛЬНЫЕ ЗНАЧЕНИЯ ДЛЯ РАНДОМА
- mov ah, 00h
- xor dh, dh
- int 1Ah
- mov RND_seed1, dx
- xor dh, dh
- int 1Ah
- mov RND_seed2, dx
- ;НАСТРОЙКА ДЛЯ МУЗЫКИ
- call music_setting
- call play_music
- ;INT1C
- ;СОХРАНЯЕМ
- push ds
- xor bx,bx
- mov ds,bx
- mov bx,[ds:0070h]
- mov es,[ds:0072h]
- mov [cs:oldseg1c],es
- mov [cs:oldofs1c],bx
- pop ds
- ;ЗАМЕНЯЕМ
- cli
- push ds
- xor bx,bx
- mov ds,bx
- lea bx,[cs:new_int_1ch]
- mov [ds:0070h],bx
- mov [ds:0072h],cs
- pop ds
- sti
- ;INT9H
- ;СОХРАНЯЕМ
- push ds
- xor bx,bx
- mov ds,bx
- mov bx,[ds:0024h]
- mov es,[ds:0026h]
- mov [cs:oldseg09],es
- mov [cs:oldofs09],bx
- pop ds
- ;ЗАМЕНЯЕМ
- cli
- push ds
- xor bx,bx
- mov ds,bx
- lea bx,[cs:new_int_9h]
- mov [ds:0024h],bx
- mov [ds:0026h],cs
- pop ds
- sti
- ;ЧИСТИМ ЭКРАН
- mov ax,0013h
- int 10h
- mov ax, 0a000h
- mov es, ax
- ;РИСУЕМ ПОЛЕ
- mov bx, offset earth
- mov y, 0
- earth_height:
- mov x, 0
- earth_str:
- call draw_picture
- add x, 10
- cmp x, 320
- jl earth_str
- add y, 10
- cmp y, 200
- jl earth_height
- ;РИСУЕМ НАЧАЛЬНЫЕ ЗМЕЙКИ
- ;ИГРОКА
- mov y, 0
- mov x, 0
- mov bx, offset self_snake
- mov cx, 0
- draw_init_self_snake:
- push cx
- call draw_picture
- pop cx
- add x, 10
- inc cx
- cmp cx, self_len_snake
- jl draw_init_self_snake
- sub x, 10
- mov bx, offset head_snake
- call draw_picture
- ;КОМПЬЮТЕРА
- mov y, 190
- mov x, 310
- mov bx, offset other_snake
- mov cx, 0
- draw_init_other_snake:
- push cx
- call draw_picture
- pop cx
- sub x, 10
- inc cx
- cmp cx, other_len_snake
- jl draw_init_other_snake
- add x, 10
- mov bx, offset head_snake
- call draw_picture
- ;РАЗБОР СОБЫТИЙ В ВЕЧНОМ ЦИКЛЕ
- perpetual_cycle:
- cmp flag_exit, 1
- je sys_exit
- cmp flag_music, 1
- jne check_move
- mov flag_music, 0
- inc index_note
- call play_music
- check_move:
- cmp flag_step, 1
- jne check_apple
- call step
- check_apple:
- cmp flag_add_apple, 1
- jne perpetual_cycle
- call generate_apples
- jmp perpetual_cycle
- proc sys_exit
- call return_vectors
- call speaker_disactivation
- call print_result
- int 20h
- endp
- proc return_vectors
- cli
- ;9
- push ds
- xor bx,bx
- mov ds,bx
- mov ax, [cs:oldofs09]
- mov [ds:0024h], ax
- mov ax, [cs:oldseg09]
- mov [ds:0026h], ax
- pop ds
- ;1c
- push ds
- xor bx,bx
- mov ds,bx
- mov ax, [cs:oldofs1c]
- mov [ds:0070h], ax
- mov ax, [cs:oldseg1c]
- mov [ds:0072h], ax
- pop ds
- sti
- ret
- endp
- proc step
- call artificial_intelligence
- call movement
- call check_state
- call redraw
- ret
- endp
- proc movement
- mov flag_step, 0
- ;1)ИГРОКА
- ;ХВОСТ
- mov al, self_snake_x[0]
- mov self_past_tail_x, al
- mov al, self_snake_y[0]
- mov self_past_tail_y, al
- ;ТЕЛО
- mov si, 1
- @@1:
- ;X
- mov al, self_snake_x[si]
- dec si
- mov self_snake_x[si], al
- inc si
- ;Y
- mov al, self_snake_y[si]
- dec si
- mov self_snake_y[si], al
- inc si
- ;cycle
- inc si
- cmp si, self_len_snake
- jl @@1
- ;ГОЛОВА
- mov si, self_len_snake
- dec si
- ;X
- mov al, self_snake_x[si]
- add al, self_dir_dx
- ; mod 32
- add al, 32
- mov bl, 32
- xor ah, ah
- div bl
- mov self_snake_x[si], ah
- ;Y
- mov al, self_snake_y[si]
- add al, self_dir_dy
- ; mod 20
- add al, 20
- mov bl, 20
- xor ah, ah
- div bl
- mov self_snake_y[si], ah
- mov al, self_next_dir
- mov self_direction, al
- ;2)КОМПЬЮТЕРА
- ;ХВОСТ
- mov al, other_snake_x[0]
- mov other_past_tail_x, al
- mov al, other_snake_y[0]
- mov other_past_tail_y, al
- ;ТЕЛО
- mov si, 1
- @@2:
- ;X
- mov al, other_snake_x[si]
- dec si
- mov other_snake_x[si], al
- inc si
- ;Y
- mov al, other_snake_y[si]
- dec si
- mov other_snake_y[si], al
- inc si
- ;cycle
- inc si
- cmp si, other_len_snake
- jl @@2
- ;ГОЛОВА
- mov si, other_len_snake
- dec si
- ;X
- mov al, other_snake_x[si]
- add al, other_dir_dx
- ; mod 32
- add al, 32
- mov bl, 32
- xor ah, ah
- div bl
- mov other_snake_x[si], ah
- ;Y
- mov al, other_snake_y[si]
- add al, other_dir_dy
- ; mod 20
- add al, 20
- mov bl, 20
- xor ah, ah
- div bl
- mov other_snake_y[si], ah
- ret
- endp
- proc check_state
- ;ПОСЛЕ ХОДА ИДЁТ ПРОВЕРКА
- ;ГОЛОВА 1-ОЙ ЧТО-ТО ТАРАНИТ
- mov si, self_len_snake
- dec si
- mov ah, self_snake_x[si]
- mov al, self_snake_y[si]
- ;свое тело
- dec si
- @@cycle1:
- mov bh, self_snake_x[si]
- mov bl, self_snake_y[si]
- cmp ax, bx
- je @@lose_1
- dec si
- cmp si, 0
- jge @@cycle1
- ;вражескую голову
- mov si, other_len_snake
- dec si
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@draw
- ;вражеское тело
- dec si
- @@cycle2:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@win_1
- dec si
- cmp si, 0
- jge @@cycle2
- jmp @@2
- @@lose_1:
- mov flag_was_crash, 1
- dec result
- jmp @@2
- @@draw:
- mov flag_was_crash, 1
- jmp @@check
- @@win_1:
- mov flag_was_crash, 1
- inc result
- jmp @@2
- ;ГОЛОВА 2-ОЙ ЧТО-ТО ТАРАНИТ
- @@2:
- mov si, other_len_snake
- dec si
- mov ah, other_snake_x[si]
- mov al, other_snake_y[si]
- ;свое тело
- dec si
- @@cycle3:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@lose_2
- dec si
- cmp si, 0
- jge @@cycle3
- ;вражеское тело
- mov si, self_len_snake
- dec si
- dec si
- @@cycle4:
- mov bh, self_snake_x[si]
- mov bl, self_snake_y[si]
- cmp ax, bx
- je @@win_2
- dec si
- cmp si, 0
- jge @@cycle4
- jmp @@check
- @@lose_2:
- mov flag_was_crash, 1
- inc result
- jmp @@check
- @@win_2:
- mov flag_was_crash, 1
- dec result
- jmp @@check
- @@check:
- cmp flag_was_crash, 0
- jne @@go_out
- ret
- @@go_out:
- call sys_exit
- ret
- endp
- proc print_result
- mov ax, 00003h
- int 10h
- cmp flag_was_crash, 0
- jne @@1
- mov dx, offset str_not_complited
- jmp @@print
- ;RESULT - ЗНАКОВАЯ ПЕРЕМЕННАЯ
- @@1:
- cmp result, 0
- jne @@2
- mov dx, offset str_draw
- jmp @@print
- @@2:
- cmp result, 0
- jg @@3
- mov dx, offset str_lose
- jmp @@print
- @@3:
- mov dx, offset str_win
- jmp @@print
- @@print:
- mov ah, 9
- int 21h
- ret
- endp
- proc redraw
- ;1)ИГРОКА
- ;ХВОСТ -> ПРОБЕЛ
- xor ah, ah
- mov al, self_past_tail_y
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, self_past_tail_x
- mul pixels_to_cell
- mov x, ax
- mov bx, offset earth
- call draw_picture
- ;ПЕРЕКРАШИВАЕМ ПРОШЛУЮ ГОЛОВУ В ТУЛОВИЩЕ
- mov si, self_len_snake
- dec si
- dec si
- xor ah, ah
- mov al, self_snake_y[si]
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, self_snake_x[si]
- mul pixels_to_cell
- mov x, ax
- mov bx, offset self_snake
- call draw_picture
- ;СТРОИМ НОВУЮ ГОЛОВУ
- mov si, self_len_snake
- dec si
- xor ah, ah
- mov al, self_snake_y[si]
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, self_snake_x[si]
- mul pixels_to_cell
- mov x, ax
- mov bx, offset head_snake
- call draw_picture
- ;2)КОМПЬЮТЕРА
- ;ХВОСТ -> ПРОБЕЛ (ЕСЛИ ТАМ НЕ ГОЛОВА ЗМЕЙКИ ИГРОКА)
- ;проверка
- mov si, self_len_snake
- dec si
- mov ah, self_snake_x[si]
- mov al, self_snake_y[si]
- mov bh, other_past_tail_x
- mov bl, other_past_tail_y
- cmp ax, bx
- je @@1
- ;удаление
- xor ah, ah
- mov al, other_past_tail_y
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, other_past_tail_x
- mul pixels_to_cell
- mov x, ax
- mov bx, offset earth
- call draw_picture
- @@1:
- ;ПЕРЕКРАШИВАЕМ ПРОШЛУЮ ГОЛОВУ В ТУЛОВИЩЕ
- mov si, other_len_snake
- dec si
- dec si
- xor ah, ah
- mov al, other_snake_y[si]
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, other_snake_x[si]
- mul pixels_to_cell
- mov x, ax
- mov bx, offset other_snake
- call draw_picture
- ;СТРОИМ НОВУЮ ГОЛОВУ
- mov si, other_len_snake
- dec si
- xor ah, ah
- mov al, other_snake_y[si]
- mul pixels_to_cell
- mov y, ax
- xor ah, ah
- mov al, other_snake_x[si]
- mul pixels_to_cell
- mov x, ax
- mov bx, offset head_snake
- call draw_picture
- ret
- endp
- proc new_int_9h
- cli
- push ax
- in al, 60h
- call change_direction
- in al, 61h
- or al, 80h
- out 61h, al
- and al, 7fh
- out 61h, al
- mov al, 20h
- out 20h, al
- pop ax
- sti
- iret
- endp
- proc change_direction
- ;БУКВА В AL
- cmp al, 1
- je key_esc
- cmp al, 75
- je left_cd
- cmp al, 72
- je up_cd
- cmp al, 80
- je down_cd
- cmp al, 77
- je right_cd
- jmp out_from_cd
- left_cd:
- cmp self_direction, 'r'
- je out_from_cd
- mov self_next_dir, 'l'
- mov self_dir_dx, -1
- mov self_dir_dy, 0
- jmp out_from_cd
- up_cd:
- cmp self_direction, 'd'
- je out_from_cd
- mov self_next_dir, 'u'
- mov self_dir_dx, 0
- mov self_dir_dy, -1
- jmp out_from_cd
- down_cd:
- cmp self_direction, 'u'
- je out_from_cd
- mov self_next_dir, 'd'
- mov self_dir_dx, 0
- mov self_dir_dy, 1
- jmp out_from_cd
- right_cd:
- cmp self_direction, 'l'
- je out_from_cd
- mov self_next_dir, 'r'
- mov self_dir_dx, 1
- mov self_dir_dy, 0
- jmp out_from_cd
- out_from_cd:
- ret
- key_esc:
- mov flag_exit, 1
- ret
- endp
- proc new_int_1ch
- push ax
- ;ДВИЖЕНИЕ
- inc ticks_after_step
- mov al, ticks_after_step
- cmp al, ticks_in_step
- jl @@1
- ;ДЕЛАЕМ ШАГ
- mov flag_step, 1
- mov ticks_after_step, 0
- ;МУЗЫКА
- @@1:
- inc ticks_after_note
- mov al, ticks_after_note
- cmp al, ticks_in_note
- jl @@2
- ;ПЕРЕКЛЮЧАЕМ МУЗЫКУ
- mov flag_music, 1
- mov ticks_after_note, 0
- ;ЯБЛОКИ
- @@2:
- inc ticks_after_apples
- mov al, ticks_after_apples
- cmp al, ticks_in_generate_apples
- jl @@out
- ;ДОБАВЛЯЕМ ЯБЛОКО
- mov flag_add_apple, 1
- mov ticks_after_apples, 0
- @@out:
- pop ax
- iret
- endp
- proc draw_picture
- ;BX = адрес картинки в байтиках
- mov ax, [y]
- mov cx, 320
- mul cx
- add ax, [x]
- mov di, ax
- mov si, 0
- mov cx, [h]
- lines:
- push cx
- mov cx, [w]
- columns:
- mov al, [bx][si]
- inc si
- stosb
- loop columns
- pop cx
- add di, 320
- sub di, [w]
- loop lines
- ret
- endp
- proc play_music
- mov ah, 0
- ;НОТА
- mov si, [index_note]
- mov al, melody[si]
- cmp al, 0
- jne @@check1
- ;ВЫКЛЮЧИЛИ
- call speaker_disactivation
- jmp @@duration
- @@check1:
- cmp al, 0ffh
- jne @@no_end
- ;ЗАЦИКЛИВАНИЕ ПЕСНИ
- mov index_note, 0
- mov si, [index_note]
- mov al, melody[si]
- @@no_end:
- ;ЧАСТОТА
- shl ax,1
- mov di,ax
- mov dx, frequency[di]
- ;ВКЛЮЧИЛИ
- call speaker_activation
- ;ИСПОЛНЕНИЕ НОТЫ
- mov al, dl
- out latch2, al
- mov al, dh
- out latch2, al
- ;ДЛИТЕЛЬНОСТЬ
- @@duration:
- mov bx, offset beat
- mov si, [index_note]
- mov al, beat[si]
- mov ticks_in_note, al
- ret
- endp
- proc music_setting
- mov si, 0
- mov al, 0b6h
- out command_reg, al
- ret
- endp
- proc speaker_activation
- in al, port_b
- or al, 00000011b
- out port_b, al
- ret
- endp
- proc speaker_disactivation
- in al, port_b
- and al, 0fch
- out 61h, al
- ret
- endp
- proc artificial_intelligence
- ;ЕСЛИ НАША ЗМЕЙКА ДАЛЕКО ОТ КОМПА, ТО ОН ЕЁ "НЕ ВИДИТ" И ГОНЯЕТ РАНДОМНО, ЕСЛИ МОЖНО НЕ УМИРАЕТ
- @@random:
- mov count_possible_directions, 0
- ;ПРАВО
- cmp other_direction, 'l'
- je @@dir2_begin
- ;КООРДИНАТА
- mov si, other_len_snake
- dec si
- mov ah, other_snake_x[si]
- add ah, 1
- cmp ah, 32
- jl @@cmp0
- sub ah, 32
- @@cmp0:
- mov al, other_snake_y[si]
- add al, 0
- ;ПРОВЕРКА НА НЕУМИРАНИЕ (без хвоста, т.к. переходит)
- mov si, 1
- @@cycle1_begin:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@dir2_begin
- inc si
- cmp si, other_len_snake
- jl @@cycle1_begin
- ;ПРОВЕРКА ПРОШЛА УСПЕШНО
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- mov possible_directions[si], 'r'
- inc count_possible_directions
- @@dir2_begin:
- ;ЛЕВО
- cmp other_direction, 'r'
- je @@dir3_begin
- ;КООРДИНАТА
- mov si, other_len_snake
- dec si
- mov ah, other_snake_x[si]
- add ah, -1
- cmp ah, 0
- jge @@cmp1
- add ah, 32
- @@cmp1:
- mov al, other_snake_y[si]
- add al, 0
- ;ПРОВЕРКА НА НЕУМИРАНИЕ
- mov si, 1
- @@cycle2_begin:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@dir3_begin
- inc si
- cmp si, other_len_snake
- jl @@cycle2_begin
- ;ПРОВЕРКА ПРОШЛА УСПЕШНО
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- mov possible_directions[si], 'l'
- inc count_possible_directions
- @@dir3_begin:
- ;ВВЕРХ
- cmp other_direction, 'd'
- je @@dir4_begin
- ;КООРДИНАТА
- mov si, other_len_snake
- dec si
- mov ah, other_snake_x[si]
- add ah, 0
- mov al, other_snake_y[si]
- add al, -1
- cmp al, 0
- jge @@cmp2
- add al, 20
- @@cmp2:
- ;ПРОВЕРКА НА НЕУМИРАНИЕ
- mov si, 1
- @@cycle3_begin:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@dir4_begin
- inc si
- cmp si, other_len_snake
- jl @@cycle3_begin
- ;ПРОВЕРКА ПРОШЛА УСПЕШНО
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- mov possible_directions[si], 'u'
- inc count_possible_directions
- @@dir4_begin:
- ;ВНИЗ
- cmp other_direction, 'u'
- je @@after_dir_begin
- ;КООРДИНАТА
- mov si, other_len_snake
- dec si
- mov ah, other_snake_x[si]
- add ah, 0
- mov al, other_snake_y[si]
- add al, 1
- cmp al, 20
- jl @@cmp3
- sub al, 20
- @@cmp3:
- ;ПРОВЕРКА НА НЕУМИРАНИЕ
- mov si, 1
- @@cycle4_begin:
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@after_dir_begin
- inc si
- cmp si, other_len_snake
- jl @@cycle4_begin
- ;ПРОВЕРКА ПРОШЛА УСПЕШНО
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- mov possible_directions[si], 'd'
- inc count_possible_directions
- ;ЕСЛИ МОЖНО ЕХАТЬ ПО ТОМУ ЖЕ НАПРАВЛЕНИЮ, ТО УВЕЛИЧИМ ВЕРОЯТНОСТЬ ПРОЕЗДА ПО ПРЯМОЙ
- mov dl, other_direction
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- @@chance_direct:
- dec si
- cmp dl, possible_directions[si]
- je @@chance_inc
- cmp si, 0
- jne @@chance_direct
- jmp @@bypass_chance
- @@chance_inc:
- mov dl, other_direction
- mov al, count_possible_directions
- xor ah, ah
- mov si, ax
- mov cx, 5
- @@counter_inc:
- mov possible_directions[si], dl
- inc si
- loop @@counter_inc
- @@bypass_chance:
- ;РАНДОМОМ ВЫБИРАЕМ СТОРОНУ
- @@after_dir_begin:
- xor ah, ah
- mov al, count_possible_directions
- call get_random
- mov si, ax
- mov bl, possible_directions[si]
- ;МЕНЯЕМ НАПРАВЛЕНИЕ
- cmp bl, 'l'
- jne @@change_dir1
- mov other_direction, 'l'
- mov other_dir_dx, -1
- mov other_dir_dy, 0
- jmp @@end
- @@change_dir1:
- cmp bl, 'r'
- jne @@change_dir2
- mov other_direction, 'r'
- mov other_dir_dx, 1
- mov other_dir_dy, 0
- jmp @@end
- @@change_dir2:
- cmp bl, 'u'
- jne @@change_dir3
- mov other_direction, 'u'
- mov other_dir_dx, 0
- mov other_dir_dy, -1
- jmp @@end
- @@change_dir3:
- cmp bl, 'd'
- jne @@end
- mov other_direction, 'd'
- mov other_dir_dx, 0
- mov other_dir_dy, 1
- jmp @@end
- @@end:
- ret
- endp
- proc generate_apples
- @@cycle:
- mov ax, 640
- call get_random
- mov bl, 32
- div bl
- ; частное = al (y), остаток = ah(x)
- ;ПРОВЕРЯЕМ СВОБОДНА ЛИ КЛЕТКА
- ;наша змейка
- mov si, self_len_snake
- @@1:
- dec si
- mov bh, self_snake_x[si]
- mov bl, self_snake_y[si]
- cmp ax, bx
- je @@cycle
- cmp si, 0
- jne @@1
- ;вражеская змейка
- mov si, other_len_snake
- @@2:
- dec si
- mov bh, other_snake_x[si]
- mov bl, other_snake_y[si]
- cmp ax, bx
- je @@cycle
- cmp si, 0
- jne @@2
- ;яблоки
- mov si, apples_len
- @@3:
- dec si
- cmp si, 0
- jl @@out
- mov bh, apples_x[si]
- mov bl, apples_y[si]
- cmp ax, bx
- je @@cycle
- jmp @@3
- @@out:
- mov si, apples_len
- mov apples_x[si], ah
- mov apples_y[si], ah
- inc apples_len
- mov al, apples_x[si]
- xor ah, ah
- mul pixels_to_cell
- mov x, ax
- mov al, apples_y[si]
- xor ah, ah
- mul pixels_to_cell
- mov y, ax
- mov bx, offset apple
- cmp qwe, 5
- jg @@qweqweqwe
- call draw_picture
- inc qwe
- ret
- @@qweqweqwe:
- int 20h
- endp
- proc get_random
- ; ВОЗВРАЩАЕТ СЛУЧАЙНОЕ ЧИСЛО ИЗ ДИАПОЗОНА [0, ax), где ax != 0
- or ax, ax ;если ноль, то флаг меняется
- jz RND_end
- push bx
- push cx
- push dx
- push ds
- push ax
- mov ax, RND_seed1
- mov bx, RND_seed2
- mov cx, ax
- mul RND_const
- shl cx, 1
- shl cx, 1
- shl cx, 1
- add ch, cl
- add dx, cx
- add dx, bx
- ;НАЧИНАЕТСЯ scramble algorithm
- shl bx, 1
- shl bx, 1
- add dx, bx
- add dh, bl
- mov cl, 5
- shl bx, cl
- add ax, 1
- adc dx, 0
- mov RND_seed1, ax
- mov RND_seed2, dx
- pop bx
- xor ax, ax
- xchg ax, dx
- ;ax = trunc((dx,ax) / bx), dx = (r)
- div bx
- ;ВОЗВРАЩАЕТ ОСТАТОК КАК СЛУЧАЙНОЕ ЧИСЛО
- xchg ax, dx
- pop ds
- pop dx
- pop cx
- pop bx
- RND_end:
- ret
- endp
- end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement