Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 1, 2019 16:54:30

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

Всем добрый день! Подскажите по циклу и сложением.
Есть вот такой цикл

     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)
При проходе цикла, print выводит 10, при повторном проходе тоже 10 а не 20.

Офлайн

#2 Фев. 1, 2019 18:14:50

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

Andrey_Golovin
При проходе цикла, print выводит 10, при повторном проходе тоже 10 а не 20
а как вы хотели? при каждом вызове функции переменная score = 0 задается внутри функции и выводится результат score += 10. это равносильно такой конструкции
 for collisions in range(1,10):
    score = 0
    if collisions:
        score += 10
        print (score)
где вместо цикла ваша функция вызываемая каждый раз

Офлайн

#3 Фев. 1, 2019 20:56:20

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

marvellik
Не совсем то, но натолкнули на решение. Спасибо!))

Офлайн

#4 Фев. 2, 2019 19:37:52

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

Не буду создавать новую тему. Помогите разобраться дальше с очками и удалением спрайта.

 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)
Есть функция, переменная collisions определяет коллизию и должна удалять из группы pizzas спрайт, но не удаляет.
Добавил строку pizza.remove(pizzas) но все равно не удаляется.
stats.score += ai_setting.points в той строке прибавляются очки, но должно прибавится 1 очко, а прибавляется 48.
Что я делаю не так?
могу скинуть весь код.

Офлайн

#5 Фев. 2, 2019 20:01:19

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

Andrey_Golovin
Не буду создавать новую тему. Помогите разобраться дальше с очками и удалением спрайта.
А нет удаляется. Но с очками беда 48 вместо 1.

Офлайн

#6 Фев. 2, 2019 22:47:39

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

а что в переменной ai_setting.points? в этой строке?

 stats.score += ai_setting.points
вот там наверно не 1 а какое то возрастающее при каждом вызове функции число
тогда явно прибавляйте 1
stats.score += 1 по обрывку сложно судить что к чему

 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
>>>

Офлайн

#7 Фев. 3, 2019 06:52:24

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

marvellik
а что в переменной ai_setting.points? в этой строке?
ai_setting.points - ai_setting конфигурационный файл, в нем переменная points = 1.

Офлайн

#8 Фев. 3, 2019 06:58:16

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

 #! /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)
Вот Весь код.

Офлайн

#9 Фев. 4, 2019 09:45:39

Andrey_Golovin
Зарегистрирован: 2018-01-27
Сообщения: 35
Репутация: +  1  -
Профиль   Отправить e-mail  

Почему очки не прибавляются?

Может кому пригодится!

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.collisions_pizza(pan, pizzas, pizza) В else. И заработало как надо. Не думаю что это выход
Но как альтернатива.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version