贪吃蛇(纯汇编版)

贪吃蛇

图片载入中

assume cs:code 
code segment 
data segment 
db '   = up     = down     = right     = left        = quit     J = cheat   -  = speed down   +  = speed up    LEVEL   1'     
data ends 

data1 segment 
db 128 dup (0) 
data1 ends 

stack segment 
db 128 dup (0) 
stack ends 
start: 
mov ax,0b800h 
mov es,ax 
mov ax,stack 
mov ss,ax 
mov sp,128 
call sub0                         ;;;;;;;;;;;;;;;;;;;清屏 

mov ax,data                   ;;;;;;;;;;;显示头 
mov ds,ax 
mov cx,58 
mov si,0 
mov bx,500 
tou: 
mov al,ds:[si] 
mov ah,01                         ;第一排字颜色 
mov es:[bx],ax 
inc si 
add bx,2 
loop tou  


mov cx,70 
mov si,60 
mov bx,660 
tou1: 
mov al,ds:[si] 
mov ah,12                         ;第二排字颜色 
mov es:[bx],ax 
inc si 
add bx,2 
loop tou1  


mov al,24 
mov ah,02 
mov es:[502],ax 
mov al,25 
mov ah,03 
mov es:[520],ax 
mov al,26 
mov ah,04 
mov es:[542],ax 
mov al,27 
mov ah,05 
mov es:[566],ax 
mov al,'Q' 
mov ah,06 
mov es:[594],ax            ;;;;;;;;;;;;;;显示头 

mov cx,68                       ;上下======= 
mov al,205                     ;上下外框形状 
mov ah,128                    ;外框颜色 

mov si,12 
s: 
mov es:[si+800],ax 
mov es:[si+22*160],ax 
add si,2 
loop s 

mov cx,16                        ;左右 ‖‖ 
mov al,186                      ;左右外框形状 
mov si,10 
s1: 
mov es:[si+6*160],ax 
mov es:[si+1098],ax 
add si,160 
loop s1 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;上面是外框 
mov cx,66                       ;上下======= 
mov bh,14    ;205                   ;上下内框形状 
mov bl,14     ;23                       ;内框颜色 
mov si,14 

s2: 
mov es:[si+960],bx 
mov es:[si+21*160],bx 
add si,2 
loop s2 

mov cx,16                        ;左右 ‖‖ 
mov al,186                      ;左右内框形状 
mov si,12 
s3: 
mov es:[si+6*160],bx 
mov es:[si+1094],bx 
add si,160 
loop s3 

mov ax,data1 
mov ds,ax 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;上面是内框 
mov bx,1140    ;总坐标 
push bx                                      ;压入蛇头坐标 

mov cx,3                                   ;总身体数量 
mov di,cx                                  ;copy身体数量给 di                         
push cx       
mov ah,01                                ;蛇头颜色 
mov al,02                                 ;蛇头形状 

mov es:[bx],ax                          ;画出蛇头 

mov ah,03                                ;身体颜色 
mov al,03                                 ;身体形状 

sst:                                             ;画出身体 
push cx 
sub bx,2 
mov es:[bx],ax 
pop cx 
loop sst 

pop cx                                    ;弹出身体数量 
pop bx 
push bx 

sst1:                                       ;将身体坐标,从前到后压入栈 
sub bx,2 
push bx 
loop sst1 
call ys                                       ;延时 

mov bp,6 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;模拟向右

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
pao: 
pop bx 
mov word ptr es:[bx],' '           ;清除身体最后1节 

paojia: 
mov si,0                                   ;归 0 
mov dx,0                                 ;归 0 
mov cx,di 
mnsq1: 
pop bx 

mov ds:[si],bx                         ; 
add si,2 

mov ah,03                                ;身体颜色 
mov al,03                                 ;身体形状 
mov es:[bx],ax 
loop mnsq1 

cmp bp,6                     ;;;;;;;;;;;;;;;;;;;;;; 
je pao6 
cmp bp,2                              
je pao2 
cmp bp,8 
je pao8 
cmp bp,4 
je pao4 

pao4: 
sub bx,2                      ;;;;;;检测按键部分 
jmp pao1 
pao8: 
sub bx,160 
jmp pao1 
pao6: 
add bx,2 
jmp pao1 
pao2: 
add bx,160 
jmp pao1                      ;;;;;;;;;;;;;;;;;;;;;; 

pao1:                              ;;;;;;;都跳这里 

mov ah,01                                ;蛇头颜色 
mov al,02                                 ;蛇头形状 

mov ds:[si],bx                          ;copy蛇头坐标入数组 

mov dx,es:[bx] 
cmp dh,00                              ;吃背景色1,身体不会变长 
je sjs 
cmp dh,07                              ;吃背景色2,身体不会变长 
je sjs 
cmp dh,03                             ;吃自己身体,身体不会变长 
je sjs                        ;这里要改动就不能吃自己身体了,或吃就over了    :  ) 

