python全项目实战系列(十一)有趣的猜数字游戏
本系列旨在通过一系列由浅入深的python实战代码或项目,使普通人也能感受到编程的乐趣,编程能够在平时的工作生活上有所帮助。欢迎查看系列的开篇词和前面文章。概述
设计一个基于python的猜数字游戏。
首先你设置一下要猜测数字的位数和最多猜测多少轮NUM_DIGITS = 2 # 要猜测的数字的位数. MAX_GUESSES = 5 # 最大猜测次数.
当你没有完全猜对时,根据你的猜测结果,有三种不同的结果反馈:没有猜测到其中任意一位数字:没有正确的数字有正确的数字但位置不对:正确的数字在不正确的地方猜到的正确数字有位于正确的位置:正确的数字在正确的位置
根据这三种反馈,你可以不断调整,争取完全猜准确,如果在最大轮数之前你猜出来,则会显示猜对了,并结束游戏。代码实现过程
代码中主要定义了3个函数来实现这个过程def getSecretNum(): 根据前面设置的位数,生成一个随机数用作谜底。def getClues(guess, secretNum): 把你的猜测数字和谜底进行比较,给出相应的反馈结果。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 感谢您的参与!