汇编语言动画程序的设计报告

汇编语言动画程序的设计报告

2023年6月28日发(作者:)

?

一、游戏背景介绍随着信息时代的发展,计算机已经变为我们生活中不可缺少的一部分,它作为我们了解世界的一个窗口的同时还可以让我们从中以最快的速度查找学习资源,休闲之余,更多的人选择玩小型的益智游戏来放松,因为它不仅达到了娱乐的目的,而且对自己的思维有一定的帮助作用,根据大多数人的娱乐放松需求,我做出了一款动画游戏——可控的汽车与机器

人。

上了一学期的汇编语言课,让我对汇编语言有了一定的认识。这次课程作业我决定亲自动手用汇编语言编写一个型小程序,熟悉计算机体系结构,加深对汇编语言的了解。DOS操作系统的功能调用及BIOS的功能调用。进一步了解汇编语言控制计算机硬件的方法,以及如何用汇编语言来实现算法, 提高应用汇编语言编程的能力,也加深了自己对一些算法的理解,提高了自己的编程能力。

利用汇编语言编写程序,在屏幕上显示动画,还可以通过键盘上的输入来改变图片的位置,实现动画的运动。动画游戏程序设计的开始屏幕上会出现一辆小车和一个机器人,操作者可自由选择至少两个运动物体(机器人和汽车)在屏幕上运动,一开始汽车与人分别从左向右、从右向左运动,操作者可以通过屏幕上方现实的提示对机器人和小车进行控制。可以通过键盘上的W、A、S、D和上下左右的方向键来分别控制运动机器人和小车通过W,A,S,D控制方向,同时整个程序包括人机界面控制台和运动中动画的暂停(空格键控制),开始(ENTER键控制),退出键则由ESC键控制,运动加减速动作(“+”控制逐级加速、“—”控制逐级减速)。

程序插图如图1:

图1动画界面示意图

屏幕上方是操作提示,用户可与根据提示对汽车和小人进行操控,来改变他俩的运动轨迹。起先车和小人都是各自运动的一个向左另一个向右,操作者可以通过键盘来改变这两物体的运动轨迹,同时在按键盘上的加号会看见物体的运动速率明显加快,减号则反之。

#

二、核心算法思想

本程序定义了两个图分别表示(汽车和机器人),八个坐标变量(汽车清图坐标car_row0

car_col0 汽车画图坐标car_row1 car_col1机器人清图坐标man_row0 man_col0机器人画图坐标man_row1 man_col1),用于控制汽车和机器人清图和画图的坐标。首先在屏幕上显示两个物体,让他们按照从左到右和从右到左方式分别运动。他们的运动是通过不断的修改图片的坐标,并清屏,然后根据新的坐标重新绘制画面来实现的。通过一大个循环对上面个两个坐标进行改变,每次横坐标加上一个固定的值,或减去一个固定的值。再通过清图然后重绘实现物体的移动。为人实现物体能根据操作者的要求上下左右运动,程序实现设定好了几个可以上下左右操控图片位置的键。每当操作者按下这几个键,系统自动的,将图片位置的横纵坐标进行加上或减去某个固定的值,加的多少还取决于操作者按键次数得多少。确定图片的位置是通过检测用户的输入和外层大循环不断自加某个数,综合来改变下次重绘的坐标来实现的。

总之要想物体动起来就是通过不断地清屏来清除上次图片的位置,然后获取图片坐标,这个坐标是不断地被用户和系统修改的,并重回新的图片画面,于是用户可以看见物体在屏幕上不断的移动。以下是让运动起来运动的逻辑图:

开始

清图

(row0,col0)

|

row1加1

判断是否有按键输入

'

row1赋给row0

col1赋给col0

画图(row1,col1)

图2动画运动算法示意图

首先是清理屏幕上的物体将屏幕刷成黑色,然后获得机器人和小车新的位置坐标,根据这根位置坐标绘制出小车的位置。从而实现小车的运动。同时通过操控设定好的上下左右键可以修改坐标,形同会自动根据你按键的次数以及方向键物体的横纵坐标加上或减去一个先前设定好的固定值。从而实现了,操作者对物体运动东方向的控制。

三、核心算法流程图

主程序:

程序开始,设置显示方式为80X25 16色图形方式和提示信息如下:

(SPACE--PAUSE,ENTER--BEGAIN,ESC--EXIT,SPEEDUP-+,SLOWDOWN- -)

(CAR:UP--W,DOWN--S,LEFT--A,RIGHT--D MAN:UP--8,DOWN--2,LEFT--4,RIGHT--6)

调用car_disp和man_disp子程序设置开始图形,起始坐标在数据定义时已给出,然后调用绘图子程序控制汽车和机器人的运动,空格暂停,回车开始,ESC退出,实现动画的主程序算法图如图3。

开始

屏幕上显示提示信息

图片初始化

启用绘图程序

判断输入是否为ESC

暂停

,是

~

判断是否是空格

判断是否是ENTER

图3主程序算法示意图

程序运行后除了绘制移动的人和车外,还要看是否有暂停,开始,和退出的操作。根据输入对程序运行进行调整。

MOVE子程序:

MOVE子程序是整个程序的核心,通过键盘操作控制汽车和机器人的运动,首先检测键盘,若无键盘操作,运行主程序。控制物体移动算法图如图4:

$

N

主程序

结束

开始

&

键盘检测合物体移动

Y

Y

W

汽车向上移动一个单位

·

Y

A

汽车向左移动一个单位

N

Y

S

#

N

Y

D 汽车向右移动一个单位

N

Y

8

机器人上移动一个单位

N

:

2

机器人左移动一个单位

N

Y

4

机器人下移动一个单位

N

Y

6

机器人右移动一个单位

N

Y

加速

N

Y

-

减速

图4操控物体算法示意图 加号和减号分别控制加速和减速,原本主程序会每隔一段时间自动把汽车横坐标加一,人的横坐标减一重复操作,若有键盘响应,则实现自动运动,则通过比较键盘扫描码来确定执行何种操作, “+”按一次速度加快一级,“—”按一次速度减慢一级,WASD控制汽车的上左下右移动,方向键和8、6、2、4都能控制机器人的运动方向,

DISP绘图程序:

DISP输出图形子程序该程序的主要功能是根据定义的图形表画出图形,过程如下:

开始

si指向图形表的第一个字符

初始化cx

字符行列坐标存入dh,dl

显示当前si指向的)

N

cx=0

Y

主程序

结束

·

图5根据自定义图形绘图算法示意图

首先获得存放自定义图形字符串数组,进行初始化,再根据坐标获得物体的酒气体坐标然后绘制物体。

汽车和机器人画图子程序:

当汽车和小人运动到边界时就会消失,于是我另外写了两个子程序让运动到边界的物体自此回到界面,这里我让从左边出去的物体从右边出现,从右边出去的的物体从左边出现,这样就像地球是圆的一样,当让当你控制物体从上方或者下方出去时,也会出现在相反反向。

car_disp,man_disp子程序分别用于用于处理汽车和小人运动到屏幕边界的情况,显示图形以及设置坐标。以汽车为例:si指向汽车图形表的第一个字符,当行数(car_row1)大于20,跳到第4行,行数(car_row1)小于4,跳到第20行列数(car_col1)小于3,跳到第70列,列数car_col1)大于70,跳到第3列,实现边界设置,再将row1赋给row0,col1赋给col0,即把现在的坐标保留,作为下次清屏的坐标,然后把car_row1赋给dh,car_col1赋给dl,然后在调用DISP画出汽车图形,这样汽车就会从另一个方向冒出来。总之,这里也是通过修改物体的左边来实现这样的效果的。

清图子程序:

这部分程序主要负责清理上一次绘图留下来的画面为下一步的重绘做准备,实现物体的移动效果,否则会出现物体在上次基础上重绘,变成物体推着尾巴。影响动画效果。

这部分的代码样式为:

car_clear proc near ;汽车清图子程序

clear_car car_row0,car_col0 ;调用汽车清图宏

ret ;返回

car_clear endp

该程序的主要功能就是调用宏来清图。因为子程序不能传递参数,所以选择用宏定义来实现参数(坐标)的传递,但是宏展开使得代码很长,而且该子程序调用频繁,以致超过条件转移的范围,系统报错,用子程序就可以解决。

延时子程序DLY:

