@@ -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
3745def 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
4454def 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
5163def 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
5975def 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
73103def 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
137192if __name__ == '__main__' :
138193 import doctest
139194
140195 doctest .testmod ()
196+ main ()
0 commit comments