📄 park13.asm
字号:
;键盘ascii标识
left EQU 4bh
right EQU 4dh
up EQU 48h
down EQU 50h
.model small
.stack
.data
;------------布局数组------------------------------------------------------
MS DB 1,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1,1,3
DB 1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DB 1,1,3,3,1,1,3,3,3,3,1,3,3,3,3,1,1,2,3,1
DB 1,1,3,2,1,1,3,1,1,1,1,1,1,1,3,1,1,3,1,1
DB 1,1,3,3,1,1,3,1,3,3,1,3,3,1,3,1,3,1,1,1
DB 1,1,3,2,1,1,3,1,3,1,1,2,3,1,3,1,1,1,1,1
DB 1,1,3,3,1,1,1,1,1,1,3,1,1,1,1,1,1,2,3,1
DB 1,1,3,1,1,1,3,1,3,2,1,1,3,1,3,1,2,3,1,1
DB 1,1,3,1,1,1,3,1,3,3,3,3,3,1,3,1,3,1,1,1
DB 1,1,3,2,1,1,3,1,1,1,1,1,1,3,3,1,1,1,1,1
DB 1,1,3,1,1,1,3,3,3,3,1,3,3,3,1,1,1,1,1,1
DB 1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DB 1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1
DB 1,1,1,1,1,1,3,2,3,1,1,1,1,1,1,1,2,1,1,1
DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,3,3,3,1,1
DB 1,1,1,1,2,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1
DB 1,1,3,1,2,1,1,1,1,3,1,1,2,2,2,1,1,3,1,1
DB 1,1,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,1,1
DB 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
DB 1,1,1,1,1,1,1,2,1,1,3,3,1,1,1,1,1,1,1,1
X DW 180 ;地图横坐标
Y DW 80 ;地图纵坐标
;---------------------------------------------------------------------------
wel_ms DB 12
DB 20
DB 10000110b
DB 'Welcome to park finding game:)',0ffh
DB 'Game Writer:leaf young',0ffh
DB 00h
;---------------------------------------------------------------------------
ins_ms DB 18
DB 25
DB 10000110b
DB 'Please chose:',0ffh
DB 'Press <Esc> to quit',0ffh
DB 'Press <Enter> to start',0ffh
db 00h
;----------------------------------------------------------------------------
gameover_ms DB 2
DB 30
DB 10000110b
DB 'Game Over! :(',0ffh
DB 'Press<Esc> to quit',0ffh
DB 'Press<Enter> to new game',0ffh
DB 00h
;------------------------------------------------------------------------------
youwin_ms DB 2
DB 30
DB 10000110b
DB 'You Win! :)',0ffh
DB 'Press<Esc> to quit',0ffh
DB 'Press<Enter> to new game',0ffh
DB 00h
start_col DB 0
;---------------------------------------------------------------------------------
hole_color DW 25 ;陷阱颜色
;----------------------------------------------------------------------------------
gold_color DW 142 ;宝物颜色
gold_number DW 18 ;宝物数量
;----------------------------------------------------------------------------------
a_color DW 2 ;方块a颜色
a_y DW 384 ;行数
a_x DW 180 ;列数
a_size DW 16
;---------------------------------------------------------------------------------
b_color DW 2 ;方块b颜色
b_y DW 384 ;行数
b_x DW 484 ;列数
b_size DW 16
;----------------------------------------------------------------------------------
my_color DW 5 ;方块my颜色
my_y DW 80 ;行数
my_x DW 180 ;列数
my_size DW 16
;--------------------------frame----------------------------------------------------
f_color DW 7 ;frame 颜色
f_l_c DW 180 ;frame 坐表
f_r_c DW 501
f_u_r DW 80
f_d_r DW 401
;----------------------活动边界------------------------------------------------------
lim_right equ 468
lim_left equ 196
lim_up equ 96
lim_down equ 368
;--------------------------------------------------------------------------------------
temp DW 16
;----------------------用于计算数组中位置的参量----------------------------------------------------------------
row DW 0
col DW 0
row_a dw 0
col_a dw 304
row_b dw 304
col_b dw 304
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
.code
main PROC FAR
start:
MOV AX,@data
MOV DS,AX
;-----------------------------保存当前显示模式----------------------------
MOV AH,0fh
INT 10h
PUSH AX
;-----------------------------初始显示模式------------------------------
MOV AH,0
MOV AL,12h
INT 10h
MOV AX,0A000H
MOV ES,AX
;-------------------------------打印欢迎信息-----------------------------------------
MOV AL,0
CALL set_write_mode
CALL welcome_screen
;------------------------------接受键盘响应-------------------------------------------------
mov ah,0
int 16h
cmp al,1bh
jz return
cmp ah,1ch
jz begin
;------------------------------退出--------------------------------------
return:
jmp near ptr gowindows
;------------------------------进入游戏------------------------------------
begin:
;----------------------------填充屏幕---------------------------------
MOV AL,2
CALL set_write_mode
MOV CH,0
MOV CL,0
MOV DH,80
MOV DL,60
MOV AL,00000000b
CALL COARSE_FILL
MOV AL,0
CALL set_write_mode
;-----------------------------绘制游戏地图-------------------------------------------------------------
call draw_map
;------------------------------绘制游戏角色--------------------------------------------------
draw:
call rectmy
call recta
call rectb
;------------------------------判断是否达到游戏胜利条件----------------------------------
mov ax,gold_number
mov temp,0
cmp ax,temp
jnz goto0
jmp near ptr youwin
;------------------------------------判断是否达到游戏失败条件------------------------------------------------------
goto0:
mov ax,b_x
cmp my_x,ax
jnz goto1
mov ax,b_y
cmp my_y,ax
jnz goto1
jmp near ptr exit
goto1:
mov ax,a_x
cmp my_x,ax
jnz beginkeyjudge
mov ax,a_y
cmp my_y,ax
jnz beginkeyjudge
jmp near ptr exit
;-----------------------------------------检测键盘----------------------------------------------------------------
beginkeyjudge:
mov ah,0
int 16h
;---------------------------------------处理键盘响应--------------------------------
cmp ah,right
jz jump_mov_r
judge1: cmp ah,right
jz judge5
cmp ah,left
jz jump_mov_l
judge2: cmp ah,left
jz judge5
cmp ah,up
jz jump_mov_u
judge3: cmp ah,up
jz judge5
cmp ah,down
jz jump_mov_d
judge4: cmp ah,down
jz judge5
cmp al,1bh ;esc
jnz beginkeyjudge
jmp near ptr exit
judge5: ;call judgea
call judgeb
jmp near ptr draw
;-----------------------------------------------------------------------
jump_mov_l:
push ax
cmp my_x,lim_left
jae middle1
jmp near ptr draw
middle1:
call mov_l
call count_left
mov ax,0
mov ax,16
sub row,ax
pop ax
jmp near ptr judge2
jump_mov_r:
push ax
cmp my_x,lim_right
jbe middle2
jmp near ptr draw
middle2:
call mov_r
call count_right
mov ax,0
mov ax,16
add row,ax
pop ax
jmp near ptr judge1
jump_mov_u:
push ax
cmp my_y,lim_up
jae middle3
jmp near ptr draw
middle3:
call mov_u
call count_up
mov ax,0
mov ax,16
sub col,ax
pop ax
jmp near ptr judge3
jump_mov_d:
push ax
cmp my_y,lim_down
jbe middle4
jmp near ptr draw
middle4: call mov_d
call count_down
mov ax,0
mov ax,16
add col,ax
pop ax
jmp near ptr judge4
;-----------------------------------判断是否退出游戏或继续游戏---------------------------------------------------
exit:
CALL gameover_screen
jmp check
youwin:
call youwin_screen
check: mov ah,0
int 16h
cmp al,1bh
jz gowindows
cmp ax,1c0dh
jz tobegin
jmp check
;------------------------------------从新初始化个变量开始新游戏----------------------------------------
tobegin:
mov ax,80
mov y,ax
mov ax,180
mov x,ax
mov ax,80
mov my_y,ax
mov ax,180
mov my_x,ax
mov ax,0
mov row,ax
mov col,ax
mov ax,384
mov a_y,ax
mov ax,180
mov a_x,ax
mov ax,0
mov row_a,ax
mov ax,304
mov col_a,ax
mov ax,384
mov b_y,384
mov ax,484
mov b_x,ax
mov ax,304
mov row_b,ax
mov col_b,ax
mov ax,18
mov gold_number,ax
jmp near ptr begin
;------------------------------------------------退出游戏-----------------------------------
gowindows:
pop ax
mov ah,00h
int 10h
mov ax,4c00h
int 21h
main endp
;********************************************************************************************
;*******************************控制追击者a的状态**************************************************************
judgea proc near
mov ax,my_y
cmp a_y,ax
jbe goon0
jmp near ptr mov_up_a
goon0:
cmp a_y,ax
jae goon1
jmp near ptr mov_down_a
goon1:
mov ax,my_x
cmp a_x,ax
jae goon2
jmp near ptr mov_right_a
goon2:
cmp a_x,ax
jbe goon3
jmp near ptr mov_left_a
goon3:
jmp near ptr exit
;**********************************************************************up
mov_up_a:
cmp a_y,lim_up
jae goon4
jmp near ptr draw
goon4:
push ax
push cx
mov ax,0
mov cx,0
mov ax,col_a
mov cl,16
div cl
mov cl,20
mov ah,0
mul cl
mov temp,ax
mov cl,16
mov ax,row_a
div cl
mov ah,0
add ax,temp
MOV temp,OFFSET MS
add ax,temp
mov temp,20
sub ax,temp
mov si,ax
mov al,1
cmp al,[si]
jz run1
jmp near ptr mov_down_a
run1:
push cx
push a_color
mov cx,0
mov a_color,cx
call recta
mov cx,a_y
sub cx,a_size
mov a_y,cx
pop a_color
pop cx
mov ax,0
mov ax,16
sub col_a,ax
jmp near ptr finish
;****************************************************************down
mov_down_a:
cmp a_y,lim_down
jbe goon5
jmp near ptr draw
goon5:
push ax
push cx
mov ax,0
mov cx,0
mov ax,col_a
mov cl,16
div cl
mov cl,20
mov ah,0
mul cl
mov temp,ax
mov cl,16
mov ax,row_a
div cl
mov ah,0
add ax,temp
MOV temp,OFFSET MS
add ax,temp
mov temp,20
add ax,temp
mov si,ax
mov al,1
cmp al,[si]
jz run2
jmp near ptr mov_left_a
run2:
push cx
push a_color
mov cx,0
mov a_color,cx
call recta ;在原来的地方重画
mov cx,a_y
add cx,a_size
mov a_y,cx
pop a_color
pop cx
mov ax,0
mov ax,16
add col_a,ax
jmp near ptr finish
;***************************************************************left
mov_left_a:
cmp a_x,lim_left
jae goon6
jmp near ptr draw
goon6:
push ax
push cx
mov ax,0
mov cx,0
mov ax,col_a
mov cl,16
div cl
mov cl,20
mov ah,0
mul cl
mov temp,ax
mov cl,16
mov ax,row_a
div cl
mov ah,0
add ax,temp
MOV temp,OFFSET MS
add ax,temp
dec ax
mov si,ax
mov al,1
cmp al,[si]
jz run3
jmp near ptr mov_right_a
run3:
push cx
push a_color
mov cx,0
mov a_color,cx
call recta
mov cx,a_x
sub cx,a_size
mov a_x,cx
pop a_color
pop cx
mov ax,0
mov ax,16
sub row_a,ax
jmp near ptr finish
;***************************************************************right
mov_right_a:
cmp a_x,lim_right
jbe goon7
jmp near ptr draw
goon7:
push ax
push cx
mov ax,0
mov cx,0
mov ax,col_a
mov cl,16
div cl
mov cl,20
mov ah,0
mul cl
mov temp,ax
mov cl,16
mov ax,row_a
div cl
mov ah,0
add ax,temp
MOV temp,OFFSET MS
add ax,temp
inc ax
mov si,ax
mov al,1
cmp al,[si]
jz run4
jmp near ptr mov_up_a
run4:
pop cx
pop ax
push cx
push a_color
mov cx,0
mov a_color,cx
call recta
mov cx,a_x
add cx,a_size
mov a_x,cx
pop a_color
pop cx
mov ax,0
mov ax,16
add row_a,ax
jmp near ptr finish
finish:
ret
judgea endp
;********************************************************************************************
;**********************************控制追击者b状态***********************************************************
judgeb proc near
mov ax,my_y
cmp b_y,ax
jbe goon8
jmp near ptr mov_up_b
goon8:
cmp b_y,ax
jae goon9
jmp near ptr mov_down_b
goon9:
mov ax,my_x
cmp b_x,ax
jae goon10
jmp near ptr mov_right_b
goon10:
cmp b_x,ax
jbe goon11
jmp near ptr mov_left_b
goon11:
jmp near ptr exit
;**********************************************************************up
mov_up_b:
cmp b_y,lim_up
jae goon12
jmp near ptr draw
goon12:
push ax
push cx
mov ax,0
mov cx,0
mov ax,col_b
mov cl,16
div cl
mov cl,20
mov ah,0
mul cl
mov temp,ax
mov cl,16
mov ax,row_b
div cl
mov ah,0
add ax,temp
MOV temp,OFFSET MS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -