out_code macro op1,op2 ;输出’*‘
push cx
xor bx,bx
mov cl,op1
op2:
mov ah, 02h
mov dl,'*'
int 21h
inc bl
cmp bl,cl
jb op2
mov dx,offset CR
mov ah,09h
int 21h
pop cx
endm
clear_screen macro op1,op2,op3,op4 ;清屏宏定义
push cx
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,00h
mov dl,00h
int 10h
pop cx
endm
DATAS SEGMENT
num dw ?
string db ' you just have seven times!$'
string1 db 'please enter your numble:$'
string2 db 'play the game again?(Y/N)$'
string3 db 'You have times of $'
string4 db 'You are right!$'
string5 db 'Sorry,fault!$'
CR db 0AH,0DH,'$'
DATAS ENDS
STACKS SEGMENT stack
db 256 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
began:
clear_screen 00d,00d,25d,80d
mov dx,offset string ;输出string
mov ah,09h
int 21h
mov dx,offset CR
mov ah,09h
int 21h
call RAND
mov num,bx
xor cx,cx
xor bx,bx
GO:
mov dx,offset string1 ;输出string1
mov ah,09h
int 21h
mov ah,07h ;输入十进制高位
int 21h
mov ah,02
mov dl,al
int 21h
sub al,30h
mov bh,al
mov ah,07h ;输入十进制低位
int 21h
mov ah,02
mov dl,al
int 21h
sub al,30h
mov bl,al
mov dl,bh
push cx
mov cl,3
shl bh,cl
add bh,dl
add bh,dl
add bh,bl
mov al,bh ;通过bh*10+bl将二位十进制ASCII码转换成十进制数
cbw
push ax
mov bx,num
mov dx,offset CR
mov ah,09h
int 21h
pop ax
xor bx,bx
cmp ax,0h ;输入的数要大于0,小于100
jb GO
cmp ax,100d
ja GO
mov bx,num
cmp ax,bx
je right ;如果AX等于BX
jb lower ;如果AX小于BX
sub ax,bx
return:
xor dx,dx
mov bl,05h
div bl
out_code al,next3 ;输出*
pop cx
inc cx
mov dx,offset string3 ;输出string3
mov ah,09h
int 21h
mov bx,cx
add bx,30h
mov ah,02h
mov dl,bl
int 21h
mov dx,offset CR
mov ah,09h
int 21h
cmp cx,06h
jb GO
jmp wrong
lower:
sub bx,ax
mov ax,bx
jmp return
again:
mov dx,offset string2 ;输出string2
mov ah,09h
int 21h
mov dx,offset CR
mov ah,09h
int 21h
mov ah,07h ;是否继续游戏
int 21h
cmp al,'y'
je began
jmp EXIT
right: ;猜对后跳转
mov dx,offset string4
mov ah,09h
int 21h
mov dx,offset CR
mov ah,09h
int 21h
jmp again
wrong: ;七次失败后跳转
mov dx,offset string5
mov ah,09h
int 21h
mov dx,offset CR
mov ah,09h
int 21h
jmp again
EXIT:
MOV AH,4CH
INT 21H
RAND PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX ;清高6位
AND AH,3
MOV DL,101 ;除101,产生0~100余数
DIV DL
MOV BL,AH ;余数存BX,作随机数
POP AX
POP DX
POP CX
RET
RAND ENDP
CODES ENDS
END START