📄 aaa.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 99090B4 2002-1 课程设计 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; ;
; 模块1主程序 制作 张世良 ;
; ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
name snakemove
kkcol equ 1
maxx equ 30
maxy equ 30
minl equ 5
divit equ (bktab-table)/2
vvb equ 8
wordx equ maxx*16+8+32+10+24
wordy equ 64-2
disx equ 180
disy equ 150
bkcol equ 2
snbcol equ 8
snhcol equ 7
timecol equ 14
ratcol equ 6 ;棕色
;;;;;;;;;;;;;;数据段
data segment
;;;音乐
mus1 dw 1,900,990,90 ;;;;;4
dw 220,196,294,262,220,196,220,262,262
dw 294,392,330,294,262,294,330,392,330
dw 330,294,330,392,330,294,330,392,330 ;;;27(31)
mus2 dw 330,294,262,294,3 dup(330)
dw 3 dup(294),330,392,392
dw 330,294,262,294,4 dup(330)
dw 294,294,330,294,262 ;;;;;;26(57)
mus3 dw 330,392,330,294,330,392,330,294,330
dw 330,392,330,294,262,294,330,392,294
dw 262,262,220,196,220,262,294,330,262 ;;;;;;27(84)
mus4 dw 294,294,330,330,294,262,262,294
dw 330,347,392,392,347,330,330 ;;;;;;;15(99)
mus5 dw 110,120,125,130,135 ;;;;;;;5(104)
mus6 dw 392,330,347,330,294,294 ;;;;;;;6(110)
muv7 dw 600,660,520,330,440,440 ;;;;;;;6(116)
mus8 dw 390,96,140,123,112,100 ;;;;;;;;6(122)
mus9 dw 573,542,330,321,211,196 ;;;;;;;;6(128)
mus0 dw 100,110,120,90,132,135 ;;;;;;;;6(134)
bian dw ? ;;;变量,延迟时间,10ms 倍数
;;;;;;;;;图形
circle db 224,7,248,31,252,63,252,63,254,127,254,127,255,255,255,255,255,255,255,255,255,255,254,127,254,127,252,63,252,63,248,31
tauda db 0,0,0,0,192,3,240,15,248,31,248,31,252,63,252,63,252,63,252,63,252,63,248,31,248,31,240,15,192,3,0,0
rat db 240,15,252,63,254,127,254,127,207,231,135,195,167,211,207,231,255,255,255,255,255,252,255,255,239,239,158,115,124,60,248,31
bar db 254,187,189,247,255,254,247,166,175,254,109,223,231,123,235,255,254,174,119,253,250,111,55,254,255,255,187,205,254,255,247,123
;db 159,255,127,124,251,179,251,207,247,55,246,251,246,253,109,254,173,255,205,223,197,237,219,235,185,247,186,235,183,219,119,189
head db 240,15,252,63,254,127,254,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,254,127,252,63,248,31
space dw 16 dup (0)
bk db 174,35,4,145,10,40,72,69,162,64,132,151,81,16,7,121,32,130,154,120,136,168,168,43,129,0,40,149,49,66,164,136
; db 0,0,0,8,5,68,0,0,16,0,0,32,4,0,0,64,0,4,1,36,0,8,128,0,32,0,0,130,2,0,32,0
; db 174,35,4,17,10,40,72,69,160,64,128,7,81,16,7,120,0,0,154,120,136,168,136,43,128,0,40,5,48,2,36,0
you db 64,0,98,98,254,63,64,14,188,66,68,119,136,6,136,4,136,52,126,36,122,36,136,44,152,106,48,79,0,0,0,0
xi db 80,0,216,0,76,126,70,66,126,3,224,7,48,4,20,132,28,232,24,56,56,24,104,52,140,34,4,64,0,0,0,0
jie db 48,0,32,16,254,18,224,35,32,96,32,92,254,123,2,50,252,35,4,99,4,122,4,42,4,30,254,127,0,0,0,0
shu db 0,2,254,127,0,1,248,15,252,63,12,33,12,65,12,65,14,65,254,71,128,63,224,16,252,16,128,32,128,1,0,0
zhan db 0,0,128,49,254,127,192,60,255,61,204,111,140,127,140,109,254,15,254,127,14,96,254,127,15,96,255,127,0,0,0,0
ting db 0,24,127,60,251,127,252,255,14,55,14,54,255,55,254,63,7,62,255,63,59,48,56,48,248,55,112,48,0,56,0,0
table dw circle ;0
dw bar ;1
dw tauda ;2
dw head ;3
bktab dw bk ;4
dw rat ;5
dw space ;6
dw you ;7
dw xi ;8
dw jie ;9
dw shu ;10
dw zhan ;11
dw ting ;12
n1 db 0,0,0,120,0,24,0,24,0,24,0,56,0,56,0,48,0,48,0,48,0,48,0,48,0,48,0,0,0,0,0,0
n2 db 0,0,192,127,224,0,112,0,112,0,224,0,192,1,128,3,0,7,0,28,0,56,0,112,240,127,0,0,0,0,0,0
n3 db 0,0,192,63,224,0,96,0,192,0,192,1,128,1,192,0,96,0,96,0,96,192,224,240,192,63,0,0,0,0,0,0
n4 db 0,24,224,24,192,56,192,48,192,48,192,112,192,96,192,97,192,225,176,193,240,127,128,63,128,1,192,0,0,0,0,0
n5 db 48,112,240,63,48,112,0,112,0,96,0,111,192,127,224,0,96,0,96,0,192,0,192,1,128,1,128,3,0,0,0,0
n6 db 0,0,0,7,0,14,0,28,0,63,224,63,96,112,48,96,48,96,48,96,112,96,224,112,192,31,0,0,0,0,0,0
n7 db 0,48,240,127,56,112,48,48,112,48,96,0,96,0,192,0,192,0,192,1,128,1,128,1,0,3,128,1,0,0,0,0
n8 db 0,3,224,127,112,96,96,96,224,121,128,15,192,31,224,56,112,112,48,96,112,96,224,120,192,31,0,0,0,0,0,0
n9 db 0,0,224,31,112,56,48,112,48,96,48,96,112,96,224,113,224,63,224,0,192,0,192,1,128,1,128,3,0,0,0,0
n0 db 0,0,192,15,96,60,112,56,48,112,48,96,48,96,48,96,48,96,48,96,112,96,224,112,192,31,0,0,0,0,0,0
ntable dw n0
dw n1
dw n2
dw n3
dw n4
dw n5
dw n6
dw n7
dw n8
dw n9
de db 248,16,252,63,4,98,252,71,4,4,6,60,254,103,14,32,250,39,10,36,254,39,8,36,72,49,248,49,0,48,0,0
fen db 0,0,192,15,112,56,28,96,4,64,248,63,8,24,8,16,8,16,8,48,8,32,8,32,8,96,12,32,0,0,0,0
mh db 0,0,0,0,0,0,0,0,192,1,192,1,0,0,0,0,0,0,0,0,192,1,192,1,0,0,0,0,0,0,0,0
shi db 12,0,8,62,8,70,254,71,8,70,8,70,8,126,136,70,200,71,104,70,8,70,8,70,8,70,120,126,0,0,0,0
jian db 0,0,252,121,4,72,6,68,226,64,50,79,50,72,50,72,242,79,50,80,50,80,114,80,254,79,220,79,0,64,0,0
zhang db 0,0,136,0,152,60,144,4,160,4,224,44,192,124,142,64,250,65,96,63,48,5,24,5,24,5,246,61,4,0,0,0
shi1 db 16,8,16,9,16,9,18,9,30,25,240,126,16,82,16,18,16,18,112,18,248,19,24,16,14,16,254,31,0,0,0,0
liang db 0,3,128,1,128,0,254,31,2,32,122,32,250,127,2,96,2,96,254,127,192,96,195,96,115,64,24,64,206,67,130,127
;db 0,0,0,1,248,15,8,48,248,33,152,127,8,96,8,32,252,63,16,33,216,32,112,64,208,67,72,63,0,0,0,0
lin0 db 24,12,24,8,30,127,250,41,144,41,144,40,144,40,208,60,240,47,156,44,148,36,144,36,144,101,144,4,16,12,0,0
hai0 db 2,0,254,100,128,55,248,15,252,67,4,114,68,18,100,2,254,31,4,52,140,36,78,36,254,103,8,67,12,0,0,0
jun0 db 248,0,252,63,12,48,254,127,12,16,124,16,254,95,0,127,16,48,236,63,4,112,4,16,4,16,254,63,254,31,0,0
yan0 db 0,0,252,25,4,104,4,68,12,64,252,95,4,80,244,73,148,79,4,64,252,80,252,95,36,64,60,64,0,64,0,0
hai1 db 2,0,254,100,128,55,248,15,252,67,4,114,68,18,100,2,254,31,4,52,140,36,78,36,254,103,8,67,12,0,0,0
tao0 db 0,1,254,111,226,51,14,10,254,79,0,114,2,62,254,7,26,52,14,36,254,39,8,102,8,66,72,198,120,0,0,0
wang0 db 2,64,254,127,0,1,0,1,0,1,14,1,254,127,0,121,0,1,0,1,0,1,0,1,254,127,0,0,0,0,0,0
bo0 db 96,48,74,40,254,47,128,37,124,127,252,111,68,36,252,39,236,20,220,22,30,16,254,31,24,31,24,17,120,16,0,0
shi0 db 2,0,254,95,0,120,0,16,0,16,248,33,204,31,4,48,4,48,4,16,4,16,4,32,14,32,254,31,0,0,0,0
hui0 db 0,0,16,8,254,127,240,8,126,127,30,120,254,127,252,31,4,56,252,127,12,0,252,127,196,37,198,45,26,44,251,39
;db 32,16,190,95,224,121,254,95,144,105,254,127,240,79,248,63,248,79,4,120,252,63,24,45,12,57,244,40,208,39,0,0
hong0 db 12,3,8,97,14,49,250,7,24,70,24,122,24,18,24,2,18,18,254,63,48,34,24,36,12,108,0,68,0,0,0,0
fei0 db 0,0,240,31,48,112,48,0,60,0,48,0,32,0,32,0,32,0,60,0,32,0,32,0,44,0,60,0,0,0,0,0
hua0 db 128,9,134,57,250,119,0,81,0,17,6,17,254,17,0,16,128,17,128,0,130,127,254,127,128,0,128,0,128,1,0,0
bei0 db 0,6,192,6,64,6,196,126,252,6,192,6,192,2,192,2,128,2,128,2,128,2,128,2,128,126,134,112,254,0,0,0
gong0 db 0,0,254,127,254,65,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,252,1,252,127,0,0,0,0
xue0 db 0,1,12,66,24,35,16,34,252,127,4,112,244,67,14,62,24,0,16,0,254,127,8,0,16,0,16,0,0,0,0,0
yuan0 db 0,0,192,248,252,207,6,206,4,222,254,87,228,83,0,80,30,72,242,75,144,74,32,89,34,81,30,115,0,192,0,0
wordb db 0,0,192,127,96,112,32,32,64,32,192,32,128,32,64,32,32,32,32,32,32,96,96,72,192,71,0,64,0,0,0,0
zhu0 db 0,16,248,24,4,51,4,98,252,73,4,126,4,114,4,49,124,33,196,65,4,123,12,39,12,29,254,127,254,3,0,0
yuan1 db 0,0,248,63,8,64,24,64,254,127,254,127,252,127,12,96,132,32,132,33,4,35,196,109,124,120,56,48,12,64,0,0
zhang0 db 0,0,8,24,24,16,96,16,192,16,128,17,0,17,0,16,254,127,128,33,224,32,48,32,24,35,12,31,0,0,0,0
ke0 db 255,255,1,222,185,237,161,229,1,158,185,137,185,235,1,204,63,222,1,216,159,218,159,222,195,213,219,193,159,255,255,255
cheng0 db 255,255,3,199,249,232,249,237,249,129,3,136,1,172,1,174,1,172,237,204,237,199,1,196,239,204,233,141,1,228,255,255
she0 db 255,255,7,222,247,236,247,229,231,157,225,141,241,233,3,200,243,221,231,219,207,216,31,223,7,215,119,199,127,255,255,255
ji0 db 223,255,223,207,223,231,223,247,223,207,221,135,1,232,223,232,223,239,223,239,223,207,159,207,159,195,159,227,159,255,255,255
;;;;;;;;;;;;;;数据
savefilename db 'save.dat',0
filename db 'bg.bmp',0
tempmem db 320 dup(?)
bottom dw ?
mousejl db 0
color db ? ;颜色
exitmain db 0
ispause db 0
isover db 0
maxrnd db ?
lastrnd dw 864
musicn db ?
;;;;;;;;;;;;;;;以下是存档时需要纪录的数据
savedatabegin label byte
bgspace db maxx*maxy dup (255)
snakespace dw 20 dup(0)
snaketauda_ dw ? ;指向尾巴
way db ?,? ;方向标记
score dw 0 ;分数
timesec db 0
minute db 0
second db 0
soundswitch db 0ffh
vv db 5
savedataend label byte
;;;;;;;;;;;;;;;;;模块排行榜的数据
sto struc
hname dw ?
hscore dw ?
sto ends
store sto 10 dup(<>)
error1 db 'open error',0dh,0ah,'$'
error2 db 'read error',0dh,0ah,'$'
error3 db 'write error',0dh,0ah,'$'
nam dw 'za'
xh dw ?
handle dw ?
path db 'score.dat',0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
data ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;堆栈段
stack segment para stack
db 256 dup(0)
stack ends
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;代码段
code segment
main proc far
assume cs:code,ss:stack,ds:data
start:
push ds
push ds
sub ax,ax
push ax
mov bx,data
mov ds,bx
mov ah,00
mov al,12h ;set to VGA 640*480*16
int 10h
; mov ah,0bh
; mov bh,0 ;background
; mov bl,0
; int 10h
MOV AL,2
MOV DX,3C4H
OUT DX,AL
MOV AL,0FH
MOV DX,3C5H
OUT DX,AL
;;;;;;;;;;;;;;鼠标
mov ax,0
int 33h
;;;;;;;;;;;;;;背景位图
call drawpic
;;;;;;;;;;;;;;边框
sub dx,dx
mov color,kkcol
loop10:
mov bx,1
call setxy
inc dh
cmp dh,maxx
jne loop10
sub dh,dh
add dl,maxy-1
cmp dl,maxy
jl loop10
sub dx,dx
loop11:
mov bx,1
call setxy
inc dl
cmp dl,maxy
jne loop11
sub dl,dl
add dh,maxx-1
cmp dh,maxx
jl loop11
begin:
call gamestart ;初始化
mov musicn,'4'
call play
;;;;;;;;;;;;;;显示鼠标
mov ax,1
int 33h
;;;;;;;;;;;;;;移动 主循环
move:
;;;;;;时间
mov ah,2
int 1ah
cmp dh,timesec
jz mouse
mov color,timecol
mov timesec,dh ;刷新时间秒数
inc second
cmp second,60
jnz short @cc1
;进位
mov second,0
inc minute
and minute,00111111b
sub ah,ah
mov al,minute
mov dl,10
div dl
push ax
mov cx,wordx
mov dx,wordy+16+5
sub bh,bh
mov bl,al
shl bx,1
mov di,ntable[bx]
call drawc
pop ax
mov cx,wordx+16
mov dx,wordy+16+5
sub bh,bh
mov bl,ah
shl bx,1
mov di,ntable[bx]
call drawc
@cc1:
sub ah,ah
mov al,second
mov dl,10
div dl
push ax
mov cx,wordx+3*16
mov dx,wordy+16+5
sub bh,bh
mov bl,al
shl bx,1
mov di,ntable[bx]
call drawc
pop ax
mov cx,wordx+4*16
mov dx,wordy+16+5
sub bh,bh
mov bl,ah
shl bx,1
mov di,ntable[bx]
call drawc
;;;;;;鼠标
mouse: ;要求,点击并且松开鼠标左健后有效
mov ax,3
int 33h
cmp bx,1
jnz short @mou2 ;左健按下,转入点击纪录
cmp mousejl,1
jnz keybh ;无点击纪录
;有鼠标点击事件的纪录,而且鼠标间已经松开时
;;;;;;;;;;处理鼠标事件
mov mousejl,0 ;清除鼠标点击标志
cmp exitmain,1 ;退出
jz exit_main
cmp isover,1
jnz @mxy
mov isover,0
call gamestart
jmp finish
@mxy:
cmp cx,480
jl short @mou0
call button
jmp short keybh
@mou0:
cmp way,0
jz @mou1
;横向动
mov cl,4
shr dx,cl
cmp dl,byte ptr[snakespace+1]
jg keydown
jmp keyup
@mou1:
;纵向动
xchg cx,dx
mov cl,4
shr dx,cl
cmp dl,byte ptr[snakespace]
jg keyright
jmp keyleft
@mou2:
mov mousejl,1 ;纪录一个鼠标点击事件
;;;;;;键盘
keybh:
mov ah,1
int 16h ;检查键盘状态
jz finish ;无输入
mov ah,0
int 16h
mov ch,ah
;清空键盘缓存
mov ah,0ch
mov al,5 ;不等待,不回显
int 21h
cmp exitmain,1
je exit_main ;退出
;;;;;;;;;处理键盘事件
cmp isover,1
jnz @isnotover
mov isover,0
call gamestart
jmp finish
@isnotover:
mov dx,word ptr [way]
; cmp ch,01
; jz exit_main
cmp ch,39h ;space
jne @pa
call pause
@pa:
; mov musicn,'0'
; call play
cmp ch,48h
jz short keyup ;up
cmp ch,50h
jz short keydown ;down
cmp ch,4bh
jz short keyleft ;left
cmp ch,4dh
jz short keyright ;right
jmp short finish
keyup:
cmp dh,1
je finish
mov way,0
mov [way+1],-1
jmp finish
keydown:
cmp dh,-1
je finish
mov way,0
mov [way+1],1
jmp finish
keyleft:
cmp dl,1
je finish
mov way,-1
mov [way+1],0
jmp finish
keyright:
cmp dl,-1
je finish
mov way,1
mov [way+1],0
finish:
cmp ispause,0
jne mouse
cmp isover,0
jne mouse
cmp exitmain,1
je mouse
mov dx,snakespace ;get snake head xy
add dh,[way] ;x
add dl,[way+1] ;y
mov bp,dx
mov color,snbcol
call getxy ;get next place in bl
cmp bl,divit
jl fail ;game over
mov di,snaketauda_ ;旧蛇尾
cmp bl,5
jz short addsnake
mov color,bkcol
mov dx,[di-2]
mov bx,divit
call setxyc
mov color,snbcol
mov dx,[di-2]
mov bx,2
call setxy ;画新蛇尾
mov color,bkcol
mov dx,[di] ;旧蛇尾xy
mov bx,divit
call setxyc ;清除旧蛇尾
jmp @123
addsnake:
;;;;;加长
mov musicn,'7'
call play
call addscore
call outrat
add di,2
mov snaketauda_,di
mov dx,di
add dx,2
cmp dx,offset snaketauda_
jnz @123
call collapsing
;;;;;;;;;;;前进
@123:
mov color,bkcol
lea si,snakespace
mov dx,[si]
mov bx,divit
call setxyc
mov color,snbcol
mov bx,0
call setxy ;蛇的第一节身体
newsnake:
mov ax,[di-2]
mov [di],ax ;前进一格
sub di,2
cmp di,si
jnz newsnake
mov snakespace,bp ;蛇头新位置
mov color,snhcol
mov dx,bp
mov bx,3
call setxy ;画蛇头
;;;;;;;;delay
mov al,9
sub al,vv
shl al,1
@l:
cmp al,0
jz @lend
mov bx,3
call setxy
dec ax
jmp @l
@lend:
jmp move
fail:
mov musicn,'5'
call play
call gameover
jmp mouse
;;;;;;;;;;;;;;
exit_main:
mov ah,00
mov al,7h
int 10h
mov ah,0bh
mov bh,0
mov bl,0
int 10h
lea dx,path ;文件名
mov ah,3ch
mov cx,0 ;文件属性
int 21H ;创建
call rank
ret
main endp
;;;;;;;;;;;;;;;;;;;置数组(不覆盖背景)x=dh,y=dl,bx
setxy proc near
push ax
push bx
push cx
push dx
push si
push di
push bp
mov ch,maxx
;;;;ax=dl*maxx+dh
sub ah,ah
mov al,dl
mul ch ;ax=dl*maxx
sub ch,ch
mov cl,dh ;cx=dh
add ax,cx ;ax=dl*maxx+dh
;;;;矩阵赋值
mov si,ax
mov bgspace[si],bl
shl bx,1
mov di,table[bx];数据指针
sub ah,ah
mov al,dh ;x in ax
mov dh,ah ;clear dh,y in dx
mov cl,4
shl ax,cl ;ax *=16
shl dx,cl ;dx *=16 Y in screen
mov cx,ax ;x in cx X in screen
call draw
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
setxy endp
;;;;;;;;;;;;;;;;;;;置数组(覆盖背景)x=dh,y=dl,bx
setxyc proc near
push ax
push bx
push cx
push dx
push si
push di
push bp
mov ch,maxx
;;;;ax=dl*maxx+dh
sub ah,ah
mov al,dl
mul ch ;ax=dl*maxx
sub ch,ch
mov cl,dh ;cx=dh
add ax,cx ;ax=dl*maxx+dh
;;;;矩阵赋值
mov si,ax
mov bgspace[si],bl
shl bx,1
mov di,table[bx];数据指针
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -