Форум сайта python.su
0
Все доброго дня! Изучаю python по книге Майкла Доусона, дошел до главы с игрой “Паника в пиццерии”.
Там есть задание: увеличить сложность игры.
Сколько времени пытаюсь увеличить скорость падения пиццы при достижения определенного количества очков, ничего не выходит. Если есть кто-нибудь, кто проходил через это и нашел решение этой задачи, пожалуйста, покажите код, как это реализовывать. Когда я пытаюсь обратиться к переменной score.value его значение считывается только один раз.
Была уже тема аналогичная, но никаким толковым ответом она не закончилась.
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.jpg") def __init__(self): """ Инициализирует объект Раn и создает объект 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.jpg") def __init__(self, x, dy, y = 90): #Инициализирует объект Pizza. super(Pizza, self).__init__(image = Pizza.image, x = x, y = y, dy = dy) 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.png") 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 update_lvl(self): the_pan = Pan() if the_pan.score.value < 20: speedo = 1 return speedo if 20 <= the_pan.score.value <= 40: speedo = 2 return speedo if 40 <= the_pan.score.value: speedo = 3 return speedo def check_drop(self): """Уменьшает интервал ожидания на единицу или сбрасывает очередную пиццу и восстанавливает исходный интервал.""" if self.time_til_drop > 0: self.time_til_drop -= 1 else: new_pizza = Pizza(x = self.x, dy = self.update_lvl()) games.screen.add(new_pizza) #вне зависимости от скорости падения пиццы "зазор" между падающими кругами ринимается равным 30 % каждого из них по высоте self.time_til_drop = int(new_pizza.height * 1.3 / 1 + random.randint(1,40)) def main(): """ Собственно игровой процесс. """ wall_image = games.load_image("walls.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 = True games.screen.mainloop() main()
Отредактировано Radeko (Окт. 8, 2020 09:51:54)
Офлайн
294
Radekoвопрос :откуда вы считываете это значение?
значение считывается, но только один раз, а как сделать чтобы значение считывалось постоянно с value, не могу понять(((
def update_lvl(self): the_pan = Pan() if the_pan.score.value < 20: speedo = 1 return speedo if 20 <= the_pan.score.value <= 40: speedo = 2 return speedo if 40 <= the_pan.score.value: speedo = 3 return speedo
[code python][/code]
Отредактировано PEHDOM (Окт. 8, 2020 12:51:47)
Офлайн
124
Присоединяюсь к выше сказанному
как вариант можно так сделать
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.jpg") def __init__(self): """ Инициализирует объект Раn и создает объект 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.jpg") def __init__(self, x, dy, y=90): # Инициализирует объект Pizza. super(Pizza, self).__init__(image=Pizza.image, x=x, y=y, dy=dy) 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.png") def __init__(self,the_pan, y=55, speed=2, odds_change=200): self.the_pan = the_pan """Инициализирует объект 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 update_lvl(self,the_pan): if the_pan.score.value < 20: speedo = 1 return speedo if 20 <= the_pan.score.value <= 40: speedo = 2 return speedo if 40 <= the_pan.score.value: speedo = 3 return speedo def check_drop(self): """Уменьшает интервал ожидания на единицу или сбрасывает очередную пиццу и восстанавливает исходный интервал.""" if self.time_til_drop > 0: self.time_til_drop -= 1 else: new_pizza = Pizza(x=self.x, dy=self.update_lvl(self.the_pan)) games.screen.add(new_pizza) # вне зависимости от скорости падения пиццы "зазор" между падающими кругами ринимается равным 30 % каждого из них по высоте self.time_til_drop = int(new_pizza.height * 1.3 / 1 + random.randint(1, 40)) def main(): """ Собственно игровой процесс. """ wall_image = games.load_image("walls.jpg", transparent=False) games.screen.background = wall_image the_pan = Pan() games.screen.add(the_pan) the_chef = Chef(the_pan) games.screen.add(the_chef) games.mouse.is_visible = False games.screen.event_grab = True games.screen.mainloop() main()
Офлайн
568
А почему вообще объект Pizza имеет метод end_game?
Почему функция update_lvl не апдейтит левел?
Почему update_lvl является частью Chef, хотя внутри функции не используется ссылка на этот объект?
Почему функция check_drop не чекает дроп, а “меньшает интервал ожидания на единицу”?
Какую смысловую нагрузку несет the? the_chef = Chef(the_pan)
Почему games.init вынесен из функции main?
Офлайн