mov dx,0 
inc dx                                       ;检测到吃了东西 
sjs: 

mov es:[bx],ax                         ;蛇头当前位置 

call qiang                             ;检测蛇头前面是不是墙 

mov cx,di                           ;;;;;;;;;;;;; 
inc cx 
xhyr: 
push ds:[si]                        ;;;帮data里数据,压入栈 
sub si,2 
loop xhyr                           ;;;;;;;;;;;;;; 

call ys                                       ;延时 

cmp dx,1                                  ;吃到东西,身体会变长, 用dx来检测 
je paojia1 

mov al,0                                   ;检测是不是有按键进入 
mov ah,0bh 
int 21h 
cmp al,0ffh                              ;检测是不是有按键进入, 
je next                                      ;AL=00,没有按键进入,AL=ff有按键进入 

in ax,40h                                  ;产生不大于 4097 的随机数 

cmp ax,7*160                         ;超过边框 上 面的不要 
jb buyao1 

cmp ax,21*160                       ;超过边框 下 面的不要 
ja buyao1 

push ax 
mov dl,80                                  
div dl 
cmp ah,14                               ;超过边框 左 面的不要 
jb buyao 
cmp ah,64                               ;超过边框 右 面的不要 
ja buyao 

pop ax 
push ax 

mov dl,16                              ;不能让16正除的也不要 
div dl                                      ;设置越小,产生东西越多,注意OF,嘿嘿 
cmp ah,0 
jnz buyao 

pop ax 
      
mov si,ax                          
mov es:[si],ax                        ;用产生的随机数来添屏幕,或换单一的图形来添 
jmp buyao1 

buyao: 
pop ax 
buyao1: 
jmp pao 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;加身体 
paojia1: 
inc di 
cmp di,20                          ;设置过关的蛇身体+蛇头,总的数量 
je over 
jmp paojia 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向上 
up: 
mov bp,8 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向下 
down: 
mov bp,2 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向左 
left: 
mov bp,4 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;向右 
right: 
mov bp,6 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;结束 
over: 
mov ax,4c00h           
int 21h 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
next: 
mov al,0 
mov ah,7 
int 21h               ;帮读到的按键扫描码给AL 

cmp al,'j'            ;按键j为增加1个身体 
je paojia1 

cmp al,4bh        ;按键为左箭头  
je left  

cmp al,4dh        ;按键为右箭头  
je right  

cmp al,48h        ;按键为上箭头  
je up  

cmp al,50h        ;按键为下箭头  
je down 

cmp al,'='          ;速度增加 
je speedjia 

cmp al,'-'          ;速度减少 
je speedjian1 

cmp al,'q'        ;按键为q 

jmp pao 

;;;;;;;;;;;;;;;;;;;;;检测是不是碰墙 
qiang: 
mov ax,es:[bx+2]               
cmp ah,128 
jz over 
mov ax,es:[bx-2] 
cmp ah,128 
jz over 
mov ax,es:[bx+160] 
cmp ah,128 
jz over 
mov ax,es:[bx-160] 
cmp ah,128 
jz over                                 
ret 
;;;;;;;;;;;;;;;;;;;;;;检测是不是碰墙 
speedjian1: 
jmp speedjian 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时 
ys: 
push ax 
push dx 
speed:mov dx,1000h        ;设置蛇跑的速度 
mov ax,0 
ys1: 
sub ax,1 
sbb dx,0 
cmp ax,0 
jnz ys1 
cmp dx,0 
jnz ys1 
pop dx 
pop ax 
ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;延时 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清屏 
sub0: 
push bx 
push cx 
push es 
mov bx,0b800h 
mov es,bx 
mov bx,0 
mov cx,2000 
sub1s: 
mov byte ptr es:[bx],' ' 
add bx,2 
loop sub1s 
pop es 
pop cx 
pop bx 
ret 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;清屏 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;调整速度+++++ 
speedjia: 
push ax 
push dx 
push si 
push di 

mov si,offset speed 
mov di,offset speedjia1 
speedjia1:mov dx,500h       ;调整游戏速度 
mov ax,cs:[di+1] 
mov cs:[si+1],ax 

pop di 
pop si 
pop dx 
pop ax 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;调整速度+++++ 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;调整速度---- 
speedjian: 
push ax 
push dx 
push si 
push di 

mov si,offset speed 
mov di,offset speedjia2 
speedjia2:mov dx,2000h    ;调整游戏速度 
mov ax,cs:[di+1] 
mov cs:[si+1],ax 

pop di 
pop si 
pop dx 
pop ax 
jmp pao 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;调整速度---- 

code ends 
end start
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值