80x86 汇编语言:猜数游戏

很久没有写东西了。
昨天看到一个题目,以为有些意思,就动手编了一个程序。

题目的内容以下:

汇编实现猜数字游戏

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

而后随机生成四个不相同的数字(范围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

本程序,只是容许猜想三次。

作而论道试验了一下,若是容许猜想八次,几乎就确定能够猜中。
因此,题目中,容许游戏者自行肯定猜想次数,就是一个漏洞。

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

题目连接: