⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aaa.asm

📁 1.可设置方格数目
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;    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 + -