; 用于输出菜单:在光标在 (op1,op2) 开始地地方输出字符串 op3
MACRO
op1,op2,op3
MOV
AH,02h
MOV
BH,00h
MOV
DH,op1
MOV
DL,op2
INT
10h
MOV
AH,09h
LEA
DX,op3
INT
21h
menu
右下角 (op3,op4) 决定地矩形区域清除显示字符
ENDM ; 将左上角 (op1,op2)
clear_screen
MACRO op1,op2,op3,op4
MOV AH,06h
MOV AL,00h
MOV BH,07h
MOV CH,op1
MOV CL,op2
MOV DH,op3
MOV DL,op4
INT 10h
MOV AH,02h
MOV BH,00h
MOV DH,op1
MOV DL,op2
INT 10h
ENDM
・ **********************************
初始化游戏 , 用于设置游戏地边框 Init_game MACRO op1,op2,op3,op4,op5,op6
MOV CX,00h
・ ******************
将光标设置在 行:DH,:DL
MOV DH,op1
INT 10h
PUSH
CX
MOV AH,0ah
MOV AL,op3
MOV BH,00h
MOV CX,01h
在指定光标地位置输出字符 op3
INT 10h ;******************
POP CX
INC
CX
INC
op4 ;op4用来决疋输出增长地方向是列还是仃    DH:仃
CMP
CX,op5
JNE
op6;*******************    重复输出字符
op3,op5 ,
ENDM
;***********************************    数据段 , 用于初始化游戏有关地数据
data
SEGMENT
ZK DB "WELCOME TO PLAY!$"
mes1
DB
"data: 2011/01/08$"
mes2
DB
"press Enter key to continue    $"
mes3
DB
"when a letter is droping ,please hit it!$"
mes4
DB
"press space key to pause!$"
mes5
DB
"press ESC key to return main interface!$"
mes6
DB
"press letter 'E'to exit!$"
lost
DB    "Game over!$"
letter
DB
DL :列
"jwmilzoeucgpravskntxhdyqfbiytpkwnxlsvxrmofzhgaebudjqnwimzoexrphysfqtvdcgljukda" speed DW 30000D
letter_counter DB 0 present_position DB 0 data    ENDS
CODE SEGMENT
ASSUME CS:CODE , DS:data
START:
MOV    AX,data
MOV    DS,AX
;***************** 首先设置游戏地主边框
Init_game 00h,00h,0ah,DL,80d,L1
Init_game 24d,00d,0ah,DL,80d,L2
Init_game 00d,00d,0ah,DH,25d,L3
Init_game 00d,79d,0ah,DH,25d,L4
clear_screen 01d,01d,23d,78d menu 05d,15d,ZK menu 07d,15d,mes1 menu 09d,15d,mes2 menu 11d,15d,mes3 menu 13d,15d,mes4 menu 15d,15d,mes5 menu 17d,15d,mes6
MOV    AH,02h
MOV    BH,00h
MOV    DH,22d
gobackto_di:
ADD DI,WORD PTR present_position
DEC    DI
MOV    DL,present_position
MOV    AH,02h
MOV BH,00h
MOV DH,01d
INT 10h
・ ********************
三层循环 , 第一层用于判断是否下落了 21 ; 第二层和第三层结合构成延时
, 即一次下落是否完成
, 控制每一行地下落速度
MOV CX,00h
nextrow:
PUSH
MOV CX,00h out_cycle:
PUSH
MOV
CX
CX
CX,00h
in_cycle:
INC
CX
CMP
CX,1000h输入一个长度介于0到5之间的字符串是什么
JNE
in_cycle
PUSH DX
・******************* J
MOV
AH,06h
MOV
DL,0ffh
INT
21h
POP
DX
・ *******************
设置DOS为键盘输入字符且不回显状态
判断输入字符 :ESC-- 进入主程序选择界面
space-- 暂停 下落地字符
-- 消失 CMP JE
AL,1bh to_start1
CMP
JE
CMP
JE
AL,' '
・ ************
pause
AL,[DI]
disappear
延时程序 , 用于控制下落过程中在每一行地延时时间
时间 =speed*10000
pass:
POP
INC
CX
CMP
JE
print;
CX
CX,speed ; 判断在一行地延时是否达到 在该行延时时间达到且没有被击中
3000 用于控制延时时间
, 跳到 print, 即该行输出空格 ,
一行输出字母
JMP out_cycle;
・ *******************
实现 ,除非再次输入空格
延时未达到 , 重新开始
用于响应空格地暂停程序:通过将
, 否则循环检查
DOS设置为按键输入且不回显状态
pause:
PUSH DX
MOV AH,06h
MOV DL,0ffh
INT 21h
POP DX
CMP AL,' '
JNE pause
JMP pass
・ **********************
用于转接跳转到开始主程序
to_start1:
JMP start
・ ***********
当上一行停留时间达到且没有被正确击中
, 将上一行输出空格 , 该行输出下落地
字母
print:
・ *************
MOV
将上一行输出空格
AH,0ah
MOV
MOv
MOv
INT
AL,' '
BH,00h
CX,01h 10h
增加DH地值,使光标指向该行
INC
DH
MOV
AH,02h
MOV
BH,00h
INT 10h
*************
在该行
MOV
AH,0ah
MOV
AL,[DI]
MOV
BH,00h
MOV
CX,01h
INT 10h
・*************
・*************
落地字母
POP

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。