沈阳大学科技工程学院
机电学院计算机2班尚炎焱
课程设计说明书
设计题目:动态图形设计
一、课程设计目的
进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。
二、课程设计要求
1.要求编写并调试通过一个小型软件,实现对软件或硬件的操作。
2.遵循模块化、结构化的程序设计方法。
3.要求程序必须正确。
4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。
5.要求程序结构合理,语句使用得当。
6.适当追求编程技巧和程序运行效率。
三、课程设计题目:
小车动态图形设计
四、课题分析
该题目看似复杂,其实不然。
具体方式可以按以下步聚进行:
1、确定下车由哪些字符组成
2、在屏幕上显示一个小车,然后再擦除
3、改变一个列坐标,重复步聚2
4、写一个循环子程序,让小车从屏幕的左侧行驶到屏幕的右侧
5、用LOOP指令,改变行坐标,让小车从屏幕的上一端跳到屏幕的下一端,重复执行,显示一屏
6、然后再用LOOP指令,不断重复这一屏
五、流程图:
NO
YES :
NO YES
开始
有无按健 ENTER KEY?
ROW 递增几
行 小车从左边行驶到右边
是否行驶到右下角 终止
ROW,COLUMN 初始化
六、程序源代码
DISPLAY MACRO ROW_OFFSET,COLUMN_OFFSET,CHAR,ATTR MOV BH,0
ADD DH,ROW_OFFSET I;显示一个字符和属性
ADD DL,COLUMN_OFFSET
MOV AH,2H
INT 10H
MOV AL,CHAR
MOV BL,ATTRI
MOV CX,1
MOV AH,9H
INT 10H
ENDM
SETMODE MACRO MODE1 ;设置显示方式
MOV AH,0
MOV AL,MODE1
INT 10H
ENDM
DATA SEGMENT
STRING DB'Please press ENTER key to show my work',0DH,0AH DB'You can press any other keys to end , enter key or any ohter keys?$' CHAR_CNT LABEL WORD
DB 0,0,0DBH,7,0,1,0DBH,3
DB 0,1,0DBH,7,1,-2,4FH,2
DB 0,2,4FH,2,-2,0,2,12
ROW DB?
COLUMN DB?
MODE DB 1
ROAD_COLOR DB?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA ;主程序MOV DS,AX
SETMODE 0DH
LEA DX,STRING
MOV AH,9H
INT 21H
MOV AH,1H
INT 21H
CMP AL,0DH
JNE ESCAPE
SETMODE 0DH
MOV ROW,2
MOV COLUMN,0
MOV ROAD_COLOR,2
MOV CX,5
INWARD:
PUSH CX
CALL ROAD
CALL MOVE_SHAPE
ADD ROW,5
INC ROAD_COLOR
SETMODE 0DH ;重新设置相同的显示方式,相当于清屏POP CX
LOOP INWARD
MOV CX,2
LOOP OUTWARD
ESCAPE:
SETMODE 2
MOV AX,4C00H
INT 21H
DELAY PROC NEAR ;延时子程序
MOV DX,500H
DL1:
MOV CX,0
LOOP $
DEC DX
JNZ DL1
RET
DELAY ENDP
DRAW PROC NEAR ;显示或擦除小车MOV DH,ROW
MOV DL,COLUMN
MOV CX,CHAR_CNT
LEA DI,CAR+2
ONE:
CMP MODE,0
PUSH CX
JNE SKIP
DISPLAY [DI+0],[DI+1],[DI+2],0
JMP ABC
SKIP:
DISPLAY [DI+0],[DI+1],[DI+2],[DI+3]
ABC:
POP CX
ADD DI,4
LOOP ONE
RET
DRAW ENDP
MOVE_SHAPE PROC NEAR ;小车动态图形PLOT:
MOV MODE,1
CALL DRAW
MOV AH,1H
INT 16H
JNE ESCAPE ;检查缓冲区有无按键CALL DELAY
CMP COLUMN,36
JA EXIT
MOV MODE,0
CALL DRAW
INC COLUMN
JMP PLOT
EXIT:
MOV COLUMN,0
RET
MOVE_SHAPE ENDP
ROAD PROC NEAR ;画公路MOV CX,39
MOV DH,ROW
ADD DH,2
MOV DL,0
PUSH CX
DISPLAY 0,0,0DBH,ROAD_COLOR
POP CX
CYCLE:
PUSH CX
DISPLAY 0,1,0DBH,ROAD_COLOR
POP CX
LOOP CYCLE
RET
ROAD ENDP
CODE ENDS
END START
七、结果显示
图(1)
图(2)
八、感想、收获及体会
在临近期末,正值我们带着喜悦回家的时候,我们搞了一个课程设计。
以前还以为这个课程设计很神秘,对它充满着期待。
搞完这个之后,才知道这个东西也没什么,跟平时的大作业差不多,看来课程设计还有待改革。
刚开始选题的时候,我看到这个题目很有意思,因为以前没有用汇编语言做过关于动画这方面的程序,所以就选了这个题目。
说实话,刚开始下手的时候,我还真是一头雾水,不知道该怎么做,老师上课的时候也没有讲过。
于是,我就到图书馆借了一两本关于这方面的书,看完动画设计那块的时候,我才明白了该怎么做。
动画无非分两种动画,一种是逐帧动画,另一种是实时动画,当然,这里是逐帧动画。
逐帧动画设计起来相对来说比较简单,就是一组图像按一定的频度连续播放,给人一种视觉上的效应,好像这个东西真的动起来了!其实,做这个题之前,我也从网上下了一些别人以前做过的关于这方面的程序,我发现他们的程序代码比较多,可读性比较差,代码冗长,于是,我决定自己做一个代码较少,可读性较好的程序。
我写的这个程序按大的方针来说,主要用了三个循环实现了动画整个功能:一、让小车从屏幕的左侧跑到右侧,二、让下车不断从屏幕的上端跳到下端,三、不断重复这一屏。
我这个程序还有一个小技巧,清屏的时候不是像别人那样写一很长串的代码,而是通过重新设置显示方式来清屏,这样比较简单,从而减少了代码。
搞完这次课程设计,我更加明白数学和逻辑推理对程序设计的重要性,找到简单、合适及高效的算法可以大大节约程序运行的时间和空间,优化了程序,提高了程序运行的效率,这对于一个优秀的程序设计员来说非常重要。
不过,我没有想过搞IT行业,因为,我发现在电脑旁边坐久了,会感到很虚脱,尤其对程序员来说,叫我数钱还行。
老师,说实话,你让我们搞课程设计其实是给了我们一个疯狂玩耍的机会。
也许大学的意义不在于整体,而在于个人,看自己怎么学,不可能像中学那样让
老师跟在你屁股后面,毕竟,我们是成年人了!。