-
Notifications
You must be signed in to change notification settings - Fork 4
/
unicorn-classic.py
218 lines (186 loc) · 6.87 KB
/
unicorn-classic.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#
# Flying Unicorn
# A simple quantum game where the player has to fly a unicorn to the castle.
# Classic implementation (non-quantum).
#
import random
import math
def getName(index):
names = {
1: 'Golden',
2: 'Sparkle',
3: 'Twilight',
4: 'Rainbow',
5: 'Mist',
6: 'Bow',
7: 'Cloud',
8: 'Sky',
9: 'Magic',
10: 'Pixel',
11: 'Sprite',
12: 'Mansion',
13: 'Dark',
14: 'Light',
15: 'Crimson'
}
return names.get(index, 'Mystery')
def getJewel(index):
names = {
1: 'amethyst',
2: 'sapphire',
3: 'emerald',
4: 'jade',
5: 'ruby',
6: 'topaz',
7: 'diamond',
8: 'garnet',
9: 'pearl',
10: 'opal',
11: 'amber',
12: 'citrine',
13: 'moonstone',
14: 'quartz'
}
return names.get(index, 'Mystery')
# Get the status for the current state of the unicorn.
def status(altitude):
if altitude == 0:
return 'is waiting for you on the ground'
elif altitude <= 100:
return 'is floating gently above the ground'
elif altitude <= 200:
return 'is hovering just above the evergreen sea of trees'
elif altitude <= 300:
return 'is approaching the first misty cloud layer'
elif altitude <= 400:
return 'has soared through the misty pink clouds'
elif altitude <= 500:
return 'is well above the misty clouds'
elif altitude <= 600:
return 'You can barely see the evergreen sea of trees from this high up'
elif altitude <= 700:
return 'is soaring through the sky'
elif altitude <= 800:
return 'You can see the first glimpse of the golden castle gates just above you'
elif altitude <= 900:
return 'is nearly at the mystical castle gates'
elif altitude < 1000:
return 'swiftly glides through the mystical castle gate. You\'re almost there'
else:
return 'A roar emits from the crowd of excited sky elves, waiting to greet you'
def action(command):
command = command.lower()[0]
switcher = {
'u': 150,
'd': -150,
'q': 0
}
return switcher.get(command, -1)
def miniGame(altitude):
print("\n=====================\n-[ Altitude " + str(altitude) + " feet ]-\nA mischievous quantum cloud blocks your way and challenges you to a game!")
print("He has stolen a magical unicorn jewel from the castle!\nIf you can guess which jewel is the real one before the cloud, you'll be rewarded.\nIf you lose, you'll face a penalty.")
bonus = 0
# Read input.
command = input("Do you want to play his game? [yes,no]: ").lower()
if command[0] == 'y':
# Select a random number (returned as an array of bits).
print("The mischievous cloud blinks his eyes. You hear a crack of thunder. A unicorn jewel has been chosen.")
secret = random.randint(1, 14) # 1-14
# Begin the mini-game loop.
isGuessGameOver = False
round = 0
jewels = []
for i in range(14):
jewels.append(getJewel(i + 1))
# Memory for the computer to select an answer from.
memory = jewels.copy()
secret_jewel = memory[secret - 1]
while not isGuessGameOver:
# Let the player make a guess.
round = round + 1
# Select a jewel.
command = ''
while not command.lower() in jewels:
command = input("Round " + str(round) + ". Which unicorn jewel is the real one? [" + ','.join(jewels) + "]: ").lower()
# Make the selected index 1-based to match our secret number and be within the selected range.
index = jewels.index(command) + 1 if command in jewels else -1
# Check if the player guesses the correct number.
if index == secret:
print("You guessed correct!")
print("Altitude + 100")
bonus = 100
isGuessGameOver = True
else:
print("You guessed wrong.")
# Remove this jewel from the list of available choices for the computer player.
remove_index = memory.index(command) if command in memory else -1
if remove_index > -1:
memory.pop(remove_index)
# Let the computer make a guess.
if not isGuessGameOver:
# The computer's guess is a number from the remaining choices.
computer_result = random.randint(1, len(memory))
print("The mischievous cloud guesses " + memory[computer_result - 1] + '.')
if memory[computer_result - 1] == secret_jewel:
print("Haha, I win, says the mischievous cloud!\nDon't say I didn't warn you!")
print("Altitude - 100")
bonus = -100
isGuessGameOver = True
else:
# Remove this jewel from the list of available choices for the computer player.
memory.pop(computer_result - 1)
# Return the new altitude + bonus (or penalty).
return (altitude + bonus) if (altitude + bonus) >= 0 else 0
isGameOver = False # Indicates when the game is complete.
altitude = 0 # Current altitude of player. Once goal is reached, the game ends.
goal = 1024 # Max altitude for the player to reach to end the game.
turns = 0 # Total count of turns in the game.
# Generate a random name using a random number generator.
name = getName(random.randint(1, 16)) + ' ' + getName(random.randint(1, 16))
print('================')
print(' Flying Unicorn')
print('================')
print('')
print('Your majestic unicorn, ' + name + ', is ready for flight!')
print('After a long night of preparation and celebration, it\'s time to visit the castle in the clouds.')
print('Use your keyboard to fly up or down on a quantum computer, as you ascend your way into the castle.')
print('')
# Begin main game loop.
while not isGameOver:
# Get input from the user.
command = ''
while not command.lower() in ['u', 'd', 'q', 'up', 'down', 'quit']:
# Read input.
command = input("\n=====================\n-[ Altitude " + str(altitude) + " feet ]-\n" + name + " " + status(altitude) + ".\n[up,down,quit]: ").lower()
# Process input.
modifier = action(command)
if modifier == 0:
isGameOver = True
elif modifier == -1:
print("What?")
else:
if modifier > 0:
print("You soar into the sky.")
elif modifier < 0:
if altitude > 0:
print("You dive down lower.")
else:
print("Your unicorn can't fly into the ground!")
turns = turns + 1
# Move the player with some randomness.
altitude = altitude + modifier + random.randint(1, 50) # 1-50
# Did the player reach the castle?
if altitude >= goal:
print('Congratulations! ' + name + ' soars into the castle gates!')
isGameOver = True
elif altitude > 0:
# Check if we should play a mini-game.
if random.randint(1, 16) > 12:
# Play the mini-game and then apply a bonus or penalty to altitude.
altitude = miniGame(altitude)
else:
altitude = 0
if not isGameOver and altitude >= goal:
print('Congratulations! ' + name + ' soars into the castle gates!')
isGameOver = True
print("The game ended in " + str(turns) + " rounds. " + ("You won, great job! :)" if altitude >= goal else "Better luck next time. :("))