-
Notifications
You must be signed in to change notification settings - Fork 0
/
hangman.py
215 lines (200 loc) · 7.77 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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
###########################################
# Author: Andrej Jezik #
# email: [email protected] #
###########################################
import random
from kivy.app import App
from kivy.core.window import Window
from kivy.animation import Animation
from kivy.uix.widget import Widget
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.properties import ObjectProperty
from kivy.config import Config
from kivy.clock import Clock
Config.set('graphics', 'width', '600')
Config.set('graphics', 'height', '550')
#----------------------------------
#pick random word/s frrom the file
#----------------------------------
def getWordToGuess():
guess_words_f = open("guess_words.txt", "r")
random_row = random.choice(guess_words_f.readlines())
random_row = random_row.replace('\n', '')
return random_row
def getWordProgress(word_to_guess,l_word_to_guess):
word_progress = ""
count = 0
while l_word_to_guess > count:
if word_to_guess[count] == " ":
word_progress = word_progress + " "
else:
word_progress = word_progress + "-"
count =count + 1
return word_progress
#----------------------------------
#initial setup
#----------------------------------
cooldown = 10 #number of fails before player looses
success = 0 #indicator, if player won 1
img_id = 1 #which img is shown in app
points = 0
level = 0
word_to_guess = getWordToGuess()
l_word_to_guess = len(word_to_guess)
word_progress = getWordProgress(word_to_guess,l_word_to_guess)
#----------------------------------
#updates string after guess (repeates each round)
#----------------------------------
def displayProgress(word_to_guess, word_progress, guess= "\n"):
success = 0 #if player hits right character
cooldown_flag = 0 #decides wheter cooldown should be decremented or not
l_word_to_guess = len(word_to_guess)
#----------------------------------
#if player tries to guess whole word
#----------------------------------
if guess != "\n" and len(guess) > 1:
if guess == word_to_guess:
print("you won")
return word_progress, success, cooldown_flag, "true"
else:
print("U have lost... could wait a little longer")
return word_progress, success, cooldown_flag, "false"
#----------------------------------
#if player guesses one character
#----------------------------------
elif guess != '\n' and len(guess) == 1:
tmp = ""
count = 0
while l_word_to_guess > count:
if word_to_guess[count] == guess[0]:
tmp = tmp + word_to_guess[count]
cooldown_flag = 1
else:
tmp = tmp + word_progress[count]
count = count + 1
word_progress = tmp
print("current progress: " ,word_progress)
return word_progress, success, cooldown_flag, "nothing"
class HangmanGrid(Widget):
def __init__(self, **kwargs):
super(HangmanGrid, self).__init__(**kwargs)
Window.bind(on_key_down=self._keydown)
#enter to submit acction
def _keydown(self,*args):
if args[1] == 13:
self.gameRound()
#focus on text input
else:
if self.guess.focus != True:
self.guess.focus = True
self.guess.text = self.guess.text+ str(args[3])
def animate(self, instance):
animation = Animation(pos=(0, 5), t='out_bounce',duration= 0.2)
animation += Animation(pos=(0, 0), t='out_bounce',duration= 0.2)
animation.start(instance)
def update_word_progress(self):
global word_progress
self.progress.text = word_progress
guess = ObjectProperty(None)
progress = ObjectProperty()
main_button = ObjectProperty()
#----------------------------------
#main game loop
#----------------------------------
def gameRound(self):
global cooldown
global l_word_to_guess
global word_progress
global word_to_guess
global points
global level
change_img = 0
#----------------------------------
#new round init
#----------------------------------
if self.button_l.text == "you won" or self.button_l.text == "you lost":
word_to_guess = getWordToGuess()
l_word_to_guess = len(word_to_guess)
word_progress = getWordProgress(word_to_guess,l_word_to_guess)
self.image.source = 'img/1.png'
cooldown = 10
if points < 0:
points = 0
level = 0
else:
level = level + 1
self.points.text = str(points)
self.level.text =str(level)
self.wrong_letters.text = ""
if self.button_l.text != "Submit":
self.button_l.text = "Submit"
self.update_word_progress()
return
#----------------------------------
#reading from GUI input
#----------------------------------
guess_string = self.guess.text
if guess_string == "":
return
self.guess.text = ""
#----------------------------------
#user can guess if cooldown > 0
#----------------------------------
if cooldown > 0:
global img_id
word_progress , success, cooldown_flag,final= displayProgress(word_to_guess, word_progress, guess_string )
if final == "true":
word_progress = word_to_guess
self.update_word_progress()
self.button_l.text = "you won"
img_id = 1
points = points + cooldown
self.points.text = str(points)
return
elif final == "false":
self.button_l.text = "you lost"
img_id = 1
points = points - 8
self.points.text = str(points)
return
if cooldown_flag == 0:
cooldown = cooldown - 1
self.wrong_letters.text = self.wrong_letters.text + guess_string +", "
count = 0
missing = 0
change_img = 1
while l_word_to_guess > count:
if word_progress[count] == '-':
missing = 1
if word_to_guess[count] == guess_string[0]:
change_img = 0
count = count +1
self.update_word_progress()
if success == 1 or missing == 0:
self.button_l.text = "you won"
img_id = 1
points = points + cooldown
self.points.text = str(points)
return
else:
self.button_l.text = "you lost"
img_id = 1
points = points - 8
self.points.text = str(points)
return
#----------------------------------
#switchng images of hangman
#----------------------------------
if change_img == 1:
img_id = img_id + 1
self.image.source = 'img/' + str(img_id) + '.png'
if img_id == 11:
img_id = 1
class Hangman(App):
def build (self):
return HangmanGrid()
if __name__ == "__main__":
Hangman().run()