8086汇编贪吃蛇(随机食物+速度递增)

来源:互联网 发布:知乎中文夹杂英文 编辑:程序博客网 时间:2024/06/05 19:07
基于8086实现的贪吃蛇
[cpp] view plain copy
  1. assume cs:code,ds:data  
  2.   
  3. data segment  
  4.     dw 200 dup(0)   ;--蛇身坐标  
  5.     dw 0,0,0        ;--存储原始9号中断  
  6. data ends  
  7.   
  8. stack segment   
  9.     db 100 dup(0)  
  10. stack ends  
  11.   
  12. code segment  
  13.   
  14. start:  
  15. ;;-----------------将原始的9号中断存在data断的最后,再把9号地址换掉到offset int9  
  16.     mov ax,0  
  17.     mov es,ax  
  18.   
  19.     mov ax,data  
  20.     mov ds,ax  
  21.   
  22.     push es:[9*4]  
  23.     pop ds:[400]  
  24.   
  25.     push es:[9*4+2]  
  26.     pop ds:[402]  
  27.       
  28.     mov word ptr es:[9*4],offset int9  
  29.     mov word ptr es:[9*4+2],cs  
  30.   
  31. ;;------------------  
  32.     mov ax,stack  
  33.     mov ss,ax  
  34.     mov sp,100  
  35.   
  36.         mov ax,0b800h  
  37.         mov es,ax  
  38. ;;-----------------snake的初始化  
  39.         mov bx,0  
  40.   
  41.         mov cx,10  
  42. s:      mov ds:[bx],cx  
  43.         add bx,2  
  44.         loop s  
  45.     mov word ptr ds:[404],9  
  46.   
  47.     call putfood  
  48.     mov  bx,0001h  
  49.     mov cx,60000  
  50. s1:  
  51.     call movnext  
  52.     call delay  
  53.   
  54.         loop s1  
  55.   
  56. ;;------------恢复中断向量,程序结束  
  57. end_snake:  
  58.     mov ax,0  
  59.     mov es,ax  
  60.   
  61.     push ds:[400]  
  62.     pop es:[9*4]  
  63.     push ds:[402]  
  64.     pop es:[9*4+2]  
  65.   
  66.     mov ax,4c00h  
  67.         int 21h  
  68. ;------------------------------壁障=遇到墙壁或者咬到自己就退出  
  69. die_or_not:  
  70.     cmp dl,-1  
  71.     je die  
  72.   
  73.     cmp dl,80  
  74.     je die  
  75.   
  76.     cmp dh,-1  
  77.     je die  
  78.   
  79.     cmp dh,50  
  80.     je die  
  81.   
  82.     call putchar  
  83.     cmp byte ptr es:[di],0fh  
  84.     je die  
  85.   
  86.     jmp no_die  
  87. die:  
  88.     jmp end_snake  
  89.   
  90. no_die:  
  91.     ret  
  92. ;------------------------------移动蛇身的  
  93. movnext:  
  94.         push dx  
  95.         push cx  
  96.         push ax  
  97.   
  98.         mov si,0  
  99.         mov dx,ds:[si]  
  100.     mov ax,dx  
  101. cli  
  102.     add dh,bh  
  103.     add dl,bl  
  104. sti  
  105.     call die_or_not  
  106.         mov  ds:[si],dx  
  107.   
  108.     call putchar  
  109.     cmp word ptr es:[di],0403h  
  110.     mov word ptr es:[di],0A0fh  
  111.     jne pc_go  
  112.   
  113.     mov di,ds:[404]  
  114.     add di,di  
  115.   
  116.     push ds:[di]  
  117.     pop ds:[di+2]  
  118.     inc word ptr ds:[404]  
  119.     call putfood  
  120. pc_go:  
  121.   
  122. mn1:      
  123.     add si,2  
  124.     cmp word ptr ds:[si],0  
  125.     je mn_ok  
  126.   
  127.     mov dx,ds:[si]  
  128.     call putchar  
  129.     mov word ptr es:[di],0  
  130.   
  131.         mov dx,ax  
  132.     call putchar  
  133.     mov word ptr es:[di],0A0fh  
  134.   
  135.     mov ax,ds:[si]  
  136.         mov ds:[si],dx  
  137.     jmp mn1  
  138.   
  139. mn_ok:  pop ax  
  140.         pop cx  
  141.         pop dx  
  142. ret  
  143. ;;----------int9-----------------上48 下50  左4B   右4D  
  144. int9:  
  145.     push ax  
  146.     push es  
  147.     push cx  
  148.   
  149.     in al,60h  
  150.     pushf  
  151.       
  152.     call dword ptr ds:[400]  
  153.     cmp bl,0  
  154.     je zy  
  155.       
  156. sx:  
  157.     cmp al,48h  
  158.     jne int9x1  
  159.     mov bx,0ff00h     
  160. int9x1:  
  161.     cmp al,50h  
  162.     jne int9x2  
  163.     mov bx,0100h  
  164.   
  165. int9x2: jmp int9ok  
  166.   
  167. zy:  
  168.     cmp al,4bh  
  169.     jne int9x3  
  170.     mov bx,00ffh      
  171. int9x3:   
  172.     cmp al,4Dh  
  173.     jne int9x4  
  174.     mov bx,0001h  
  175. int9x4:  
  176.   
  177. int9ok:  
  178.     pop cx  
  179.     pop es  
  180.     pop ax  
  181.   
  182.     iret  
  183. int9_end:nop  
  184. ;--------------------------------  
  185. putchar:  
  186.     push dx  
  187.     push ax  
  188.   
  189.     mov ax,00a0h  
  190.     mul dh  
  191.     mov dh,0  
  192.     add dl,dl  
  193.     add ax,dx  
  194.     mov di,ax  
  195.   
  196.     pop ax  
  197.     pop dx  
  198. ret  
  199. ;---------------------------------  
  200. delay:  
  201.     push cx  
  202.   
  203.     mov ch,0bh  
  204.   
  205.     cmp word ptr ds:[404],24  
  206.     ja level4  
  207.         cmp word ptr ds:[404],20  
  208.     ja level3  
  209.     cmp word ptr ds:[404],15  
  210.     ja level2  
  211.     cmp word ptr ds:[404],12  
  212.     ja level1  
  213.   
  214.     jmp normal  
  215.   
  216. level4:  
  217.     shr ch,1  
  218.     shr ch,1  
  219. level3:  
  220.     shr ch,1  
  221.   
  222. level2:  
  223.     shr ch,1  
  224.   
  225. level1: shr ch,1  
  226.   
  227. normal:   
  228.   
  229.     mov cl,0ffh  
  230.     dn1:  
  231.     push cx  
  232.     mov cx,0ffffh   
  233.     dn2:loop dn2  
  234.       
  235.     pop cx   
  236.     loop dn1  
  237.     pop cx  
  238. ret  
  239. ;;-----------------------------------根据时间变化随机产生食物  
  240.   
  241. putfood:  
  242.         push ax  
  243.         push dx  
  244.     push cx  
  245.     push bx  
  246. put_again:  
  247.   
  248.     mov al,0  
  249.     out 70h,al  
  250.     in al,71h  
  251.       
  252.     mov ah,al  
  253.     mov cl,4  
  254.     shr ah,cl    ;秒数十位在ah  个位在al  
  255.   
  256.     and al,00001111b  
  257.     push ax  
  258.       
  259.     mov ah,0  
  260.       
  261.     mov dh,8  
  262.     mul dh  
  263.     mov dl,al  
  264.       
  265.     pop ax  
  266.   
  267.     sub al,al  
  268.     mov al,ah  
  269.     add al,dl  
  270.   
  271.     mov cl,23  
  272.     div cl  
  273.   
  274.     mov dh,ah  
  275. ;;-------------------防止随机产生的食物,在蛇身上  
  276.     mov cx,ds:[404]  
  277.     mov bx,0  
  278. pt1:    cmp word ptr ds:[bx],dx  
  279.     je put_again  
  280.     add bx,2  
  281.     loop pt1  
  282. ;;-------------------  
  283.     call putchar  
  284.     mov word ptr es:[di],0403h  
  285.   
  286. pf_end: pop bx  
  287.     pop cx  
  288.         pop dx  
  289.         pop ax  
  290. ret  
  291.   
  292. code ends  
  293. end start 
0 0