贪吃蛇
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