![]() |
#2
sherry332008-06-11 09:55
FANGX MACRO FANGXIANG,OPR1,OPR2,COL_NUM,ROW_NUM
MOV NUM,FANGXIANG CALL CLS CALL READ OPR1 COL,COL_NUM OPR2 ROW,ROW_NUM ENDM DATAS SEGMENT str db 'A' row db 24 col db 0 NUM DB 5 DATAS ENDS STACKS SEGMENT db 200 dup (0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS: DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX call cls call DISPLAY LOOP1: STI MOV AH,0BH INT 21H INC AL JNZ MOVE1 FLAG3: MOV AH,0 INT 16H PUSH AX MOV AH,1 INT 16H JZ FLAG2 POP AX JMP FLAG3 EXIT1: JMP EXIT FLAG2: POP AX CMP AL,1BH JZ EXIT CMP AH,4BH JZ K4 CMP AH,50H JZ K2 CMP AH,4DH JZ K6 CMP AH,48H JZ K8 CMP AH,47H JZ K7 CMP AH,49H JZ K9 CMP AH,4FH JZ K1 CMP AH,51H JZ K3 JMP LOOP1 K4: FANGX 5,SUB,ADD,1,0 CALL DISPLAY JMP LOOP1 K2: FANGX 4,ADD,ADD,0,1 CALL DISPLAY JMP LOOP1 K6: FANGX 7,ADD,ADD,1,0 CALL DISPLAY JMP LOOP1 K8: FANGX 3,ADD,SUB,0,1 CALL DISPLAY JMP LOOP1 K7: FANGX 6,SUB,SUB,1,1 CALL DISPLAY JMP LOOP1 K9: FANGX 5,ADD,SUB,1,1 CALL DISPLAY JMP LOOP1 K1: FANGX 1,SUB,ADD,1,1 CALL DISPLAY JMP LOOP1 K3: FANGX 2,ADD,ADD,1,1 CALL DISPLAY JMP LOOP1 MOVE1: CALL SUB_DELAY CALL MOVE JMP LOOP1 EXIT: MOV AX,4C00H INT 21H ;返回DOS DISPLAY proc near ;显示字符'A' MOV BH,0 MOV DH,ROW MOV DL,COL MOV AH,2 INT 10H mov cx,1 mov al,'A' MOV BL,00001011B mov ah,9 int 10h ret DISPLAY endp CLS PROC NEAR ;清屏 MOV CX,0 MOV DH,24 MOV DL,79 MOV BH,0 MOV AX,600H INT 10H RET CLS ENDP MOVE PROC NEAR ;运动 STI NEXT: MOV BL,NUM CMP NUM,5 JZ ROT1 CMP NUM,2 JZ ROT2 CMP NUM,6 JZ ROT3 CMP NUM,1 JZ ROT4 ;CALL SUB_DELAY FANGX BL,ADD,SUB,1,1 CALL DISPLAY JMP NEXT_MOVE ROT1: ;右上 CMP ROW,0 JZ ROT2 ;向右下动 CMP COL,79 JZ ROT3 ;向左上动 ;CALL SUB_DELAY FANGX 5,ADD,SUB,1,1 CALL DISPLAY JMP NEXT_MOVE ROT2: ;右下 CMP COL,79 JZ ROT4 ;向左下动 CMP ROW,24 JZ ROT1 ;向右上动 ;CALL SUB_DELAY FANGX 2,ADD,ADD,1,1 CALL DISPLAY JMP NEXT_MOVE ROT3: ;左上 CMP COL,0 JZ ROT1 ;向右上动 CMP ROW,0 JZ ROT4 ;CALL SUB_DELAY FANGX 6,SUB,SUB,1,1 CALL DISPLAY JMP NEXT_MOVE ROT4: ;左下 CMP ROW,24 JZ ROT3 CMP COL,0 JZ ROT2 ;CALL SUB_DELAY FANGX 1,SUB,ADD,1,1 CALL DISPLAY JMP NEXT_MOVE NEXT_MOVE: RET MOVE ENDP READ PROC NEAR ;读光标位置,DH=行号,DL=列号 MOV AH,3 MOV BH,0 INT 10H MOV ROW,DH MOV COL,DL RET READ ENDP SUB_DELAY PROC NEAR ;延迟一秒 STI PUSH AX PUSH BX PUSH CX PUSH DX PUSHF MOV AH, 2CH INT 21H INC DH ;系统秒数个数加1 MOV BL, DH CMP BL, 3CH ;如果是60 JNE SUB_TIMER XOR BL, BL ;BL置0 SUB_TIMER: MOV AH, 2CH INT 21H ;获取系统时间 CMP BL, DH ;秒数十位置0,只比较个数 JE SUB_RET ;如果到了下一秒,则返回 JMP SUB_TIMER SUB_RET: POPF POP DX POP CX POP BX POP AX RET SUB_DELAY ENDP CODES ENDS END START |
题目21:设计一个程序完成如下功能:
初始状态下假设一个字母A或B从屏幕的左下角斜飞出去(速度为每秒钟移动2个字符的位置)
字母在行进期间碰到屏幕的边沿时反弹。
使用小键盘对运动中的字母进行控制,小键盘上的按键如下定义:
· 4、2、6、8对应左、下、右、上
· 1、3、9、7对应左下、右下、右上、左上
比如:按下9键后字母就向右上方向前进
· 程序在按下'ESC'按键时退出。
要求:
· 当字母往前走时必须将前一个字母显示的消除。
· 在程序中必须记住当前字母所在的座标、运行方向。屏幕的座标是:行:0-79,列0-24,运行方向可用一个变量表示,该变量从0-7分别表示左、左下、下、右下、右、右上、上、左上
· 每次向前移时必须判断下一个座标位置,若碰到边界即X、Y是否为(0、79), (0,24)则进行反弹计算,然后改变运行方向变量值。
· 当控制按键按下后除了改变运行方向变量值外还必须判断是否在边界,需要保证下一个字母位置不能有越界的异常情况发生。