1
+ import sys
2
+ def welcome_Screen ():
3
+ """
4
+ Print the logo and number of attempts.
5
+
6
+ :param None
7
+ :return: None
8
+ :rtype: None
9
+ """
10
+
11
+ HANGMAN_GAME_LOGO = """
12
+ __ __ ___ .__ __. _______ .___ ___. ___ .__ __. _______ ___ .___ ___. _______
13
+ | | | | / \ | \ | | / _____|| \/ | / \ | \ | | / _____| / \ | \/ | | ____|
14
+ | |__| | / ^ \ | \| | | | __ | \ / | / ^ \ | \| | | | __ / ^ \ | \ / | | |__
15
+ | __ | / /_\ \ | . ` | | | |_ | | |\/| | / /_\ \ | . ` | | | |_ | / /_\ \ | |\/| | | __|
16
+ | | | | / _____ \ | |\ | | |__| | | | | | / _____ \ | |\ | | |__| | / _____ \ | | | | | |____
17
+ |__| |__| /__/ \__\ |__| \__| \______| |__| |__| /__/ \__\ |__| \__| \______| /__/ \__\ |__| |__| |_______|
18
+ """
19
+ print (HANGMAN_GAME_LOGO )
20
+ MAX_TRIES = 6
21
+ print (f"you have { MAX_TRIES } guess" )
22
+
23
+ def choose_word (file_path , index ):
24
+ """
25
+ the function return the secret word for guessing.
26
+
27
+ :param file_path: A string representing a path to a text file containing space-separated words
28
+ :param index: Position of a particular word in the file
29
+ :return: the secret word for guessing
30
+ :rtype: str
31
+ """
32
+ # open the file at read mode and read the words from the file
33
+ while True : # check if user file_path correct
34
+ try :
35
+ with open (file_path , 'r' ) as file :
36
+ words = file .read ().split ()
37
+ # take the secret word
38
+ while True : # check if user index is correct
39
+ try :
40
+ secret_word = words [(int (index ) - 1 ) % len (words )]
41
+ return secret_word
42
+ except ValueError :
43
+ print (f"sorry, { index } is not a corret index. Please try again!" )
44
+ sys .exit ()
45
+
46
+ except :
47
+ print (f"sorry, { file_path } is not a corret file name. Please try again!" )
48
+ sys .exit ()
49
+
50
+ def print_hangman (num_of_tries ):
51
+ """Prints the value of the key given as paramter.
52
+
53
+ :param num_of_tries: a key for the dict(HANGMAN_PHOTOS)
54
+ :type num_of_tries: int
55
+ :return: None
56
+ """
57
+
58
+ HANGMAN_PHOTOS = {
59
+ 1 : """ x-------x""" ,
60
+ 2 : """ x-------x
61
+ |
62
+ |
63
+ |
64
+ |
65
+ |""" ,
66
+ 3 : """ x-------x
67
+ | |
68
+ | 0
69
+ |
70
+ |
71
+ |""" ,
72
+ 4 : """ x-------x
73
+ | |
74
+ | 0
75
+ | |
76
+ |
77
+ |""" ,
78
+ 5 : """ x-------x
79
+ | |
80
+ | 0
81
+ | /|\\
82
+ |
83
+ |""" ,
84
+ 6 : """ x-------x
85
+ | |
86
+ | 0
87
+ | /|\\
88
+ | /
89
+ |""" ,
90
+ 7 : """ x-------x
91
+ | |
92
+ | 0
93
+ | /|\\
94
+ | / \\
95
+ |"""
96
+ }
97
+ hangman_status = HANGMAN_PHOTOS [num_of_tries ]
98
+ print (hangman_status )
99
+
100
+ def check_valid_input (letter_guessed , old_letters_guessed ):
101
+ """
102
+ A Boolean function that accepts a character and a list of letters
103
+ that the user has guessed previously. The function checks
104
+ two things: the correctness of the input and whether it is legal
105
+ to guess this letter (that is, the player has not guessed this letter before)
106
+ and returns true or false accordingly.
107
+
108
+ :param letter_guessed: character received from the user.
109
+ :type letter_guessed: str
110
+ :param old_letters_guessed: list contains the letters the player has guessed.
111
+ :type old_letters_guessed: list
112
+ :return: return True if it is a legal input, else return False
113
+ :rtype: bool
114
+ """
115
+ # if the character is not valid return false
116
+ if letter_guessed .isalpha () != True or len (letter_guessed ) > 1 :
117
+ return False
118
+ elif letter_guessed in old_letters_guessed : # if the character is not in the letters the player has guessed we return false
119
+ return False
120
+ else :
121
+ return True
122
+
123
+ def try_update_letter_guessed (letter_guessed , old_letters_guessed ):
124
+ """
125
+ The method checks if the character is correct
126
+ and if it is correct and does not exist in
127
+ the letters that the user guessed then it updates the list with
128
+ the new character and returns true otherwise it returns false
129
+
130
+ :param letter_guessed: character received from the user.
131
+ :type letter_guessed: str
132
+ :param old_letters_guessed: list contains the letters the player has guessed.
133
+ :type old_letters_guessed: list
134
+ :return: return True if it is a legal input, else return False
135
+ :rtype: bool
136
+ """
137
+ # check if the input is valid
138
+ if check_valid_input (letter_guessed , old_letters_guessed ) == False :
139
+ print ('X' )
140
+ old_letters_guessed = ' -> ' .join (sorted (old_letters_guessed ))
141
+ print (old_letters_guessed )
142
+ return False
143
+ else :
144
+ old_letters_guessed .append (letter_guessed )
145
+ return True
146
+
147
+ def show_hidden_word (secret_word , old_letters_guessed ):
148
+ """
149
+ A function that returns a string consisting of letters and underscores.
150
+
151
+ :param secret_word: word the user has to guess
152
+ :type secret_word: str
153
+ :param old_letters_guessed: list contains the letters the player has guessed.
154
+ :type old_letters_guessed: str
155
+ :return: reveal the secret word to the player in a lower-line structure
156
+ :rtype: str
157
+ """
158
+ # we making the result string by loop all the letters in the secret word
159
+ # and if the letter in the letters the user has guessed we add the letter to the result
160
+ # and if not we and _ to the result
161
+ result = ''
162
+ for letter in secret_word :
163
+ if letter in old_letters_guessed :
164
+ result += letter + ' '
165
+ else :
166
+ result += '_ '
167
+ return result
168
+
169
+ def check_win (secret_word , old_letters_guessed ):
170
+ """
171
+ This is a boolean function that returns true if all the letters that make up the secret word
172
+ are included in the list of letters that the user guessed. Otherwise, the function returns false.
173
+
174
+ :param secret_word: word the user has to guess
175
+ :param old_letters_guessed: list contains the letters the player has guessed.
176
+ :type secret_word: str
177
+ :type old_letters_guessed: list
178
+ :return: true if all the letters that make up the secret word are included int the list of old_letters_guessed otherwise return false
179
+ :rtype: bool
180
+ """
181
+ # looping all the letters in secret word if one of them not int the guessed word we return False otherwise we return True
182
+ for letter in secret_word :
183
+ if letter not in old_letters_guessed :
184
+ return False
185
+ return True
186
+
187
+ def main ():
188
+
189
+ # print the welcome screen
190
+ welcome_Screen ()
191
+ wrong_guess = 0
192
+ num_of_tries = 1
193
+ old_letters_guessed = list () # create an empty list for the beginning
194
+ # take from user the file path and index
195
+ file_path = input ("Enter file path: " )
196
+ index = input ("Enter index: " )
197
+ secret_word = choose_word (file_path , index )
198
+ print ("Let’s start!" )
199
+ print_hangman (num_of_tries )
200
+ print ("_ " * len (secret_word ))
201
+ # game loop
202
+ while wrong_guess in range (6 ):
203
+ # take user input
204
+ guessed_letter = input ("Guess a letter: " ).lower ()
205
+ # the main logic of the game
206
+ if try_update_letter_guessed (guessed_letter , old_letters_guessed ):
207
+ if guessed_letter not in secret_word :
208
+ wrong_guess += 1
209
+ num_of_tries += 1
210
+ print (":(" )
211
+ print_hangman (num_of_tries )
212
+ print (show_hidden_word (secret_word , old_letters_guessed ))
213
+ else :
214
+ print (show_hidden_word (secret_word , old_letters_guessed ))
215
+ if check_win (secret_word , old_letters_guessed ):
216
+ print ("WIN" )
217
+ break
218
+ if wrong_guess == 6 :
219
+ if check_win (secret_word , old_letters_guessed ):
220
+ print ("WIN" )
221
+ else :
222
+ print ("LOSE" )
223
+
224
+ if __name__ == "__main__" :
225
+ main ()
0 commit comments