-
Notifications
You must be signed in to change notification settings - Fork 0
/
ch11_pizza_panic.py
136 lines (106 loc) · 5.05 KB
/
ch11_pizza_panic.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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Паница в пиццерии
# Игрок должен ловить падающую пиццу, пока она не достигла земли
from superwires import games, color
import random
games.init(screen_width=640, screen_height=480, fps=50)
class Pan(games.Sprite):
"""Сковорода, в которую игрок может ловить падающую пиццу"""
image = games.load_image("pan.bmp")
def __init__(self):
"""Инициализирует объект Pan и создаёт объект Text для отображения счёта"""
super(Pan, self).__init__(image=Pan.image,
x=games.mouse.x,
bottom=games.screen.height)
self.score = games.Text(value=0,
size=25,
color=color.black,
top=5,
right=games.screen.width-10)
games.screen.add(self.score)
def update(self):
"""Передвигает объект по горизонтали в точку с абциссой, как у указателя мыши"""
self.x = games.mouse.x
if self.left < 0:
self.left = 0
if self.right > games.screen.width:
self.right = games.screen.width
self.check_catch()
def check_catch(self):
"""Проверяет, поймал ли игрок падающую пиццу"""
for pizza in self.overlapping_sprites:
self.score.value += 10
self.score.right = games.screen.width - 10
pizza.handle_caught()
class Pizza(games.Sprite):
"""Круги пиццы, падающие на землю"""
image = games.load_image("pizza.bmp")
speed = 1
def __init__(self, x, y=90):
"""Инициализирует объект Pizza"""
super(Pizza, self).__init__(image=Pizza.image,
x=x,
y=y,
dy=Pizza.speed)
def update(self):
"""Проверяет, не коснулась ли нижняя кромка спрайта нижней границы экрана"""
if self.bottom > games.screen.height:
self.end_game()
self.destroy()
def handle_caught(self):
"""Разрушает объект, пойманный игроком"""
self.destroy()
def end_game(self):
"""Завершает игру"""
end_message = games.Message(value="Game Over",
size=90,
color=color.red,
x=games.screen.width/2,
y=games.screen.height/2,
lifetime=5*games.screen.fps,
after_death=games.screen.quit)
games.screen.add(end_message)
class Chef(games.Sprite):
"""Кулинар, который, двигаясь влево-вправо, разбрасывает пиццу"""
image = games.load_image("chef.bmp")
def __init__(self, y=55, speed=2, odds_change=200):
"""Инициализирует объект Chef"""
super(Chef, self).__init__(image=Chef.image,
x=games.screen.width/2,
y=y,
dx=speed)
self.odds_change = odds_change
self.time_til_drop = 0
def update(self):
"""Определяет, надо ли сменить направление"""
if self.left < 0 or self.right > games.screen.width:
self.dx = -self.dx
elif random.randrange(self.odds_change) == 0:
self.dx = -self.dx
self.check_drop()
def check_drop(self):
"""Уменьшает интервал ожидания на единицу или сбрасывает очередную пиццу
и восстанавливает исходный интервал"""
if self.time_til_drop > 0:
self.time_til_drop -= 1
else:
new_pizza = Pizza(x=self.x)
games.screen.add(new_pizza)
# вне зависимости от скорости падения пиццы "зазор" между падающими
# кругами принимается равным 30% каждого из них по высоте
self.time_til_drop = int(new_pizza.height * 1.3 / Pizza.speed) + 1
def main():
"""Собственно игровой процесс"""
wall_image = games.load_image("wall.jpg", transparent=False)
games.screen.background = wall_image
the_chef = Chef()
games.screen.add(the_chef)
the_pan = Pan()
games.screen.add(the_pan)
games.mouse.is_visible = False
games.screen.event_grab = False
games.screen.mainloop()
# начнём!
if __name__ == "__main__":
main()