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

📄 richard.asm

📁 课程设计,俄罗斯方块,源码用汇编语言编写,在DOS运行,用MASM2.0编译.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	jl j2
	mov cl,2
	mul cl
	add al,BOARD_LEFT+1
	mov cl,i
	add cl,BOARD_TOP+1
	add cl,yp
	gotoxy al,cl

	mov al,yp
	add al,i
	mov cl,BOARD_WIDTH+2
	mul cl
	add al,xp
	add al,j
	mov cx,[bp+6]
	push bx
	mov bx,ax
	cmp array[bx],cl
	pop bx
	jnz j2
	string 0dbh,2
j2:
	inc j
	cmp j,3
	jl e
	inc i
	cmp i,3
	jl d
exit1:
	popall
	pop bp
	ret 4
draw endp

generate proc near
	pushall

	cmp next_set,0
	je next1
	cmp next_set,1
	jne ran

	mov ax,next_brick_no
	push ax
	mov ax,BOARD_BACK
	push ax
	call show_next

ran:
	random
	mov next_brick_no,ax
	mov next_set,0
next1:
	mov ax,next_brick_no
	mov brick_no,ax
	random
	mov next_brick_no,ax
	mov ax,brick_no
	push ax
	mov ax,BOARD_BACK
	push ax
	call show_next

	mov ax,next_brick_no
	push ax
	mov ax,next_brick_no
	add ax,8
	push ax
	call show_next

	cmp mess12,1
	jne j35
	mov brick_no,6
	mov mess12,0
j35:
	cmp brick_no,6
	jae el

	mov i,0
j4:
	mov j,4
jr:
	mov ax,brick_no
	mov cl,6
	mul cl
	mov bx,ax

	mov ax,0
	mov al,i
	mov cl,3
	mul cl
	add al,j
	sub ax,4
	add bx,ax
	mov dl,brick_set[bx]

	mov ax,0
	mov al,i
	mov cl,BOARD_WIDTH+2
	mul cl
	add al,j
	adc ah,0
	mov bx,ax
	mov array[bx],dl

	mov xp,5
	mov yp,0

	inc j
	cmp j,7
	jb jr
	inc i
	cmp i,2
	jb j4
	jmp exit2

el:                           ;draw stick
	mov bx,3
el1:
	mov array[bx],BRICK
	inc bx
	cmp bx,7
	jb el1

	mov xp,4
	mov yp,0
	mov ticket,1
exit2:
	mov ax,BRICK
	push ax
	mov ax,15
	push ax
	call draw

	popall
	ret
generate endp

new_game proc near
	pushall

	mov ax,BOARD_HEIGHT+2   ;MAKE ARRAY ZERO
	mov cl,BOARD_WIDTH+2
	mul cl
	mov cx,ax
loop1:
	mov bx,cx
	dec bx
	mov array[bx],EMPTY
	loop loop1

	mov next_set,1

	mov bl,SCORE_ATTR

	gotoxy SCORE_LEFT+3,SCORE_TOP+6
	cprintf '0'
	mov time_set,0
	mov down_speed,0

	gotoxy SCORE_LEFT+3,SCORE_TOP+4
	cprintf '0'

	mov ax,WALL
	push ax
	mov ax,15
	push ax
	call draw

	popall
	ret
new_game endp

move proc near
	push bp
	mov bp,sp
	pushall

	mov ax,BRICK
	push ax
	mov ax,BOARD_BACK
	push ax
	call draw

	mov ax,[bp+4]
	cmp ax,MOVE_DOWN
	je dow
	cmp ax,MOVE_LEFT
	je lef
	cmp ax,MOVE_RIGHT
	je rig
	cmp ax,REVOLVE
	je rev
	jmp exit3

dow:
	mov bx,(BOARD_HEIGHT+2)*(BOARD_WIDTH+2)
sh:
	dec bx
	cmp array[bx],BRICK
	jne ren
	mov array[bx],EMPTY
	mov array[bx+BOARD_WIDTH+2],BRICK
ren:
	cmp bx,0
	jge sh
	inc yp
	jmp redraw

lef:
	mov bx,0
le0:
	cmp array[bx],BRICK
	jne le1
	mov array[bx],EMPTY
	mov array[bx-1],BRICK
le1:
	inc bx
	cmp bx,(BOARD_HEIGHT+2)*(BOARD_WIDTH+2)
	jb le0
	dec xp
	jmp redraw

rig:
	mov bx,(BOARD_HEIGHT+2)*(BOARD_WIDTH+2)
ri0:
	dec bx
	cmp array[bx],BRICK
	jne ri1
	mov array[bx],EMPTY
	mov array[bx+1],BRICK
ri1:
	cmp bx,0
	jge ri0
	inc xp
he1:
	jmp redraw
he2:
	jmp cstrick
