Найти - Пользователи
Полная версия: Доусон Паника в пиццерии
Начало » Python для новичков » Доусон Паника в пиццерии
1
Radeko
Все доброго дня! Изучаю 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()

Вот код, значение считывается, но только один раз, а как сделать чтобы значение считывалось постоянно с value, не могу понять(((
PEHDOM
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
вы создаете в методе новый экземпрял Pan() с дефолнтым значением score, и его же считваете. Никакого отношение к score которое на экране это значение не имеет.
Cделайте так чтобы оно считывало значение с the_pan = Pan() обьявленого в main()
Самый быстрый и простой для этого способ:

убрать the_pan = Pan() в def update_lvl(self):
убрать main()
def main() заменить на if __name__ == ‘__main__’:

хотя это и неправильно, но в вашем случае работать будет.


xam1816
Присоединяюсь к выше сказанному
как вариант можно так сделать
 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()
FishHook
А почему вообще объект Pizza имеет метод end_game?
Почему функция update_lvl не апдейтит левел?
Почему update_lvl является частью Chef, хотя внутри функции не используется ссылка на этот объект?
Почему функция check_drop не чекает дроп, а “меньшает интервал ожидания на единицу”?
Какую смысловую нагрузку несет the? the_chef = Chef(the_pan)
Почему games.init вынесен из функции main?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB