Skip to content

Commit 3cab87c

Browse files
Number guessing game complete
1 parent 28690ce commit 3cab87c

File tree

1 file changed

+74
-18
lines changed

1 file changed

+74
-18
lines changed

cse231/number_guessing_game.py

Lines changed: 74 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,60 +14,90 @@ def is_good_number(number):
1414
Let's a user know whether a number is properly formed.
1515
Each number should be 5 digits long and should not repeat numbers.
1616
17-
:param number: int
17+
:param number: str
1818
:return: boolean
1919
20-
>>> is_good_number(12345)
20+
>>> is_good_number('12345')
2121
True
22-
>>> is_good_number(55432)
22+
>>> is_good_number('55432')
2323
False
24-
>>> is_good_number(444)
24+
>>> is_good_number('444')
2525
False
2626
"""
27-
if not number:
27+
try:
28+
int(number)
29+
except ValueError:
30+
error_message()
31+
32+
if not int(number):
2833
return False
29-
if len(str(number)) != 5:
34+
35+
elif len(number) != 5:
3036
return False
31-
for num in str(number):
32-
if str(number).count(num) > 1:
37+
38+
for num in number:
39+
if number.count(num) > 1:
3340
return False
41+
3442
return True
3543

3644

3745
def error_message():
3846
"""
3947
Print an error message based on an ill formed number.
4048
"""
41-
pass
49+
print('The number must be 5 digits long and should not repeat numbers.')
50+
print('Please fix your number!\n\n')
51+
return get_number()
4252

4353

4454
def blank_lines():
4555
"""
4656
Print blank lines on a successfully formed number.
4757
"""
48-
pass
58+
print('--------------------------------------')
59+
for _ in range(20):
60+
print()
4961

5062

5163
def get_number():
5264
"""
53-
Ask the user for their number.
65+
Ask the user for their number and retrieve that number.
66+
5467
:return: str
5568
"""
56-
pass
69+
user_input = input('Please enter your 5 digit number here:\n\n')
70+
if is_good_number(user_input):
71+
return user_input
72+
return error_message()
5773

5874

5975
def report_results(user_number, secret_number):
6076
"""
6177
Report how many digits are correct.
6278
Report how many digits are in correct position.
6379
80+
:param user_number: str
81+
:param secret_number: str
6482
:return: tuple
6583
66-
>>> report_results(54321, 12345)
67-
(5, 0)
84+
>>> report_results('54321', '12345')
85+
(5, 1)
86+
>>> report_results('25314', '23514')
87+
(5, 3)
6888
"""
69-
return 5, 0
70-
pass
89+
correct_digits = 0
90+
correct_pos_digits = 0
91+
92+
for digit in user_number:
93+
if digit in secret_number:
94+
correct_digits += 1
95+
96+
for i in range(len(user_number)):
97+
if user_number[i] == secret_number[i]:
98+
correct_pos_digits += 1
99+
100+
return correct_digits, correct_pos_digits
71101

72102

73103
def player_progress(num_of_guesses, user_guess, correct_digits, correct_pos_digits):
@@ -126,15 +156,41 @@ def guesses_exceeded(allowed_guesses, num_of_guesses):
126156
>>> guesses_exceeded(5, 6)
127157
Allowed guesses: 5
128158
Used guesses: 6
129-
You have exceeded your limit of guesses, you lose!
159+
You have exceeded your limit of guesses and you still did not get it correct, you lose!
130160
"""
131161

132162
print('Allowed guesses: {}'.format(allowed_guesses))
133163
print('Used guesses: {}'.format(num_of_guesses))
134-
print('You have exceeded your limit of guesses, you lose!')
164+
print('You have exceeded your limit of guesses and you still did not get it correct, you lose!')
165+
166+
167+
def win(user_number, secret_number):
168+
return report_results(user_number, secret_number)[1] == len(secret_number)
169+
170+
171+
def main():
172+
"""
173+
Number guessing game logic
174+
"""
175+
max_guesses = int(input('Enter the max number of allowed guesses: '))
176+
secret_number = get_number()
177+
num_of_guesses = 0
178+
blank_lines()
179+
while (input('Press Q or q to quit, anything else to continue playing: ').lower()) != 'q':
180+
guess = get_number()
181+
num_of_guesses += 1
182+
correct_digits, correct_pos_digits = report_results(guess, secret_number)
183+
player_progress(num_of_guesses, guess, correct_digits, correct_pos_digits)
184+
185+
if win(guess, secret_number):
186+
return success_message(num_of_guesses)
187+
188+
if num_of_guesses > max_guesses:
189+
return guesses_exceeded(max_guesses, num_of_guesses)
135190

136191

137192
if __name__ == '__main__':
138193
import doctest
139194

140195
doctest.testmod()
196+
main()

0 commit comments

Comments
 (0)