本系列旨在通过一系列由浅入深的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
感谢您的参与!
评论区