Advertisement
Guest User

Untitled

a guest
Dec 13th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. model   small
  2.  
  3. .data                   ;Сегмент данных. Храним координаты тела змейки
  4. snake   dw 0000h
  5.         dw 0001h
  6.         dw 0002h
  7.         dw 0003h
  8.         dw 0004h
  9.         dw 7CCh dup('?')
  10. tick    dw 0            ;Счетчик
  11. .stack 100h
  12.  
  13. .code
  14. ;В начале сегмента кода будем размещать процедуры
  15. delay proc
  16.     push cx
  17.     mov ah,0
  18.     int 1Ah
  19.     add dx,3
  20.     mov bx,dx
  21. repeat:  
  22.     int 1Ah
  23.     cmp dx,bx
  24.     jl repeat
  25.     pop cx
  26.     ret
  27. delay endp
  28. key_press proc
  29.     mov ax, 0100h
  30.     int 16h
  31.     jz en           ;Без нажатия выходим
  32.     xor ah, ah
  33.     int 16h
  34.     cmp ah, 50h
  35.     jne up
  36.     cmp cx,0FF00h       ;Сравниваем чтобы не пойти на себя
  37.     je en
  38.     mov cx,0100h
  39.     jmp en
  40. up: cmp ah,48h
  41.     jne left
  42.     cmp cx,0100h
  43.     je en
  44.     mov cx,0FF00h
  45.     jmp en
  46. left: cmp ah,4Bh
  47.     jne right
  48.     cmp cx,0001h
  49.     je en
  50.     mov cx,0FFFFh
  51.     jmp en
  52. right: cmp cx,0FFFFh
  53.     je en
  54.     mov cx,0001h
  55. en:
  56.     ret
  57. key_press endp
  58. add_food proc
  59. sc:
  60.     inc bl              ;В регистре BL рандомное число
  61.     cmp bx,50h    ;Проверяем границу числа
  62.     jng ex
  63.     shr bl,1           ;Если больше, делим на 2 логическим сдвигом
  64.     jmp sc
  65. ex:
  66.     mov dl,bl         ;Запись координаты
  67. sc2:    
  68.     cmp bx,19h
  69.     jng ex2
  70.     shr bl,2
  71.     jmp sc2
  72. ex2:
  73.     mov dh,bl         ;Запись координаты
  74.     mov ax,0200h
  75.     int 10h
  76.     mov ax,0800h
  77.     int 10h
  78.     cmp al,2Ah       ;Проверяем пустое ли место
  79.     je sc
  80.     cmp al,40h      
  81.     je sc                  ;Если нет повторяем
  82.     mov ax,0200h
  83.     mov dl,0024h
  84.     int 21h
  85.     ret
  86. add_food endp
  87. game_over proc
  88. ;Проверяем границы
  89.     cmp dl,50h
  90.     je exit
  91.     cmp dl,0
  92.     jl exit
  93.     cmp dh,0
  94.     jl exit
  95.     cmp dh,19h
  96.     je exit
  97. ;Проверяем символы
  98.     cmp al,2Ah
  99.     je exit
  100.     cmp al,40h
  101.     je exit
  102.     jmp good
  103. exit:
  104.     mov ax,4c00h
  105.     int 21h
  106. good:
  107.     ret
  108. game_over endp
  109. start:
  110.     mov ax,@data
  111.     mov ds,ax
  112.     mov es,ax
  113.  
  114.     mov ax,0003h
  115.     int 10h             ;Очищаем игровое поле
  116.  
  117.     mov cx,5
  118.     mov ax,0A2Ah
  119.     int 10h             ;Выводим змейку из 5 символов "*"
  120.  
  121.  
  122.     mov si,8            ;Индекс координаты символа головы
  123.     xor di,di           ;Индекс координаты символа хвоста
  124.     mov cx,0001h        ;Регистр cx используем для управления головой. При сложении от значения cx будет изменяться координата x или y
  125.     mov bl,51h
  126.     call add_food
  127. main:               ;Основной цикл
  128.     call delay
  129.     call key_press
  130.     xor bh,bh
  131.     mov ax,[snake+si]       ;Берем координату головы из памяти
  132.     add ax,cx               ;Изменяем координату x
  133.     inc si              
  134.     inc si
  135.     cmp si,7CAh
  136.     jne nex
  137.     xor si,si
  138. nex:
  139.     mov [snake+si],ax       ;Заносим в память новую координату головы змеи
  140.     mov dx,ax          
  141.     mov ax,0200h
  142.     int 10h             ;Вызываем прерывание. Перемещаем курсор
  143.  
  144.     mov ax,0800h
  145.     int 10h                     ;Читает символ
  146.     call game_over
  147.     mov dh,al
  148.  
  149.     mov ah,02h
  150.     mov dl,002Ah
  151.     int 21h             ;Прерывание выводит символ '*'
  152.  
  153.     cmp dh,24h
  154.     jne next
  155.         push cx             ;В стек регистр
  156.     mov cx,[tick]
  157.     inc cx
  158.     cmp cx,5
  159.     jne exl
  160.     xor cx,cx
  161.     mov ax,0200h        
  162.     mov dx,[snake+di-2]
  163.     int 10h
  164.     mov ax,0200h
  165.     mov dl,0040h
  166.     int 21h
  167. exl:mov [tick],cx
  168.     pop cx
  169.     call add_food
  170.     jmp main
  171. next:
  172.     mov ax,0200h        
  173.     mov dx,[snake+di]
  174.     int 10h
  175.     mov ax,0200h
  176.     mov dl,0020h
  177.     int 21h         ;Выводим пробел, тем самым удаляя хвост
  178.     inc di
  179.     inc di
  180.     cmp di,7CCh
  181.     jne main
  182.     xor di,di
  183. jmp main
  184. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement