80x86 汇编语言:猜数游戏

来源:互联网 发布:多瑞科舆情数据分析站 编辑:程序博客网 时间:2024/06/06 05:55
好久没有写东西了。
昨天看到一个题目,觉得有些意思,就动手编了一个程序。

题目的内容如下:

汇编实现猜数字游戏

游戏程序首先接收游戏者输入的猜数次数。

然后随机生成四个不相同的数字(范围0~9)供游戏者猜测。
每当游戏者键入四位数,即为猜了一次。

游戏者每猜一次,程序都显示四个字符,进行提示。
提示字符共有三种:

? 表示猜错了。
X 表示猜出了这个数,但是位置不对。
Y 表示猜对了。

比如:

设随机数是 4321;
游戏者输入 5678,提示则为 ????;
游戏者输入 5674,提示则为 ???X;
游戏者输入 1234,提示则为 XXXX;
游戏者输入 4321,提示则为 YYYY。

如果提示为 YYYY,就说明游戏者不仅猜测对了这四个数,而且排列位置也都正确。
此时,游戏程序就提前结束。

如果在预定的次数中,游戏者都没有猜到数字,程序最后则显示出来内定随机数。

做而论道编程如下:

ASSUME   CS:CC, DS:QQ

QQ  SEGMENT

    MSG1  DB  13, 10, 'You have three time opportunity :'
          DB  13, 10, 13, 10, 36

    NNN   DW  3             ;默认猜数次数

    MSG2  DB  'The random is : ', 13, 10

    XXX   DB  0, 0, 0, 0    ;存放随机数
          DB  13, 10, 36

    YYY   DB  13, 10, '????', 13, 10, 13, 10, 36

QQ  ENDS
  
CC  SEGMENT
;------------------------------  
BG:
    MOV   AX, QQ
    MOV   DS, AX

    LEA   DX, MSG1
    MOV   AH, 9
    INT   21H

    CALL  RANDOM_4  ;生成四个互不相同的数字符号
;------------------------------
IN_LOOP:            ;循环输入四个字符
    MOV   SI, 0     ;分别和四个随机符号比较
IN_X:               ;根据比较结果写入?XY
    MOV   DI, 0
    MOV   AH, 1
    INT   21H       ;键入一个字符
IN_1:
    CMP   AL, XXX[DI]
    JZ    IN_2

    INC   DI
    CMP   DI, 4
    JNZ   IN_1
    MOV   YYY[SI + 2], '?'
    JMP   IN_NEXT

IN_2:
    CMP   SI, DI
    JNZ   IN_3
    MOV   YYY[SI + 2], 'Y'
    JMP   IN_NEXT
IN_3:
    MOV   YYY[SI + 2], 'X'
IN_NEXT:
    INC   SI
    CMP   SI, 4
    JNZ   IN_X
;------------------------------
DISP:
    LEA   DX, YYY     ;显示提示
    MOV   AH, 9
    INT   21H

    CMP   YYY + 2, 'Y'
    JNZ   NEXT
    CMP   YYY + 3, 'Y'
    JNZ   NEXT
    CMP   YYY + 4, 'Y'
    JNZ   NEXT
    CMP   YYY + 5, 'Y'
    JNZ   NEXT

    JMP   EXIT       ;四个都是Y就提前结束

NEXT:
    DEC   NNN
    CMP   NNN, 0
    JNZ   IN_LOOP    ;不到次数就再次输入

    LEA   DX, MSG2   ;显示内定
    MOV   AH, 9
    INT   21H

EXIT:
    MOV   AH, 4CH    ;程序结束
    INT   21H
;------------------------------
RANDOM_4:
    MOV   DL, '8'
    MOV   DI, 0
RDM:
    MOV   CL, DL
    ADD   CL, 17
    MOV   CH, DH
    AND   CH, 1
    LOOP  $
    CALL  GET_RANDOM ;AL=0~9
    MOV   DL, AH
    ADD   DL, '0'

    MOV   SI, 0
CHK:
    CMP   DL, XXX[SI]
    JZ    RDM
    INC   SI
    CMP   SI, 4
    JNZ   CHK

    MOV   XXX[DI], DL
    INC   DI
    CMP   DI, 4
    JNZ   RDM
RET
;------------------------------
GET_RANDOM:
    MOV   AH, 2CH
    INT   21H
    MOV   AL, DL 
    MOV   AH, 0
    MOV   BL, 10
    DIV   BL
RET                  ;AL=0~9
;---------------------------------

CC  ENDS
    END   BG

;====================================

本程序执行,有如下的显示:

c:\masm510>RDM_4

You have three time opportunity :

1357
X?X?

5126
XX?Y

4516
?YYY

The random is :
0516

本程序,只是允许猜测三次。

做而论道试验了一下,如果允许猜测八次,几乎就肯定可以猜中。
所以,题目中,允许游戏者自行确定猜测次数,就是一个漏洞。

允许猜测三次,猜对可能性,稍小一些,这就有一定的难度。
玩这样的游戏,才能有兴致。

题目链接:
http://zhidao.baidu.com/question/1240492546408601299
http://zhidao.baidu.com/question/1948592962251911948
1 0