汇编暑假作业要求做一个大项目,题目可以自拟。我思来想去,还是觉得做一个小游戏比较有意思。最后选择了做打飞机游戏。
这里采用的是VGA模式320x200 4色。
打飞机游戏的游戏逻辑比较简单。首先,飞机可以移动,也可以发射炮弹;其次,会有敌人不断地从前方飞过来,如果撞上飞机游戏结束;最后,飞机发射的炮弹可以击落敌人。
既然是打飞机,我们就必须首先造一台飞机,代码如下:
Comment/***********
function: draw a horizontal line
parameters: horizontal position
vertical position
length of the line
color
return: void
description:draw some points horizontally.
color '0001h' represents drawing a line while
color '0000h' which is black means erase the line.
**********/
drawALine PROC NEAR
PUSH BP
MOV BP, SP
PUSH AX
PUSH CX
PUSH DX
PUSH SI
MOV AH, 0Ch
MOV CX, [BP+4]
MOV DX, [BP+6]
MOV SI, [BP+8]
MOV AL, Byte Ptr [BP+10]
drawALineLoop:
INT 10h
INC CX
DEC SI
JNZ drawALineLoop
POP SI
POP DX
POP CX
POP AX
MOV SP, BP
POP BP
RET
drawALine ENDP
Comment/***********
function: draw a plane or a missile
parameters: horizontal position
vertical position
color
type (plane or missile or enemy)
map length
return: void
description:call "drawALine" function repeatedly.
**********/
drawCraft PROC NEAR
PUSH BP
MOV BP, SP
SUB SP, 8
PUSH AX
PUSH DX
PUSH SI
PUSH DI
MOV DI, 0
MOV AX, [BP+12]
MOV [BP-8],AX
MOV SI, [BP+10]
MOV AX, [BP+8]
MOV [BP-6], AX
MOV AX, [BP+6]
MOV [BP-4], AX
MOV AX, [BP+4]
MOV [BP-2], AX
drawCraftLoop:
PUSH Word Ptr [BP-6]
MOV DX, Word Ptr [SI]
PUSH DX
PUSH Word Ptr [BP-4]
MOV AX, [BP-2]
SHR DX, 1
SUB AX, DX
PUSH AX
CALL drawALine
ADD SP, 8
ADD Word Ptr [BP-4], 1
ADD SI, 2
INC DI
CMP DI, [BP-8]
JB drawCraftLoop
POP DI
POP SI
POP DX
POP AX
MOV SP, BP
POP BP
RET
drawCraft ENDP
P
LANEMAP DW 1,1,3,3,3,3,3,3,7,14,16,14,6,2,2,6,6 N1 EQU ($-PLANEMAP)/2
这里之所以做的这么复杂是出于代码重用的考虑,相同的代码只要输入不同的参数,就能制造出不一样的东西。这是抽象的思想。
drawCraft 根据输入的不同的数组,可以绘制出不同的东西,比如飞机,导弹,敌人。而不必画飞机一个函数,画导弹又是另一个函数了。
drawCraft主要是一条线一条线