rev:
	cmp brick_no,5
	je he1
	cmp brick_no,6
	je he2

	mov i,-1
rev1:
	mov bl,yp
	add bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	mov j,-1
rev3:
	mov cl,xp
	add cl,j
	mov ch,0
	mov si,cx
	mov al,array[bx][si]
	and al,0fh
	cmp al,BRICK
	jne rev2

	push bx
	mov bl,yp
	add bl,j
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	add bl,xp
	sub bl,i
	or array[bx],10h
	pop bx
rev2:
	inc j
	cmp j,2
	jl rev3
	inc i
	cmp i,2
	jl rev1

	mov i,-1
rev4:
	mov bl,yp
	add bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

	mov j,-1
rev5:
	mov cl,xp
	add cl,j
	mov ch,0
	mov si,cx
	mov cl,4
	shr array[bx][si],cl

	inc j
	cmp j,2
	jl rev5
	inc i
	cmp i,2
	jl rev4
	jmp redraw

cstrick:
	cmp ticket,1
	jne str2

	mov bl,yp
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

	mov cl,-1
str1:
	mov dl,xp
	add dl,cl
	mov dh,0
	mov si,dx
	mov array[bx][si],EMPTY

	push bx
	mov bl,yp
	add bl,cl
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	mov al,xp
	mov ah,0
	mov si,ax
	mov array[bx][si],BRICK
	pop bx

	inc cl
	cmp cl,3
	jl str1
	mov ticket,0
	jmp redraw

str2:
	mov cl,-1
str3:
	mov bl,yp
	add bl,cl
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

	mov ax,0
	mov al,xp
	mov si,ax
	mov array[bx][si],EMPTY

	push bx
	mov bl,yp
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	mov ax,0
	mov al,xp
	add al,cl
	mov si,ax
	mov array[bx][si],BRICK
	pop bx
	inc cl
	cmp cl,3
	jl str3
	mov ticket,1

redraw:
	mov ax,BRICK
	push ax
	mov ax,15
	push ax
	call draw
exit3:
	popall
	pop bp
	ret 2
move endp

moveable proc near
	push bp
	mov bp,sp
	pushall

	mov mable,YES

	mov ax,[bp+4]
	cmp ax,MOVE_DOWN
	je mdj
	cmp ax,MOVE_LEFT
	je mlj
	cmp ax,MOVE_RIGHT
	je mrj
	cmp ax,REVOLVE
	je rr
	jmp exit6
mdj:    jmp md
mlj:    jmp ml
mrj:    jmp mr
rr:     jmp rl
md:
	mov bx,BOARD_HEIGHT-1;
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

	mov si,0
md0:
	cmp array[bx][si],BRICK
	jne md1
	jmp b5
md1:
	inc si
	cmp si,BOARD_WIDTH
	jb md0

	;sub bx,BOARD_WIDTH+2
md2:
	cmp array[bx],BRICK
	jne md3
	cmp array[bx+BOARD_WIDTH+2],WALL
	jb md3 ;
	jmp b5
md3:
	dec bx
	cmp bx,0
	jge md2
	jmp exit6

ml:
	mov bx,0
	mov cl,0
ml0:
	cmp array[bx],BRICK
	jne ml1
	jmp b5
ml1:
	add bx,BOARD_WIDTH+2
	inc cl
	cmp cl,BOARD_HEIGHT
	jb ml0

	mov bx,BOARD_HEIGHT
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

ml2:
	dec bx
	cmp array[bx],BRICK
	jne ml3
	cmp array[bx-1],WALL
	jb ml3 ;
	jmp b5
ml3:
	cmp bx,0
	jge ml2
	jmp exit6

mr:
	mov bx,BOARD_WIDTH-1
	mov cx,BOARD_HEIGHT
mr0:
	cmp array[bx],BRICK
	jne mr1
	jmp b5
mr1:
	add bx,BOARD_WIDTH+2
	loop mr0

	mov bx,BOARD_HEIGHT
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax

mr2:
	cmp array[bx],BRICK
	jne mr3
	cmp array[bx+1],WALL
	jb mr3  ;
	jmp b5
mr3:
	dec bx
	cmp bx,0
	jge mr2
	jmp exit6

rl:
	cmp brick_no,5
	je b50
	cmp brick_no,6
	je b600

	cmp yp,0
	je b50
	cmp yp,BOARD_HEIGHT-1
	je b50
	cmp xp,0
	je b50
	cmp xp,BOARD_WIDTH-1
	je b50
	jmp rl00
b50:
	jmp b5
b600:
	jmp b6
rl00:
	mov i,-1
rl0:
	mov j,-1
rl2:
	mov bl,yp
	add bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	add bl,xp
	add bl,j
	cmp array[bx],BRICK
	jne rl1

	mov bl,yp
	add bl,j
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	sub bl,i
	cmp array[bx],WALL
	jb rl1     ;
	jmp b5

