Advertisement
Guest User

Untitled

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