主要功能使控制延时,通过这个子程序就那个能够控制物体运动的速度。延时的时间越长,物体运动的速度就越慢,相反延时时间越短,就相当于物体运动的频率加快这样物体运动就加快了。我采用的是控制延时时间的的长短,从而实现加速和减速。通过宏定义来实现参数(dlay1)的传递,用“+”“—”来改变dlay1的值,控制延时,因为我给时间设定了几个值于是当用户按加号是就不断自加加到最大之时再自加就变成最小值,减号则反之,所以会看到很快的物体瞬间变慢。

四、源代码

整个程序实现的源代码如下:

~

data segment

DB 0DBH,1,0,0

DB 0DBH,1,0,1

DB 0DBH,7,0,1

DB 0DBH,7,0,1

DB 4FH,6,1,0

DB 4FH,6,0,-3

DB 2,6,-2,1

;定义数据段

CAR0 DB 7 ;汽车的字符图形表

— ;-----------------------------------------------------------------------------

MANU DB 11 ;机器人的图形表

DB 0DBH,09H,0,0

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 02H,09H,-1,-2

DB 03H,0CH,2,0

DB 0DBH,09H,1,-1

DB 0DBH,09H,0,2

DB 0DBH,09H,1,-3

DB 0DBH,09H,0,4

;------------------------------画图与清图坐标----------------------------

car_row0 db 10 ;汽车清图坐标

(

car_col0 db 10

car_row1 db 10 ;汽车画图坐标

car_col1 db 10

man_row0 db 15 ;机器人清图坐标

man_col0 db 60

man_row1 db 15 ;机器人画图坐标

man_col1 db 60

;延时时间间隔

dlay1 dw 10000 ;控制延时变量,即控制速度的变量

~;-----------------------------输出提示--------------------------------------

INFO1 DB 0DH,0AH,'

(SPACE--PAUSE,ENTER--BEGAIN,ESC--EXIT,SPEEDUP-- +,SLOWDOWN-- - )$'

;动画控制提示信息,空格暂停,回车开始,ESC退出,

; “+”按一次速度加快一级,“—”按一次速度减慢一级

'

INFO2 DB 0DH,0AH,'

(CAR:UP--W,DOWN--S,LEFT--A,RIGHT--D MAN:UP--8,DOWN--2,LEFT--4,RIGHT--6)$'

;动画控制提示信息,WASD控制汽车的上左下右移动,方向键控制机器人的运动方向

;---------------------------汽车宏定义--------------------------------

clear_car macro row,col ;宏定义汽车清图

push bx

mov ax,0600H

mov ch,row

~

dec ch,1

mov cl,col

mov dh,ch

mov dl,cl

add dh,3

add dl,4

mov bh,7

int 10h

*

;坐标加3

;坐标加4

pop bx

endm

;---------------------------- 宏定义机器人-----------------------------

clear_man macro row,col ;宏定义机器人清图

push bx

mov ax,0600H

dec ch,1

mov ch,row

mov cl,col

dec cl,0

mov dh,ch

mov dl,cl

add dh,5

add dl,5

;坐标加5

;坐标加5

mov bh,7

int 10H

~

pop bx

endm

;----------------------------------------------------------------------------

;主要功能使控制延时,我采用的是控制空制令执行的条数来

;控制延时的长短,从而实现加速和减速。通过宏定义来实现

;参数(dlay1)的传递,用“+”“—”来改变dlay1的值,控制延时。

;------------------------------ 延时程序-------------------------------

d macro dlay1 ;宏定义延时程序

push cx

push dx

mov dx,dlay1

dl1:

mov cx,6801

dl2:

loop dl2

dec dx

jnz dl1

pop dx

pop cx

endm

;----------------------------------------------------------------------------

code segment ;定义代码段

main proc far

assume cs:code,ds:data

: ;主函数

start:

push ds

mov ax,0

push ax

mov ax,data

mov ds,ax

mov al,3 ;设置显示方式为80*25 16色图形方式

mov ah,0

int 10H

lea dx,info1 ;在显示器上显示字符串提示信息

mov ah,9

int 21h

lea dx,info2 ;在显示器上显示字符串提示信息

mov ah,9

int 21h

@call car_disp ;初始汽车的位置

call man_disp ;初始机器人的位置

call MOVE

ret

main endp

;----------------------------------------------------------------------------

disp proc near ;输出图形子程序

push ax

push bx

push cx

push dx

push si

sub ch,ch

mov cl,[si]

inc si

next: add dh,[si+2] ;改变行列坐标

add dl,[si+3]

mov ah,2 ;置光标位置DH为行、DL为列

int 10h

mov al,[si] ;取字符值

mov bl,[si+1] ;取字符属性

push cx

mov cx,1

mov AH,9 ;显示字符

int 10H

"

pop cx

add si,4 ;SI指向下一个字符

loop next

pop si

pop dx

pop cx

pop bx

pop ax

-

ret

disp endp

;----------------------------------------------------------------------------

car_disp proc

push si

lea si,CAR0 ;取汽车的图

cmp car_row1,20 ;设置汽车运动的边界

ja c0 ;行数大于20,跳到第4行

~near ;汽车画图子程序

cmp car_row1,4 ;行数小于4,跳到第20行

jb c1

cmp car_col1,3 ;列数小于3,跳到第70列

jb c2

cmp car_col1,70 ;列数大于70,跳到第3列

ja c3

jmp cn

c0:

/

mov car_row1,4

jmp cn

c1:

mov car_row1,20

jmp cn

c2:

mov car_col1,70

jmp cn

`

c3:

mov car_col0,3

mov car_col1,3

jmp cn

cn:

mov bh,0

;row1赋给row0,col1赋给col0,即把现在的坐标保留,作为下次清屏的坐标

"

mov bl,car_row1

mov car_row0,bl

mov bl,car_col1

mov car_col0,bl

mov dh,car_row1

mov dl,car_col1

call disp ;调用DISP画出汽车图形

ret

%

pop si

car_disp endp

;----------------------------------------------------------------------------

car_clear proc near ;汽车清图子程序

clear_car car_row0,car_col0 ;调用汽车清图宏

ret ;返回

car_clear endp

;----------------------------------------------------------------------------

man_disp proc

`near ;机器人画图子程序

push si

lea si,MANU ;取机器人的图

cmp man_row1,20 ;设置机器人运动的边界

ja n0 ;行数大于20,跳到第4行

cmp man_row1,4 ;行数小于4,跳到第20行

jb n1

cmp man_col1,3

jb n2

} ;列数小于3,跳到第70列

