mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-25 04:15:45 -08:00
170 lines
3.0 KiB
Python
170 lines
3.0 KiB
Python
"""
|
|
POETRY
|
|
|
|
A poetry generator
|
|
|
|
Ported by Dave LeCompte
|
|
"""
|
|
|
|
# PORTING EDITORIAL NOTE:
|
|
#
|
|
# The original code is a pretty convoluted mesh of GOTOs and global
|
|
# state. This adaptation pulls things apart into phrases, but I have
|
|
# left the variables as globals, which makes goes against decades of
|
|
# wisdom that global state is bad.
|
|
import random
|
|
|
|
PAGE_WIDTH = 64
|
|
|
|
|
|
# globals
|
|
u = 0
|
|
i = 0
|
|
j = 0
|
|
k = 0
|
|
phrase = 1
|
|
line = ""
|
|
|
|
|
|
def print_centered(msg):
|
|
spaces = " " * ((PAGE_WIDTH - len(msg)) // 2)
|
|
print(spaces + msg)
|
|
|
|
|
|
def process_phrase_1():
|
|
global line
|
|
|
|
line_1_options = [
|
|
"MIDNIGHT DREARY",
|
|
"FIERY EYES",
|
|
"BIRD OR FIEND",
|
|
"THING OF EVIL",
|
|
"PROPHET",
|
|
]
|
|
|
|
line = line + line_1_options[i]
|
|
return line
|
|
|
|
|
|
def process_phrase_2():
|
|
global line
|
|
global u
|
|
|
|
line_2_options = [
|
|
("BEGUILING ME", 2),
|
|
("THRILLED ME", None),
|
|
("STILL SITTING....", None),
|
|
("NEVER FLITTING", 2),
|
|
("BURNED", None),
|
|
]
|
|
words, u_modifier = line_2_options[i]
|
|
line += words
|
|
if not (u_modifier is None):
|
|
u = u_modifier
|
|
|
|
|
|
def process_phrase_3():
|
|
global line
|
|
|
|
phrases = [
|
|
(False, "AND MY SOUL"),
|
|
(False, "DARKNESS THERE"),
|
|
(False, "SHALL BE LIFTED"),
|
|
(False, "QUOTH THE RAVEN"),
|
|
(True, "SIGN OF PARTING"),
|
|
]
|
|
|
|
only_if_u, words = phrases[i]
|
|
if (not only_if_u) or (u > 0):
|
|
line = line + words
|
|
|
|
|
|
def process_phrase_4():
|
|
global line
|
|
|
|
phrases = [
|
|
("NOTHING MORE"),
|
|
("YET AGAIN"),
|
|
("SLOWLY CREEPING"),
|
|
("...EVERMORE"),
|
|
("NEVERMORE"),
|
|
]
|
|
|
|
line += phrases[i]
|
|
|
|
|
|
def maybe_comma():
|
|
# line 210
|
|
global u
|
|
global line
|
|
|
|
if len(line) > 0 and line[-1] == ".":
|
|
# don't follow a period with a comma, ever
|
|
return
|
|
|
|
if u != 0 and random.random() <= 0.19:
|
|
line += ", "
|
|
u = 2
|
|
# line 212
|
|
if random.random() <= 0.65:
|
|
line += " "
|
|
u += 1
|
|
else:
|
|
# line 214
|
|
print(line)
|
|
line = ""
|
|
u = 0
|
|
|
|
|
|
def pick_phrase():
|
|
global phrase
|
|
global line
|
|
global i, j, k
|
|
|
|
i = random.randint(0, 4)
|
|
j += 1
|
|
k += 1
|
|
|
|
if u <= 0 and (j % 2) != 0:
|
|
# random indentation is fun!
|
|
line += " " * 5
|
|
phrase = j + 1
|
|
|
|
|
|
def main() -> None:
|
|
print_centered("POETRY")
|
|
print_centered("CREATIVE COMPUTING MORRISTOWN, NEW JERSEY")
|
|
print()
|
|
print()
|
|
print()
|
|
|
|
global line, phrase, j, k, u
|
|
|
|
phrase_processors = {
|
|
1: process_phrase_1,
|
|
2: process_phrase_2,
|
|
3: process_phrase_3,
|
|
4: process_phrase_4,
|
|
}
|
|
|
|
while True:
|
|
if phrase >= 1 and phrase <= 4:
|
|
phrase_processors[phrase]()
|
|
maybe_comma()
|
|
elif phrase == 5:
|
|
j = 0
|
|
print(line)
|
|
line = ""
|
|
if k > 20:
|
|
print()
|
|
u = 0
|
|
k = 0
|
|
else:
|
|
phrase = 2
|
|
continue
|
|
pick_phrase()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|