; 用于输出菜单:在光标在 (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,op4MOV 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,op6MOV CX,00h
・ ******************
将光标设置在 行:DH,列:DLMOV 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小时内删除。
发表评论