rl1:
	inc j
	cmp j,2
	jl rl2
	inc i
	cmp i,2
	jl rl0
	jmp exit6

b6:
	cmp ticket,1
	jne b60
	cmp yp,0
	je b5
	cmp yp,BOARD_HEIGHT-2
	jae b5
	jmp b61

b60:
	cmp xp,0
	je b5
	cmp xp,BOARD_WIDTH-2
	jae b5

	mov i,-1
b61:
	mov bl,yp
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	add bl,xp
	add bl,i
	mov dl,array[bx]

	mov bl,yp
	add bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	add bl,xp
	add dl,array[bx]
	cmp dl,BRICK+WALL
	jb b62    ;
	jmp b5
b62:
	inc i
	cmp i,3
	jl b61
	jmp exit6

b5:
	mov mable,NO
exit6:
	popall
	pop bp
	ret 2
moveable endp

brick_reach_bottom proc near
	pushall
	mov down_offset,0
	mov i,BOARD_HEIGHT;-1
rea0:
	mov cx,0
	mov bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov bx,ax
	mov si,0
rea1:
	cmp array[bx][si],BRICK
	jne rea2
	mov dx,brick_no
	add dx,8
	mov array[bx][si],dl
rea2:
	cmp array[bx][si],0
	je rea3
	inc cx
rea3:
	inc si
	cmp si,BOARD_WIDTH
	jb rea1

	mov bx,0
	mov bl,i

	cmp cx,BOARD_WIDTH
	jne rea4
	inc down_offset
	mov row_down_offset[bx],0
	jmp rea5
rea4:
	mov dl,down_offset
	mov row_down_offset[bx],dl
rea5:
	dec i
	cmp i,0
	jge rea0

	mov i,BOARD_HEIGHT-1
rea6:
	mov al,down_offset
	cmp al,0
	je exit7
	mov bx,0
	mov bl,i
	cmp row_down_offset[bx],al
	jne rea7

	mov bl,i
	add bl,down_offset
	mov ax,BOARD_WIDTH+2
	mul bl
	mov cx,ax

	mov bl,i
	mov ax,BOARD_WIDTH+2
	mul bl
	mov si,0

rea8:   mov bx,ax
	mov dl,array[bx][si]
	mov bx,cx
	mov array[bx][si],dl
	mov bx,ax
	mov array[bx][si],EMPTY
	inc si
	cmp si,BOARD_WIDTH
	jb rea8
rea7:
	dec i
	cmp i,0
	jge rea6
exit7:
	mov ax,WALL
	push ax
	mov ax,15
	push ax
	call draw

	popall
	ret
brick_reach_bottom endp

game_over proc near
	pushall
	mov gover,NO
	mov bx,0
ga1:
	cmp array[bx],WALL
	jb ga2
	mov gover,YES
	jmp exit8
ga2:
	inc bx
	cmp bx,BOARD_WIDTH
	jb ga1
exit8:
	popall
	ret
game_over endp


new_int proc near
	push ds
	push es
	push bx
	push ax
	push cx
	push dx
	mov ax,data
	mov ds,ax
	sti

	inc time_set
	cmp time_set,1000
	jb exit9
	mov time_set,0

exit9:
	cli
	pop dx
	pop cx
	pop ax
	pop bx
	pop es
	pop ds
	iret
new_int endp

calc proc near
	pushall
	mov al,down_offset
	cmp al,0
	je exitc
	cmp al,1
	je d1
	cmp al,2
	je d2
	cmp al,3
	je d3

	add current_score,60
	jmp exitc
d1:
	add current_score,10
	jmp exitc
d2:
	add current_score,25
	jmp exitc
d3:
	add current_score,40
exitc:
	popall
	ret
calc endp

dec_div proc near
	mov ax,bx
	mov dx,0
	div cx
	mov bx,dx

	add al,30h
	push bx
	push cx
	mov bl,SCORE_ATTR
	cprintf al
	pop cx
	pop bx
	ret
dec_div endp

score proc near
	pushall

	call calc
	printscore SCORE_LEFT+3,SCORE_TOP+6,current_score
	printscore SCORE_LEFT+3,SCORE_TOP+2,high_score

	mov ax,current_score
	cmp high_score,ax
	ja comp
	mov high_score,ax
	printscore SCORE_LEFT+3,SCORE_TOP+2,high_score
comp:
	mov ax,level
	cmp current_score,ax
	jb exitsc

	inc down_speed
	add level,300       ;add level
	mov bl,SCORE_ATTR
	gotoxy SCORE_LEFT+3,SCORE_TOP+4,current_score
	mov dx,down_speed
	add dl,30h
	cprintf dl
exitsc:
	popall
	ret
score endp
code ends
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -