Skip to content

Latest commit

 

History

History
112 lines (83 loc) · 4.09 KB

File metadata and controls

112 lines (83 loc) · 4.09 KB

四十二、魔术幸运球

原文:http://inventwithpython.com/bigbookpython/project42.html

魔术幸运球可以预测未来,并使用 Python 的随机数模块以 100%的准确率回答你的是/否问题。这个程序类似于一个魔术八球玩具,除了你不需要摇动它。它还具有缓慢打印文本字符串的功能,每个字符之间有空格,给消息一种怪异、神秘的效果。

大部分代码致力于设置诡异的气氛。程序本身简单地选择一个消息来显示,以响应一个随机数。

运行示例

当您运行magicfortuneball.py时,输出将如下所示:

M A G i C   F O R T U N E   B A L L ,   B Y   A L   S W E i G A R T

A S K   M E   Y O U R   Y E S / N O   Q U E S T i O N .

> Isn't fortune telling just a scam to trick money out of gullible people?
L E T   M E   T H i N K   O N   T H i S . . .

. . . . . . . .

i   H A V E   A N   A N S W E R . . .

A F F i R M A T i V E

工作原理

魔术幸运球实际上做的唯一事情是显示一个随机选择的字符串。完全忽略了用户的疑问。当然,第 28 行调用了input('> '),但是它没有在任何变量中存储返回值,因为程序实际上并没有使用这个文本。让用户输入他们的问题给他们一种感觉,这个程序有一种千里眼的光环。

slowSpacePrint()函数显示大写文本,任何字母I用小写,使消息看起来独特。该函数还在字符串的每个字符之间插入空格,然后缓慢显示,中间有停顿。一个程序不需要复杂到可以预测未来才有趣!

"""Magic Fortune Ball, by Al Sweigart email@protected
Ask a yes/no question about your future. Inspired by the Magic 8 Ball.
This code is available at https://nostarch.com/big-book-small-python-programming
Tags: tiny, beginner, humor"""

import random, time


def slowSpacePrint(text, interval=0.1):
    """Slowly display text with spaces in between each letter and
    lowercase letter i's."""
    for character in text:
        if character == 'I':
            # I's are displayed in lowercase for style:
            print('i ', end='', flush=True)
        else:
            # All other characters are displayed normally:
            print(character + ' ', end='', flush=True)
        time.sleep(interval)
    print()  # Print two newlines at the end.
    print()


# Prompt for a question:
slowSpacePrint('MAGIC FORTUNE BALL, BY AL SWEiGART')
time.sleep(0.5)
slowSpacePrint('ASK ME YOUR YES/NO QUESTION.')
input('> ')

# Display a brief reply:
replies = [
    'LET ME THINK ON THIS...',
    'AN INTERESTING QUESTION...',
    'HMMM... ARE YOU SURE YOU WANT TO KNOW..?',
    'DO YOU THINK SOME THINGS ARE BEST LEFT UNKNOWN..?',
    'I MIGHT TELL YOU, BUT YOU MIGHT NOT LIKE THE ANSWER...',
    'YES... NO... MAYBE... I WILL THINK ON IT...',
    'AND WHAT WILL YOU DO WHEN YOU KNOW THE ANSWER? WE SHALL SEE...',
    'I SHALL CONSULT MY VISIONS...',
    'YOU MAY WANT TO SIT DOWN FOR THIS...',
]
slowSpacePrint(random.choice(replies))

# Dramatic pause:
slowSpacePrint('.' * random.randint(4, 12), 0.7)

# Give the answer:
slowSpacePrint('I HAVE AN ANSWER...', 0.2)
time.sleep(1)
answers = [
    'YES, FOR SURE',
    'MY ANSWER IS NO',
    'ASK ME LATER',
    'I AM PROGRAMMED TO SAY YES',
    'THE STARS SAY YES, BUT I SAY NO',
    'I DUNNO MAYBE',
    'FOCUS AND ASK ONCE MORE',
    'DOUBTFUL, VERY DOUBTFUL',
    'AFFIRMATIVE',
    'YES, THOUGH YOU MAY NOT LIKE IT',
    'NO, BUT YOU MAY WISH IT WAS SO',
]
slowSpacePrint(random.choice(answers), 0.05) 

在输入源代码并运行几次之后,尝试对其进行实验性的修改。你也可以自己想办法做到以下几点:

  • 检查玩家的问题是否以问号结尾。
  • 添加程序可以给出的其他答案。

探索程序

试着找出下列问题的答案。尝试对代码进行一些修改,然后重新运行程序,看看这些修改有什么影响。

  1. 如果把第 45 行的random.randint(4, 12)改成random.randint(4, 9999)会怎么样?
  2. 如果把第 49 行的time.sleep(1)改成time.sleep(-1),会得到什么错误?