修订Pico Fermi Bagels猜数字游戏代码,仅用于学习Python。
运行界面如下:
修订的代码如下:
# //
# 提升逻辑思维猜数字小游戏
# BY:Al Sweigart al@inventwithpython.com
# 翻译:诚外无物
# 说明:一个逻辑推理游戏,根据线索猜三位数。游戏根据输入
# 给出提示:
# 猜对一位数字且数字位置正确,提示语:苹果
# 猜对一位数字但数字位置不对,提示语:香蕉
# 如果猜测数字和位置都不正确,提示语:桃子
# //
import random
import sys
NUM_DIGITS = 3 # (!) 数字位数
MAX_GUESSES = 10 # (!) 猜测次数
def main():
# 打印游戏说明
print('''***提升逻辑推理的一个猜数字小游戏***
*
*游戏程序会产生一个{}位的没有重复的数字,请玩家尝试猜一下它是什么。
*根据玩家输入,此游戏提供线索,当你看到如下的提示语,分别意味的是:
* 苹果 一个数字是正确的,且位置正确。
* 香蕉 一个数字是正确的,但位置不正确。
* 桃子 没有正确的数字。
*
*举个例子,正确数字是248 但是你猜测的是 843
*给你提示的线索是: 苹果 香蕉。
'''.format(NUM_DIGITS))
while True:
# secretNum存储了玩家所要猜测的秘密数字
secretNum = getSecretNum()
#print(secretNum)
print('***神秘的数字已经产生了,祝你好运。***')
print('***您最多有 {} 次机会来猜测哦,开始吧。***\n'.format(MAX_GUESSES))
numGuesses = 1
while numGuesses <= MAX_GUESSES:
guess = ''
# 保持循环,直到玩家输入正确的猜测数字:1)位数,2)均为十进制数字字符,即0-9字符
while len(guess) != NUM_DIGITS or not guess.isdecimal():
print('\n猜测次数:< {} >'.format(numGuesses))
guess = input('>>> ')
# 输入quit退出游戏
if guess.lower().startswith('quit'):
sys.exit()
# 获取线索
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('谢谢你再玩一次。')
def getSecretNum():
"""返回唯一一个长度为NUM_DIGITS位数字:类型为包含3位数字的字符串"""
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列表按字符顺序排序,使其不会泄露数字信息
#clues.sort()
# 返回一个由clues列表中所有元素组成的字符串
return ' '.join(clues)
if __name__ == '__main__':
main()