-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbagels.py
More file actions
98 lines (78 loc) · 3.33 KB
/
bagels.py
File metadata and controls
98 lines (78 loc) · 3.33 KB
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
"""Bagels, by AL Sweigart al@inventwithpython.com
A deductive logic game where you must guess a number based on clues.
View this code at https://nostarch.com/big-book-small-python-projects
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 = 3 # (!)TRY setting this to 1 or 10
MAX_GUESSES = 10 # (!)TRY setting this to 1 or 100
def main():
print('''Bagels, a deductive logic game.
By Al Sweigart al@inventwithpython.com
I am thinking of a {}-digit number with no repeated digits.
Try to guess what it is. Here are some clues:
When I say: That means:
pico One digit is correct but in the wrong position.
Fermi One digit is correct and in the right position.
Bagels No digit is correct.
For example, if the secret number was 248 and your guess was 843, the
clues would be Fermi Pico.'''.format(NUM_DIGITS))
while True: #Main game loop.
#This stores the secret number the player needs to guess:
secretNum = getSecretNum()
print('I have thought up a number.')
print(' You have {} guesse to get it.'.format(MAX_GUESSES))
numGuesses = 1
while numGuesses <= MAX_GUESSES:
guess = ''
#keep looking until they enter a valid guess:
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 # They're correct, so break out of this loop.
if numGuesses > MAX_GUESSES:
print('You ran out of guesses.')
print('The answer was {}. '.format(secretNum))
# Ask player if thy want to play again.
print('Do you want to play again? (yes or no)')
if not input('>').lower().startswith('y'):
break
print('Thanks for playing!')
def getSecretNum():
""" Returns a string made up of NUM_DIGITS unique random digits."""
numbers = list('0123456789') # Create a list of digits 0 to 9
random.shuffle(numbers) #Shuffle them into random order.
# Get the first NUM_DIGITS in the list for the secret number:
secretNum = ''
for i in range(NUM_DIGITS):
secretNum += str(numbers[i])
return secretNum
def getClues(guess, secretNum):
""" Returns a string with the pico, fermi, bagels clues for a guess
and secret number pair."""
if guess == secretNum:
return 'You got it!'
clues = []
for i in range(len(guess)):
if guess[i] == secretNum[i]:
# A correct digit is in the corrrect place.
clues.append('fermi')
elif guess[i] in secretNum:
# A correct digit is in the incorrect place.
clues.append('Pico')
if len(clues) == 0:
return 'Bagels' # There are no corrct digits at all.
else:
# Sort the clues into alphabetical order so their original order
# doesn't give information away.
clues.sort()
# Make a single string from the list of string clues.
return ''.join(clues)
# If the program is run (instead of imported), run the game:
if __name__ == '__main__':
main()