侧边栏壁纸
博主头像
问道

问道的小花园,总能给你带来惊喜

  • 累计撰写 68 篇文章
  • 累计创建 35 个标签
  • 累计收到 3 条评论

python全项目实战系列(十一):有趣的猜数字游戏

问道
2022-08-01 / 0 评论 / 0 点赞 / 447 阅读 / 2,599 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-08-01,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

本系列旨在通过一系列由浅入深的python实战代码或项目,使普通人也能感受到编程的乐趣,编程能够在平时的工作生活上有所帮助。欢迎查看系列的开篇词和前面文章。

概述

设计一个基于python的猜数字游戏。

首先你设置一下要猜测数字的位数和最多猜测多少轮

NUM_DIGITS = 2  # 要猜测的数字的位数.
MAX_GUESSES = 5  # 最大猜测次数.

当你没有完全猜对时,根据你的猜测结果,有三种不同的结果反馈:

  1. 没有猜测到其中任意一位数字:没有正确的数字
  2. 有正确的数字但位置不对:正确的数字在不正确的地方
  3. 猜到的正确数字有位于正确的位置:正确的数字在正确的位置

根据这三种反馈,你可以不断调整,争取完全猜准确,如果在最大轮数之前你猜出来,则会显示猜对了,并结束游戏。

代码实现过程

代码中主要定义了3个函数来实现这个过程

  1. def getSecretNum(): 根据前面设置的位数,生成一个随机数用作谜底。
  2. def getClues(guess, secretNum): 把你的猜测数字和谜底进行比较,给出相应的反馈结果。
  3. def main(): 在你设置的猜测轮数中,进行比较,如果都没猜到,最终也会打印出正确结果,并询问你是否再来一次。

需要注意的是:你猜测数字的位数要和谜底相等,否则会一直循环重新输入。

详细代码注释

"""
Bagels, by Al Sweigart al@inventwithpython.com
A deductive logic game where you must guess a number based on clues.
This code is available at https://nostarch.com/big-book-small-python-programming
A version of this game is featured in the book, "Invent Your Own
Computer Games with Python" https://nostarch.com/inventwithpython
Tags: short, game, puzzle
"""
import random

NUM_DIGITS = 2  # 要猜测的数字的位数.
MAX_GUESSES = 5  # 最大猜测次数.

def getSecretNum():
    "返回由 NUM_DIGITS 个唯一随机数字组成的字符串."
    numbers = list('0123456789')  # 创建一个 0 到 9 的数字列表.
    random.shuffle(numbers)  # 将它们随机排列.

    # 获取密码列表中的前 NUM_DIGITS 位数字:
    secretNum = ''
    for i in range(NUM_DIGITS):
        secretNum += str(numbers[i])
    return secretNum

def getClues(guess, secretNum):
    """
    返回一个带有 pico, fermi, bagels 线索的字符串以供猜测    和密码对.
    """
    if guess == secretNum:
        return '你猜对了!'

    clues = []

    for i in range(len(guess)):
        if guess[i] == secretNum[i]:
            # 正确的数字在正确的位置.
            clues.append('正确的数字在正确的位置')
        elif guess[i] in secretNum:
            # 一个正确的数字在不正确的地方.
            clues.append('正确的数字在不正确的地方')
    if len(clues) == 0:
        return '没有正确的数字'  # 根本没有正确的数字.
    else:
        # 将线索按字母顺序排序,使其原始顺序不泄露信息
        clues.sort()
        # 从字符串线索列表中创建一个字符串.
        return ' '.join(clues)


def main():
    while True:  # Main game loop.
        # 这存储了玩家需要猜测的秘密数字:
        secretNum = getSecretNum()  #生成无重复数字的随机数
        print('我想出了一个数字。')
        print(' 你有 {} 次机会猜出它.'.format(MAX_GUESSES))

        numGuesses = 1
        while numGuesses <= MAX_GUESSES:
            guess = ''
            # 继续循环,猜测字符的长度不是NUM_DIGITS的长度,或者字符不是10进制字符:
            while len(guess) != NUM_DIGITS or not guess.isdecimal():
                print('Guess #{}: '.format(numGuesses))
                guess = input('请输入猜测的数字,如果位数不对,则会在此一直循环: ')

            clues = getClues(guess, secretNum)
            print(clues)
            numGuesses += 1

            if guess == secretNum:
                break  # 结果正确的,跳出这个循环.
            if numGuesses > MAX_GUESSES:
                print('你没有猜到.')
                print('答案是 {}.'.format(secretNum))

        # 询问玩家是否想再玩一次.
        print('你想再玩一次吗? (yes or no)')
        if not input('> ').lower().startswith('y'):
            break
    print('感谢您的参与!')


# 从主程序运行游戏:
if __name__ == '__main__':
    main()

一轮游戏结果如下,猜测5次,可惜差一点猜出来了。你可以调整数字位数和猜测轮数来体验一下。

我想出了一个数字。
 你有 5 次机会猜出它.
Guess #1: 
请输入猜测的数字,如果位数不对,则会在此一直循环: 13
没有正确的数字
Guess #2: 
请输入猜测的数字,如果位数不对,则会在此一直循环: 25
没有正确的数字
Guess #3: 
请输入猜测的数字,如果位数不对,则会在此一直循环: 47
正确的数字在正确的位置
Guess #4: 
请输入猜测的数字,如果位数不对,则会在此一直循环: 46
正确的数字在正确的位置
Guess #5: 
请输入猜测的数字,如果位数不对,则会在此一直循环: 48
正确的数字在正确的位置
你没有猜到.
答案是 49.
你想再玩一次吗? (yes or no)
> n
感谢您的参与!

0

评论区