Форум сайта python.su
1
Всем добрый день! Подскажите по циклу и сложением.
Есть вот такой цикл
while True: # Обработка нажатий клавиш. gf.check_event(pan) # Обновление сковороды. pan.update_pan() # Добавление пиццы в группу спрайтов. pizzas.add(pizza) for pizza in pizzas.sprites(): gf.update_pizza(pizza) if pizza.rect.y < ai_setting.game_height: gf.collisions_pizza(pan, pizzas, pizza) break else: pizza.pizza_random() # Рандомное выпадение пиццы. # Удаление пиццы вышедшей за экран. gf.pizza_delete(pizza, pizzas) # Обновление экрана. screen_game.blit(ai_setting.bg_fon, ai_setting.bg_rect) gf.update_screen(screen_game,ai_setting, pizzas, pan)
def collisions_pizza(pan, pizzas, pizza): score = 0 collisions = pygame.sprite.spritecollide(pan, pizzas, True) if collisions: score += 10 print (score)
Офлайн
73
Andrey_Golovinа как вы хотели? при каждом вызове функции переменная score = 0 задается внутри функции и выводится результат score += 10. это равносильно такой конструкции
При проходе цикла, print выводит 10, при повторном проходе тоже 10 а не 20
for collisions in range(1,10): score = 0 if collisions: score += 10 print (score)
Офлайн
1
marvellikНе совсем то, но натолкнули на решение. Спасибо!))
Офлайн
1
Не буду создавать новую тему. Помогите разобраться дальше с очками и удалением спрайта.
def collisions_pizza_pan(ai_setting, pan, pizzas, pizza, stats, sb): collisions = pygame.sprite.spritecollide(pan, pizzas, True) for pizza in collisions: if collisions: stats.score += ai_setting.points sb.prep_score() pizza.remove(pizzas)
Офлайн
1
Andrey_GolovinА нет удаляется. Но с очками беда 48 вместо 1.
Не буду создавать новую тему. Помогите разобраться дальше с очками и удалением спрайта.
Офлайн
73
а что в переменной ai_setting.points? в этой строке?
stats.score += ai_setting.points
def collisions_pizza(score): # (score,pan, pizzas, pizza) collisions = True #pygame.sprite.spritecollide(pan, pizzas, True) if collisions: score += 10 print (score) return score score = 0 score = collisions_pizza(score) score = collisions_pizza(score) score = collisions_pizza(score) score = collisions_pizza(score) print() score = 100 score = collisions_pizza(score) score = collisions_pizza(score) score = collisions_pizza(score) score = collisions_pizza(score)
10 20 30 40 110 120 130 140 >>>
Офлайн
1
marvellikai_setting.points - ai_setting конфигурационный файл, в нем переменная points = 1.
а что в переменной ai_setting.points? в этой строке?
Офлайн
1
#! /usr/bin/env python3 import sys import pygame from pygame.sprite import Sprite from pygame.sprite import Group from setting import Settings from pan import Pan from pizza import Pizza from chef import Chef from game_stats import GameStats from scoreboard import ScoreBoard import game_functions as gf # Инициализация экрана и создание игры. def rungame(): pygame.init() ai_setting = Settings() screen_game = pygame.display.set_mode( (ai_setting.game_width, ai_setting.game_height)) pygame.display.set_caption("Pizza") # Создание сковороды. pan = Pan(screen_game, ai_setting) # Создание пиццы. pizza = Pizza(screen_game, ai_setting) # Создание группы спрайтов. pizzas = Group() # Объявление переменной stats. stats = GameStats(ai_setting) # Вывод очков на экран. sb = ScoreBoard(ai_setting, screen_game, stats) chef = Chef(screen_game, ai_setting, pizza) """Основной цикл игры.""" while True: for pizza in pizzas.sprites(): if pizza.rect.y < ai_setting.game_height: gf.collisions_pizza_pan(ai_setting, pan, pizzas, pizza, stats, sb) break else: gf.pizza_chef_random(pizza, chef) # Обновление экрана. screen_game.blit(ai_setting.bg_fon, ai_setting.bg_rect) gf.update_screen(screen_game,ai_setting, pizzas, pan, pizza, stats, sb, chef) rungame()
#! /usr/bin/env python3 import pygame class Settings(): # Настройки игры. def __init__(self): # Разрешение экрана self.game_width = 640 self.game_height = 480 self.bg_fon = pygame.image.load("image/wall.jpg") self.bg_rect = self.bg_fon.get_rect(bottomright = (640, 480)) # Скорость перемещения сковороды. self.speed_pan = 3 # Скорость снижения пиццы self.pizza_drop_speed = 2 # Подсчет очков. self.points = 1
#! /usr/bin/env python3 import sys import pygame from pygame.sprite import Group from pan import Pan from pizza import Pizza from setting import Settings import random def update_pizzas(pizza): """Обновляет позицию пиццы.""" pizza.update_pizza() #def pizzas_rand_cickle(ai_setting, pan, pizzas, pizza, stats, sb, chef): #if pizza.rect.y < ai_setting.game_height: #collisions_pizza_pan(ai_setting, pan, pizzas, pizza, stats, sb) #else: #pizza_chef_random(pizza, chef) def pizza_chef_random(pizza, chef): """Рандомное появление пиццы.""" numbers = [0, 59, 118, 177, 236, 295, 354, 413, 472, 531, 590] rand_pizza = random.shuffle(numbers) rand_pizza x = random.choice(numbers) # Координаты появления пиццы. chef.rect.x = (x) chef.rect.y = (0) pizza.rect.x = (x) pizza.rect.y = (70) def check_event_keydown(event, pan): """Реагирует на нажатие клавиш.""" if event.key == pygame.K_RIGHT: pan.moving_right = True if event.key == pygame.K_LEFT: pan.moving_left = True def check_event_keyup(event, pan): """Реагирует на отпускание клавиш.""" if event.key == pygame.K_RIGHT: pan.moving_right = False if event.key == pygame.K_LEFT: pan.moving_left = False def check_event(pans): """Обрабатывает нажатие клавиш""" for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.KEYDOWN: check_event_keydown(event, pans) elif event.type == pygame.KEYUP: check_event_keyup(event, pans) def pizza_delete(pizza, pizzas): """Проверяет достигла ли пицца края экрана и удаляет её""" if pizza.rect.bottom >= pizza.screen_rect.bottom: pizza.remove(pizzas) print(len(pizzas)) def collisions_pizza_pan(ai_setting, pan, pizzas, pizza, stats, sb): collisions = pygame.sprite.spritecollide(pan, pizzas, True) for pizza in collisions: if collisions: stats.score += ai_setting.points sb.prep_score() pizza.update_pizza() break def update_screen(screen_game,ai_setting, pizzas, pan, pizza, stats, sb, chef): """Обновляет изображение на экране""" check_event(pan) chef.blitme() pizzas.draw(screen_game) update_pizzas(pizza) pan.blitme() pan.update_pan() # Обновление сковороды. pizza_delete(pizza, pizzas) # Удаление пиццы вышедшей за экран. pizzas.add(pizza) # Добавление пиццы в группу спрайтов. sb.show_score() # Вывод очков на экран. #pizzas_rand_cickle(ai_setting, pan, pizzas, pizza, stats, sb, chef) # Отображение последнего прорисованного экрана. pygame.display.flip()
#! /usr/bin/env python3 import pygame from pygame.sprite import Sprite class Pan(Sprite): """Инициализирует сковороду и задаёт её начальную позицию""" def __init__(self, screen_game, ai_setting): super(Pan, self).__init__() self.ai_setting = ai_setting self.screen_game = screen_game white = (255, 255, 255) # Загрузка изображения сковороды. self.image = pygame.image.load('image/pan1.bmp') self.image.set_colorkey(white) self.rect = self.image.get_rect() self.screen_rect = screen_game.get_rect() # Координаты сковороды. self.rect.x = (300) self.rect.y = (433) # Флаги перемещения сковороды. self.moving_right = False self.moving_left = False def update_pan(self): if self.moving_right and self.rect.right < self.screen_rect.right: self.rect.x += self.ai_setting.speed_pan if self.moving_left and self.rect.left > 0: self.rect.centerx -= self.ai_setting.speed_pan def blitme(self): self.screen_game.blit(self.image, self.rect)
#! /usr/bin/env python3 import pygame from pygame.sprite import Sprite import random class Pizza(Sprite): """Инициализирует пиццу""" def __init__(self, screen_game, ai_setting): super(Pizza, self).__init__() self.screen_game = screen_game self.ai_setting = ai_setting self.numbers = [0, 59, 118, 177, 236, 295, 354, 413, 472, 531, 590] self.rand_pizza = random.shuffle(self.numbers) white = (255, 255, 255) # Загрузка изображения пиццы. self.image = pygame.image.load('image/pizza.bmp') self.image.set_colorkey(white) self.rect = self.image.get_rect() self.screen_rect = screen_game.get_rect() self.rand_pizza self.x = random.choice(self.numbers) # Координаты появления пиццы. self.rect.x = (self.x) self.rect.y = (70) def update_pizza(self): self.rect.y += self.ai_setting.pizza_drop_speed def blitme(self): self.screen_game.blit(self.image, self.rect)
#! /usr/bin/env python3 class GameStats(): def __init__(self, ai_setting): self.ai_setting = ai_setting self.reset_stats() def reset_stats(self): self.score = 0
#! /usr/bin/env python3 import pygame.font class ScoreBoard(): """Класс для вывода игровой информации.""" def __init__(self, ai_setting, screen_game, stats): """Инициализирует атрибуты подсчета игры.""" self.ai_setting = ai_setting self.screen_rect = screen_game.get_rect() self.screen_game = screen_game self.stats = stats # Настройка шрифта для вывода на экран. self.text_color = (30, 30, 30) self.font = pygame.font.SysFont(None, 48) # Подготовка исходного изображения. self.prep_score() def prep_score(self): """Преобразование текущего счета в графическое изображение.""" score_str = str(self.stats.score) self.score_image = self.font.render(score_str, True, self.text_color, self.ai_setting.bg_fon) # Вывод счета в правой вехней части экрана. self.score_rect = self.score_image.get_rect() self.score_rect.right = self.screen_rect.right - 20 self.score_rect.top = 20 def show_score(self): """Выводит счет на экран.""" self.screen_game.blit(self.score_image, self.score_rect)
#! /usr/bin/env python3 import random import pygame from pygame.sprite import Sprite class Chef(Sprite): """Инициализирует пиццу""" def __init__(self, screen_game, ai_setting, pizza): super(Chef, self).__init__() self.screen_game = screen_game self.ai_setting = ai_setting blue = (8, 0, 181) # Загрузка изображения повара. self.image = pygame.image.load('image/chef.bmp') self.image.set_colorkey(blue) self.rect = self.image.get_rect() self.screen_rect = screen_game.get_rect() # Координаты появления пиццы. self.rect.x = (pizza.x) self.rect.y = (0) def blitme(self): self.screen_game.blit(self.image, self.rect)
Офлайн
1
Может кому пригодится!
for pizza in pizzas.sprites():
gf.update_pizza(pizza)
if pizza.rect.y < ai_setting.game_height:
gf.collisions_pizza(pan, pizzas, pizza)
break
else:
pizza.pizza_random()
Офлайн