-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhangman.py
131 lines (96 loc) · 3.75 KB
/
hangman.py
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import random
class HangmanGame:
def __init__(self, allowed_guesses=5):
self.game_finished = False
self.allowed_guesses = allowed_guesses
self.incorrect_guesses_made = 0
self.guessed_letters = set()
self.word_to_guess = ""
self.current_guess = ""
def setup(self):
self.game_finished = False
self.incorrect_guesses_made = 0
self.guessed_letters = set()
self.get_word_to_guess()
def get_possible_words(self):
return "Monkey", "Banana", "Cacao", "Dance", "Elephant"
def get_word_to_guess(self, possible_words=None):
POSSIBLE_WORDS = self.get_possible_words()
if possible_words is None:
self.word_to_guess = random.choice(POSSIBLE_WORDS).lower()
else:
self.word_to_guess = random.choice(possible_words).lower()
def check_guess(self):
return self.current_guess in self.word_to_guess
def win_or_loss_msg(self, msg):
win_or_loss_message = f"{msg}{self.word_to_guess}"
print(win_or_loss_message)
quit()
def check_game_won(self):
for letter in self.word_to_guess:
if letter not in self.guessed_letters:
return
self.win_or_loss_msg("You won! The secret word was ")
def check_game_over(self):
if self.incorrect_guesses_made == self.allowed_guesses:
self.win_or_loss_msg("Game over! The secret word was ")
def correct_guess(self):
correct_msg = f"{self.current_guess.upper()} is in the secret word.\n"
print(correct_msg)
self.check_game_won()
def incorrect_guess(self):
incorrect_msg = f"{self.current_guess.upper()} is not in the secret word.\n"
print(incorrect_msg)
self.incorrect_guesses_made += 1
self.check_game_over()
def check_valid(self, guess):
is_alpha = guess.isalpha()
if len(guess) != 1 or not is_alpha:
print("\nPlease guess a single valid letter.")
return False
if guess in self.guessed_letters:
print(f"\nYou've already guessed '{guess}'. Try a different letter.")
return False
return True
def make_guess(self):
while True:
guess = input("Guess a letter or write 'q' to quit: ").lower()
if guess == "q":
quit()
is_guess_valid = self.check_valid(guess)
if is_guess_valid is not False:
self.current_guess = guess
self.guessed_letters.add(guess)
break
check_guess = self.check_guess()
if check_guess:
self.correct_guess()
else:
self.incorrect_guess()
self.display_current_state()
def display_current_state(self):
word_info = f"The secret word is {len(self.word_to_guess)} characters long."
print(word_info)
if len(self.guessed_letters) > 0:
letters_guessed = "You have guessed these letters:"
print(letters_guessed, *sorted(tuple(self.guessed_letters)))
wrong_guess = f"You have guessed wrong {self.incorrect_guesses_made} times."
print(wrong_guess)
guesses_left = (
f"You have {self.allowed_guesses - self.incorrect_guesses_made}"
" guesses left."
)
print(guesses_left)
self.make_guess()
def main():
game = HangmanGame()
answer = input("Guess a letter or write q to quit the game: ")
is_guess_valid = game.check_valid(answer)
if is_guess_valid:
while answer != "q":
game.setup()
while game.game_finished is not True:
game.display_current_state()
game.make_guess()
if __name__ == "__main__":
main()