|
楼主 |
发表于 2019-4-7 17:13:45
|
显示全部楼层
DATA SEGMENT
BUFF1 DB '****************************************'
DB ' '
DB ' Welcome you to run this game! ' ;初始界面
DB ' '
DB '****************************************','$'
N DB ?
JIFEN DB ?
DIPAI DB ?
PAIDIAN DB ?
QH1 DB ?
QH2 DB ?
SH DB '10','$'
JK DB 'PEI LV(10 OR 5)?','$'
MESSAGE0 DB 'DOU YOU WANT TO MORE?','$' ;开始标语
MESSAGE1 DB '************YOU WIN!************','$' ;成功显示
MESSAGE2 DB '************YOU LOSE!***********','$' ;失败显示
MESSAGE3 DB 'Go on or not?','$' ;结束语言
MESSAGE4 DB 'This is dipai:','$'
MESSAGE5 DB ' This is JIFEN:','$'
MESSAGE6 DB '******THE GAME IS OVER !******','$' ;结束语言
MESSAGE7 DB 0AH, 0DH,'This is your PAIDIAN:','$'
DATA ENDS
STACK SEGMENT ;构造栈
DW 256 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: PUSH DS ;将ds寄存器压入栈
MOV AX,0 ;将0传入ax寄存器
PUSH AX ;将ax压入栈
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
BEGIN: CALL XX0 ;h240输出字符xx0
A1:
MOV JIFEN,50 ;定义积分
A2:
CALL RAND ;调用函数h124
MOV DIPAI,BL ;产生随机数为底牌
CALL CHULI ;调用函数h315,判断牌点是否大于在10
MOV QH1,BL ;产生电脑底牌
JB1: CALL XX ;h233,输出字符串
MOV AH,0 ;从键盘读取字符,ah/al=扫描码
INT 16H ;中断
CMP AL,59H ; 相减,只影响标志位zf,59h表示字母y
JE JI ; 若是y则跳转h58
CALL XX21 ;函数调用h339
MOV N,5
JMP A3 ;无条件跳转
JI: MOV N,10
CALL XX20 ;h344,输出字母y
A3:
CALL RAND ;h124,产生一个随机数
CALL XX19 ;h324, ;输出message7
MOV PAIDIAN,BL ;再发一张牌
CALL DISP0 ;h154 判断牌点具体数值
CALL CHULI ;307判断牌点是否大于10
MOV QH2,BL ;产生底牌
CALL XX4 ;h252输出message0
A4:
MOV AH,0 ;从键盘读字符,ah/al=扫描码
INT 16H
CMP AL,4EH
JE HC ;4e表示字母n,相等跳转
CMP AL,59H
JE A4 ;59h表示y,是y就跳转
A5:
CALL RAND ;h129产生一个牌点
CALL XX19 ;输出字符串message7
MOV PAIDIAN,BL ;牌点
CALL DISP0 ;判断具体牌点
CALL CHULI ;h321判断是否大于10
A6:
ADC QH2,BL ;实现加法,并记录是否进位
A7:
CMP QH2,21
JA A14 ;判断牌点是否大于21点
CALL XX4 ;h268输入字符message0
A8:
JMP A4 ;输入
ZZ: CALL XX0 ;h248,置光标
JMP A2 ;重新发牌
HC: CALL RETURN ;回车换行
A9:
MOV AL,QH2 ;
CMP QH1,AL ;判断游戏者与电脑点数大小
JA A14 ;h109,判断若电脑点数大,跳转
A10:
CALL RAND
MOV PAIDIAN,BL ;记录牌点
CALL DISP0 ;判断牌点是否大于10
CALL CHULI ;判断具体牌点
A11:
ADC QH1,BL ;牌点相加,与21比较
A12:
CMP QH1,21 ;若牌点大于21
JA A15 ;输出游戏结束,游戏者赢
A13:
JMP A9 ;否则跳转a9,与电脑比大小
A14:
CALL XX14 ;h280输出message2
CALL JIAN ;h226,记录积分
CMP JIFEN,10 ;若积分不大于10分,跳转,游戏结束
JB A18
JMP A16 ;若积分大于10,跳转,message4
A15:
CALL XX15 ;输出游戏结果,游戏者赢
CALL JIA ;
A16:
CALL XX16 ;输出牌点大小
MOV AL,DIPAI
MOV PAIDIAN,AL
CALL DISP0 ;判断大小
CALL DISP1 ;
A17:
CALL XX17
AG: MOV AH,0 ;从键盘输入
INT 16H
CMP AL,59h
JE ZZ ;相等跳转
CMP AL,4EH
JE A18 ;相等跳转
JNE AG ;不相等跳转
A18:
CALL XX18 ;输出
MOV AH,4CH
INT 21H
RAND PROC ;随机函数
PUSH CX
PUSH DX
PUSH AX
STI ;中断标志置1指令 使 IF = 1
MOV CX,0FFFFH
YS: DEC CX ;自减相当于循环
JNE YS ; 不等于零跳转
MOV AH,0 ;读当前时钟值
INT 1AH ;中断
MOV AX,DX
AND AH,3 ;求和
MOV DL,13
DIV DL ;ax除以dl中的值 商放al 余数放ah
MOV BL,AH
ADC BL,1 ;相加,涉及进位cf
POP AX
POP DX
POP CX
RET
RAND ENDP
DISP0 PROC
CALL SPACE ;h312,输出空格
CA
LL SPACE ;h312,输出空格
CALL SPACE ;h312,输出空格
MOV AL,PAIDIAN
CMP AL,9
JA OTHER ; 比较,大于9跳转
CMP AL,1
JE A ;底牌al等于1,跳转
ADD AL,30H ;相加
T: MOV DL,AL
MOV AH,2 ;显示输出,dl=字符串
INT 21H
RET
OTHER: CMP AL,10
JE SHI ;h182等于10的时候跳转
CMP AL,11
JE J ;等于11的时候跳转
CMP AL,12
JE Q ;等于12的时候跳转
MOV AL,4BH
JMP T ;4bh表示字母k
J: MOV AL,4AH
JMP T ;4ah表示字母j
Q: MOV AL,51H
JMP T ;51h表示字母q
A: MOV AL,41H
JMP T ;41h表示字母a
SHI: LEA DX,SH
MOV AH,09H ;显示字符串,ds:dx=串地址,
INT 21H
RET
DISP0 ENDP
DISP1 PROC ;求出现在积分
LEA DX,MESSAGE5
MOV AH,9 ;输出字符串,输出积分,dx:ds=串地址
INT 21H
MOV AL,JIFEN ;积分放到al
CMP AL,100
JB MM ;若积分不足100,跳转
MOV CL,100
CBW ;将AL的最高有效位D7扩展至AH
DIV CL ;ax除以cl中的值 商放al 余数放ah
MOV BL,AH ;
OR AL,30H ;或
MOV DL,AL
MOV AH,2 ;显示输出
INT 21H
MOV AL,BL
MM: MOV CL,10
CBW ;将AL的最高有效位扩展至AH
DIV CL ;ax除以cl,商放ah,余放al
OR AL,30H ;或运算,放在al
MOV DL,AL
MOV AH,2 ;显示输出,dl=输出字符,
INT 21H
MOV DL,30H ;显示输出,dl=输出字符,30h表示为‘0’
MOV AH,2
INT 21H
RET
DISP1 ENDP
JIAN PROC ;扣分惩罚
CMP N,10 ;若n大于10,跳转
JA X
SBB JIFEN,10 ;扣积分10分,且记录借位
JMP TU1 ;
X: SBB JIFEN,20 ;扣积分20分,且记录借位
TU1: RET
JIAN ENDP
JIA PROC ;积分奖励
CMP N,10
JA Y ;若牌点大于10,加20积分
ADC JIFEN,10 ;奖励积分,并实现进位
JMP TU ;无条件跳转
Y: ADC JIFEN,20
TU: RET
JIA ENDP
XX PROC ;输出字符串jk
LEA DX,JK
MOV AH,9
INT 21H
RET
XX ENDP
XX0
PROC
MOV AX,0600H ;当前显示页上卷
MOV CX,0000H ;定义下卷窗口左上角坐标
MOV DX,184FH ;定义下卷窗口又下角坐标
MOV BH,07H ;填充字符属性
INT 10H
MOV AH,02H ;置光标
MOV DH,5 ;第五行
MOV DL,15 ;第十五列
MOV BH,00H ;填充字符属性
INT 10H
LEA DX,BUFF1
MOV AH,09H ;显示字符串buff1
INT 21H
CALL RETURN ;回车换行
RET
XX0 ENDP
XX4 PROC
CALL RETURN ;回车换行
LEA DX,MESSAGE0 ;输出字符串message0
MOV AH,09
INT 21H
RET
XX4 ENDP
XX14 PROC
CALL RETURN ;回车换行
LEA DX,MESSAGE2 ;输出字符串message2
MOV AH,9
INT 21H
RET
XX14 ENDP
XX15 PROC
CALL RETURN ;换行回车
LEA DX,MESSAGE1 ;输出字符串message1
MOV AH,9
INT 21H
RET
XX15 ENDP
XX16 PROC
CALL RETURN ;回车换行
lea dx,MESSAGE4 ;输出字符串message4
MOV AH,9
INT 21H
RET
XX16 ENDP
XX17 PROC
CALL RETURN ;回车换行
LEA DX,MESSAGE3 ;输出字符串message3
MOV AH,9
INT 21H
CALL RETURN ;回车换行
RET
XX17 ENDP
XX18 PROC ;输出字符串message6
LEA DX,MESSAGE6
MOV AH,9
INT 21H
RET
XX18 ENDP
SPACE PROC ;输出空格
MOV DL,20H ;dl=输出字符,20h表示为空格
MOV AH,2 ;显示输出
INT 21H ;中断
RET
SPACE ENDP
CHULI PROC ;判断是否大于10
CMP BX,10 ;相减,影响标志位
JB D ;低于跳转
MOV BX,10
D: ADD BX,0
RET
CHULI ENDP
RETURN PROC ;换行
MOV AH,2 ;显示输出,dl=字符
MOV DL,0AH ;0a表示lf(换行)
INT 21H
MOV DL,0DH ;显示字符串dl=字符,0d表示cr(回车)
INT 21H
RET
RETURN ENDP
XX19 PROC ;输出message7
LEA DX,MESSAGE7 ;将message7地址给dx
MOV AH,9 ;显示字符串,ds:dx=串地址,
INT 21H ;中断
RET
XX19 ENDP
XX20 PROC
CALL SPACE ;输出空格键
MOV DL,59H
MOV AH,2 ;显示输出字符串dl,59h表示为字母y
INT 21H
CALL SPACE ;输出字符串空格
RET
XX20 ENDP
XX21 PROC
CALL SPACE ;输出字符串空格4e,表示为字母n
MOV DL,4EH
MOV AH,2 ;显示输出,dl=输出字符
INT 21H
CALL SPACE ;输出字符串空格
RET
XX21 ENDP
RET
CODE ENDS
END START ;结束
|
|