@@ -14,60 +14,90 @@ def is_good_number(number):
14
14
Let's a user know whether a number is properly formed.
15
15
Each number should be 5 digits long and should not repeat numbers.
16
16
17
- :param number: int
17
+ :param number: str
18
18
:return: boolean
19
19
20
- >>> is_good_number(12345)
20
+ >>> is_good_number(' 12345' )
21
21
True
22
- >>> is_good_number(55432)
22
+ >>> is_good_number(' 55432' )
23
23
False
24
- >>> is_good_number(444)
24
+ >>> is_good_number(' 444' )
25
25
False
26
26
"""
27
- if not number :
27
+ try :
28
+ int (number )
29
+ except ValueError :
30
+ error_message ()
31
+
32
+ if not int (number ):
28
33
return False
29
- if len (str (number )) != 5 :
34
+
35
+ elif len (number ) != 5 :
30
36
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 :
33
40
return False
41
+
34
42
return True
35
43
36
44
37
45
def error_message ():
38
46
"""
39
47
Print an error message based on an ill formed number.
40
48
"""
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 ()
42
52
43
53
44
54
def blank_lines ():
45
55
"""
46
56
Print blank lines on a successfully formed number.
47
57
"""
48
- pass
58
+ print ('--------------------------------------' )
59
+ for _ in range (20 ):
60
+ print ()
49
61
50
62
51
63
def get_number ():
52
64
"""
53
- Ask the user for their number.
65
+ Ask the user for their number and retrieve that number.
66
+
54
67
:return: str
55
68
"""
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 ()
57
73
58
74
59
75
def report_results (user_number , secret_number ):
60
76
"""
61
77
Report how many digits are correct.
62
78
Report how many digits are in correct position.
63
79
80
+ :param user_number: str
81
+ :param secret_number: str
64
82
:return: tuple
65
83
66
- >>> report_results(54321, 12345)
67
- (5, 0)
84
+ >>> report_results('54321', '12345')
85
+ (5, 1)
86
+ >>> report_results('25314', '23514')
87
+ (5, 3)
68
88
"""
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
71
101
72
102
73
103
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):
126
156
>>> guesses_exceeded(5, 6)
127
157
Allowed guesses: 5
128
158
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!
130
160
"""
131
161
132
162
print ('Allowed guesses: {}' .format (allowed_guesses ))
133
163
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 )
135
190
136
191
137
192
if __name__ == '__main__' :
138
193
import doctest
139
194
140
195
doctest .testmod ()
196
+ main ()
0 commit comments