-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgame.py
93 lines (76 loc) · 2.94 KB
/
game.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
import pygame
from dictionary import Dictionary
from player import Player
from enemy import Enemy
from renderer import Renderer
from levels import enemies
class Game:
WORDS_COUNT = 3
def __init__(self):
self.player = Player()
self.enemy = enemies.pop(0)
self.dictionary = Dictionary()
self.win = False
self.loss = False
self.words = [self.dictionary.get() for i in range(Game.WORDS_COUNT)]
self.letters = []
self.renderer = Renderer()
def draw(self):
if self.win:
self.renderer.render_win_screen()
elif self.loss:
self.renderer.render_loss_screen()
else:
self.renderer.draw_background()
self.renderer.render_words(self.words, self.get_valid_words(self.letters), len(self.letters))
self.renderer.render_player_health_bar(self.player.max_health, self.player.health)
self.renderer.render_enemy_health_bar(self.enemy.max_health, self.enemy.health, self.enemy.name)
self.renderer.render_experience_bar(4, self.player.experience)
self.renderer.render_time_bar(self.enemy.damage_time, int(self.enemy.timer() * 1000))
def tick(self, events):
if self.enemy.health <= 0:
if len(enemies) > 0:
self.enemy = enemies.pop(0)
self.player.experience += 1
else:
self.win = True
if self.player.health <= 0:
self.loss = True
if not self.loss and not self.win:
self.enemy.process_channeling(self.player)
for event in events:
if event.type == pygame.KEYUP:
self.handle_key(event.key)
def handle_key(self, key):
letter = self.get_letter(key)
if letter:
self.handle_new_letter(letter)
def handle_new_letter(self, letter):
new_letters = self.letters + [letter]
valid_words = self.get_valid_words(new_letters)
if valid_words:
complete_words = self.get_completed_words(new_letters)
if complete_words:
self.letters = []
self.word_completed(complete_words)
else:
self.letters = new_letters
def get_valid_words(self, letters):
return [x for x in self.words if x.is_valid(letters)]
def get_completed_words(self, letters):
return [x for x in self.words if x.is_complete(letters)]
@staticmethod
def get_letter(key):
if 97 <= key <= 122:
return chr(key)
return None
def word_completed(self, words):
if type(words) != list:
words = [words]
for word in words:
self.enemy.hit(word.damage(self.player.base_damage), self.player)
self.words.remove(word)
self.fill_words()
def fill_words(self):
while len(self.words) < Game.WORDS_COUNT:
self.words.append(self.dictionary.get())