cmp man_col1,70 ;列数大于70,跳到第3列

ja n3

jmp nn

n0:

mov man_row1,4

jmp nn

n1:

mov man_row1,20

~

jmp nn

n2:

mov man_col1,70

jmp nn

n3:

mov man_col0,3

mov man_col1,3

jmp nn

nn:

push bx

mov bh,0

mov bl,man_row1

mov man_row0,bl

mov bl,man_col1

mov man_col0,bl

;row1赋给row0,col1赋给col0,即把现在的坐标保留,作为下次清屏的坐标

pop bx

mov dh,man_row1

mov dl,man_col1

call disp ;调用DISP画出机器人图形

pop si

ret

man_disp endp

;----------------------------------------------------------------------------

*

proc near ;机器人清图子程序

man_clear

clear_man man_row0,man_col0 ;调用机器人清图宏

ret ;返回

man_clear

move

endp

;----------------------------------------------------------------------------

proc near ;控制汽车和机器人的运动

push ax

push bx

{

;----------------------------- 取键盘操作-------------------------------

next1:

mov ah,01H ;取键盘缓冲区状态

int 16h

jnz next2 ;缓冲区无按键,等待

DLY dlay1

call car_clear

inc car_col1

* ;汽车一直向右运动

call car_disp

call man_clear

dec man_col1

call man_disp

jmp next1

next2:

mov ah,0 ;从键盘读字符

int 16h

— ;机器人一直向左运动

;----------------------------------------------------------------------------

DISP proc near ;输出图形子程序

push ax

push bx

push cx

push dx

push si

sub ch,ch

mov cl,[si]

inc si

next: add dh,[si+2] ;改变行列坐标

add dl,[si+3]

mov ah,2 ;置光标位置DH为行、DL为列

int 10h

mov al,[si] ;取字符值

mov bl,[si+1] ;取字符属性

@

push cx

mov cx,1

mov AH,9 ;显示字符

int 10H

pop cx

add si,4 ;SI指向下一个字符

loop next

pop si

*

pop dx

pop cx

pop bx

pop ax

ret

disp endp

;--------------------根据键盘输入判断选择--------------------------

up: ;W 汽车向上运动

~

cmp ah,11h

jnz down

call car_clear

dec car_row1

call car_disp

jmp next1

down: ;S 汽车向下运动

cmp ah,1Fh

|

jnz left

call car_clear

inc car_row1

call car_disp

jmp next1

left: ;A

cmp ah,1Eh

jnz right

call car_clear

dec car_col1

call car_disp

jmp next1

right: ;D

cmp ah,20h

jnz up1

call car_clear

inc car_col1

call car_disp

jmp next1

up1: ;cmp ah,48h

jnz down1

call man_clear

dec man_row1

|

call man_disp

jmp next1

down1: ;cmp ah,50h

jnz left1

call man_clear

inc man_row1

call man_disp

|

汽车向左运动

汽车向右运动

机器人向上运动

机器人向下运动

jmp next1

left1: ;机器人向左运动

cmp ah,4bh

jnz right1

call man_clear

dec man_col1

call man_disp

jmp next1

right1: ;机器人向右运动

cmp ah,4dh

jnz speedup1

call man_clear

inc man_col1

call man_disp

jmp next1

speedup1:

` ;主键盘加号

cmp ah,0dh ;"+"加速运动

)jnz speedup2

sub dlay1,1000

jmp next1

; ;小键盘加号

cmp ah,4Eh ;"+"(小键盘)加速运动

jnz speeddown1

sub dlay1,1000

jmp next1

;主键盘减号

cmp ah,0ch ;"-"减速运动

jnz speeddown2

speedup2:

speeddown1:

add dlay1,1000

jmp next1

speeddown2:

;小键盘减号

cmp ah,4Ah ;"-"减速运动

(jnz space1

add dlay1,1000

jmp next1

space1:

cmp ah,39h ;SPACE暂停运动

jnz exit1

space:

mov ah,0 ;从键盘读字符,AL=字符码,AH=扫描码

int 16h

cmp ah,1ch ;回车返回next1,否则继续等待从键盘读字符,实现暂停

jnz space

jmp next1

exit1:

cmp ah,01h ;ESC退出

jnz others

pop bx

:

pop ax

ret ;返回主程序

others: ;按其他键,无效,继续运行

jmp next1

MOVE ENDP

;---------------------------------------------------------------------------

code ends

end start

五、心得体会

选题的时候我以为动画程序的实现应该使非常容易实现的,就是不停的清屏,重新在下一个位置画图,从而实现动画。但通过本次汇编作业,我才真正懂得了动画的实现其实没有我想象的那么简单。刚开始我做了一个图形,继而由一个图形做成两个,在这个过程中我碰到了很多难题,比如如何画图,如何实现图形的运动,如何在一个屏幕上显示两个图形,如何分别控制两个图形的运动,为了解决这些问题我试了很多方法,最后我选择了坐标控制运动,局部清屏,我觉得这是我能想到的最好的方法了,虽然做的过程很累,整天都在想问题的解决方法,但当你解决一个问题之后,那种感觉真的很享受,当整个程序完成的时候我很兴奋。当然这个程序还有一些不足的地方,比如说当俩物体运动到一起时没有碰撞效果,还有就是程序的界面不够友好。通过这次作业,也让我熟悉了很多以前都不熟悉的一些指令,并利用这些指令去实现一些操作。同时也让我更加了解了汇编程序的结构和流程,对编程也有了更深的体会。过程中我还学会了一些处理问题的方法:理论与实践相结合,不懂的地方应勤问老师勤问同学,直到把它搞懂为止。

源代码:(修正后)

data segment ;定义数据段

CAR0 DB 7 ;汽车的字符图形表

<

DB 0DBH,1,0,0

DB 0DBH,1,0,1

DB 0DBH,7,0,1

DB 0DBH,7,0,1

DB 4FH,6,1,0

DB 4FH,6,0,-3

DB 2,6,-2,1

~

MANU DB 11 ;机器人的图形表

DB 0DBH,09H,0,0

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 0DBH,09H,0,1

DB 02H,09H,-1,-2

DB 03H,0CH,2,0

DB 0DBH,09H,1,-1

DB 0DBH,09H,0,2

DB 0DBH,09H,1,-3

DB 0DBH,09H,0,4

car_row0 db 10 ;汽车清图坐标

car_col0 db 10

car_row1 db 10 ;汽车画图坐标

car_col1 db 10

:

man_row0 db 15 ;机器人清图坐标

man_col0 db 60

man_row1 db 15 ;机器人画图坐标

man_col1 db 60

dlay1 dw 10000 ;控制延时变量,即控制速度的变量

INFO1 DB 0DH,0AH,' (SPACE--PAUSE,ENTER--BEGAIN,ESC--EXIT,SPEEDUP-- +,SLOWDOWN--

- )$' ;动画控制提示信息,空格暂停,回车开始,ESC退出,“+”按一次速度加快一级,“—”按一次速度减慢一级

INFO2 DB 0DH,0AH,' (CAR:UP--W,DOWN--S,LEFT--A,RIGHT--D

MAN:UP--8,DOWN--2,LEFT--4,RIGHT--6)$' ;动画控制提示信息,WASD控制汽车的上左下右移动,方向键控制机器人的运动方向

;----------------------------------------------------------------------------

{

clear_car macro row,col ;宏定义汽车清图

push bx

MOV AX,0600H

MOV Ch,row

dec ch,1

mov cl,col

mov dh,ch

mov dl,cl

add dh,3

add dl,4

MOV BH,7

INT 10H

pop bx

endm

;----------------------------------------------------------------------------

clear_man macro row,col ;宏定义机器人清图

$

push bx

MOV AX,0600H

MOV Ch,row

dec ch,1

mov cl,col

dec cl,0

mov dh,ch

mov dl,cl

#

add dh,5

add dl,5

MOV BH,7

INT 10H

pop bx

endm

;----------------------------------------------------------------------------

DLY macro dlay1 ;宏定义延时程序

PUSH CX

PUSH DX

MOV DX,dlay1

DL1: MOV CX,6801

DL2:

LOOP DL2

DEC DX

JNZ DL1

POP DX

POP CX

endm

;----------------------------------------------------------------------------

code segment ;定义代码段

main proc far ;主函数

assume cs:code,ds:data

?

start:

push ds

mov ax,0

push ax

mov ax,data

mov ds,ax

$

mov al,3 ;设置显示方式为80*25 16色图形方式

mov ah,0

int 10H

lea dx,info1 ;在显示器上显示字符串提示信息

mov ah,9

int 21h

lea dx,info2 ;在显示器上显示字符串提示信息

>

mov ah,9

int 21h

call car_disp ;初始汽车的位置

call man_disp ;初始机器人的位置

call MOVE

)

ret

main endp

;----------------------------------------------------------------------------

DISP PROC NEAR ;输出图形子程序

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

SUB CH,CH

MOV CL,[SI]

INC SI

NEXT: ADD DH,[SI+2] ;改变行列坐标

ADD DL,[SI+3]

*

MOV AH,2 ;置光标位置DH为行、DL为列

INT 10H

MOV AL,[SI] ;取字符值

MOV BL,[SI+1] ;取字符属性

PUSH CX

MOV CX,1

MOV AH,9 ;显示字符

INT 10H

POP CX

ADD SI,4 ;SI指向下一个字符

LOOP NEXT

POP SI

POP DX

POP CX

POP BX

POP AX

RET

DISP ENDP

;----------------------------------------------------------------------------

car_disp proc near ;汽车画图子程序

push si

lea si,CAR0 ;取汽车的图

cmp car_row1,20 ;设置汽车运动的边界

ja c0 ;行数大于20,跳到第4行

cmp car_row1,4 ;行数小于4,跳到第20行

jb c1

cmp car_col1,3 ;列数小于3,跳到第70列

jb c2

cmp car_col1,70 ;列数大于70,跳到第3列

ja c3

jmp cn

c0:

>

mov car_row1,4

jmp cn

c1:

mov car_row1,20

jmp cn

c2:

mov car_col1,70

jmp cn

|

c3:

mov car_col0,3

mov car_col1,3

jmp cn

cn:

mov bh,0 ;row1赋给row0,col1赋给col0,即把现在的坐标保留,作为下次清屏的坐标

mov bl,car_row1

mov car_row0,bl

:

mov bl,car_col1

mov car_col0,bl

mov dh,car_row1

mov dl,car_col1

CALL DISP ;调用DISP画出汽车图形

pop si

ret

car_disp endp

&

;----------------------------------------------------------------------------

car_clear proc near ;汽车清图子程序

clear_car car_row0,car_col0 ;调用汽车清图宏

ret ;返回

car_clear endp

;----------------------------------------------------------------------------

man_disp proc near ;机器人画图子程序

push si

"

lea si,MANU ;取机器人的图

cmp man_row1,20 ;设置机器人运动的边界

ja n0 ;行数大于20,跳到第4行

cmp man_row1,4 ;行数小于4,跳到第20行

jb n1

cmp man_col1,3 ;列数小于3,跳到第70列

jb n2

cmp man_col1,70 ;列数大于70,跳到第3列

~

ja n3

jmp nn

n0:

mov man_row1,4

jmp nn

n1:

mov man_row1,20

~

jmp nn

n2:

mov man_col1,70

jmp nn

n3:

mov man_col0,3

mov man_col1,3

jmp nn

nn:

push bx ;row1赋给row0,col1赋给col0,即把现在的坐标保留,作为下次清屏的坐标

mov bh,0

mov bl,man_row1

mov man_row0,bl

mov bl,man_col1

mov man_col0,bl

pop bx

mov dh,man_row1

mov dl,man_col1

CALL DISP ;调用DISP画出机器人图形

pop si

ret

man_disp endp

;----------------------------------------------------------------------------

man_clear proc near ;机器人清图子程序

clear_man man_row0,man_col0 ;调用机器人清图宏

ret ;返回

man_clear endp

;----------------------------------------------------------------------------

MOVE proc near ;控制汽车和机器人的运动

push ax

push bx

next1:

mov ah,01H ;取键盘缓冲区状态

int 16h

jnz next2 ;缓冲区无按键,等待

DLY dlay1

call car_clear ;汽车一直向右运动

inc car_col1

call car_disp

call man_clear ;机器人一直向左运动

dec man_col1

call man_disp

jmp next1

next2:

mov ah,0 ;从键盘读字符

int 16h

;判断选择------------------------------

up: ;W 汽车向上运动

cmp ah,11h

jnz down

call car_clear

dec car_row1

call car_disp

jmp next1

down: ;S 汽车向下运动

cmp ah,1Fh

jnz left

call car_clear

inc car_row1

call car_disp

jmp next1

left: ;A 汽车向左运动

cmp ah,1Eh

jnz right

call car_clear

dec car_col1

call car_disp

jmp next1

right: ;D 汽车向右运动

cmp ah,20h

jnz up1

call car_clear

inc car_col1

call car_disp

jmp next1

up1: ;机器人向上运动

cmp ah,48h

jnz down1

call man_clear

dec man_row1

call man_disp

jmp next1

down1: ;机器人向下运动

cmp ah,50h

jnz left1

call man_clear

inc man_row1

call man_disp

jmp next1

left1: ; cmp ah,4bh

jnz right1

call man_clear

dec man_col1

call man_disp

jmp next1

right1: ; cmp ah,4dh

jnz speedup1

call man_clear

inc man_col1

call man_disp

jmp next1

speedup1:

cmp ah,0dh ;"+" jnz speedup2

sub dlay1,1000

jmp next1

speedup2:

cmp ah,4Eh ;"+" jnz speeddown1

sub dlay1,1000

jmp next1

speeddown1:

cmp ah,0ch ;"-" jnz speeddown2

add dlay1,1000

jmp next1

speeddown2:

cmp ah,4Ah ;"-"

机器人向左运动

机器人向右运动

加速运动

(小键盘)加速运动减速运动

(小键盘)减速运动

jnz space1

add dlay1,1000

jmp next1

space1:

cmp ah,39h ;SPACE暂停运动

jnz exit1

space:

mov ah,0 ;从键盘读字符,AL=字符码,AH=扫描码

int 16h

cmp ah,1ch ;回车返回next1,否则继续等待从键盘读字符,实现暂停

jnz space

jmp next1

exit1:

cmp ah,01h ;ESC退出

jnz others

pop bx

pop ax

ret ;返回主程序

others: ;按其他键,无效,继续运行

jmp next1

MOVE ENDP

;---------------------------------------------------------------------------code ends

end start

发布者:admin,转转请注明出处:http://www.yc00.com/news/1687897300a54911.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信