Задать вопрос
@OpenYouEyes20

Как создать новый ряд в PYTHON после удаления предыдущего?

В настоящее время выполняю упражнение из книги:
"Изучаем Python Программирование игр визуализация данных веб-приложения." - Эрик Мэтиз
Глава 13
13-3 . Капли: найдите изображение дождевой капли и создайте сетку из капель . Капли должны постепенно опускаться вниз и исчезать у нижнего края экрана .
13-4 . Дождь: измените свой код в упражнении 13-3, чтобы при исчезновении ряда капель у нижнего края экрана новый ряд появлялся у верхнего края и начинал падение .

С первым заданием я справился, все работает.
При выполнении второго дошел до второй части и не знаю, что делать. Программа запускается и когда капли достигают нижней части экрана выбивает ошибку:

TypeError: create_drop() missing 5 required positional arguments: 'ai_settings', 'screen', 'drops', 'drop_number', and 'row_number'

Если добавлю атрибуты в функцию create_drop() , ошибки продолжаются.

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

Всем заранее спасибо за ответы и помощь!
Код программы.

start_rain.py:

import pygame

from pygame.sprite import Group

import game_functions as gf

from settings import Settings

def run_game():

# Инициализирует приложение и создает объект экрана.
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Project Drops")
    bg_color = (230, 230, 230)
    drops = Group()
    gf.create_fleet(ai_settings,screen, drops)
# Запуск основного цикла программы.
    while True:
        # Отслеживание событий клавиатуры и мыши.
        gf.check_events(ai_settings, screen)
        gf.update_drops(ai_settings, drops)
        #"""Обновляет изображения на экране и отображает новый экран."""
        gf.update_screen(ai_settings, screen, drops)
run_game()


settings.py:

class Settings():
    #Класс для хранения всех настроек приложения
    def __init__(self):
      #Инициализирует настройки приложения
        # Параметры экрана
        self.screen_width = 800
        self.screen_height = 600
        self.bg_color = (230, 230, 230)
        self.drop_speed_factor = 1


game_functions.py:

import sys

import pygame

from drop import Drop

def get_number_rows(ai_settings, drop_height):
    #Определяет количество рядов, помещающихся на экране.
    available_space_y = (ai_settings.screen_height -  (3 * drop_height))
    number_rows = int(available_space_y / (2 * drop_height))
    return number_rows

def get_number_drops_x(ai_settings, drop_width):
    #Вычисляет количество капель в ряду.
    available_space_x = ai_settings.screen_width - 2 * drop_width
    number_drops_x = int(available_space_x / (2 * drop_width))
    return number_drops_x
def create_drop(ai_settings, screen, drops, drop_number,row_number):
    #Создает каплю и размещает ее в ряду."""
    drop = Drop(ai_settings, screen)
    drop_width = drop.rect.width
    drop.x = drop_width + 2 * drop_width * drop_number
    drop.rect.x = drop.x
    drop.rect.y = drop.rect.height + 2 * drop.rect.height * row_number
    drop.y = drop.rect.height + 2 * drop.rect.height * row_number
    drop.rect.y = drop.y
    drops.add(drop)

def create_fleet(ai_settings, screen, drops):
    #Создает ряд капель
    drop = Drop(ai_settings, screen)
    number_drops_x = get_number_drops_x(ai_settings, drop.rect.width)
    number_rows = get_number_rows(ai_settings,drop.rect.height)
    for row_number in range(number_rows):
        for drop_number in range(number_drops_x):
            create_drop(ai_settings, screen, drops, drop_number,
                row_number)

def check_keydown_events(event):
    #Реагирует на нажатие клавиш."""
   if event.key == pygame.K_q:
      sys.exit()

def check_events(ai_settings, screen):
    #Обрабатывает нажатия клавиш
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         sys.exit()
      elif event.type == pygame.KEYDOWN:
         check_keydown_events(event, ai_settings, screen)


def update_screen(ai_settings, screen,drops):
    # Обновляет изображения на экране и отображает новый экран.
    # При каждом проходе цикла перерисовывается экран.
   screen.fill(ai_settings.bg_color)
   drops.draw(screen)
# Отображение последнего прорисованного экрана.
   pygame.display.flip()

def check_fleet_edges(ai_settings,drops):
#Реагирует на достижение капли края экрана."""
    flag = False
    for drop in drops.sprites():
        if drop.check_edges():
           drop.remove(drops)
           flag = True
    if flag:
        create_drop()
        print("new drop create")


def update_drops(ai_settings,drops):
#Обновляет позиции всех капель в ряду.
    check_fleet_edges(ai_settings,drops)
    drops.update()


drop.py:

import pygame
from pygame.sprite import Sprite

class Drop(Sprite):
#Класс, представляющий одну каплю.
    def __init__(self, ai_settings, screen):
#Инициализирует каплю и задает ее начальную позицию.
        super().__init__()
        self.screen = screen
        self.ai_settings = ai_settings
# Загрузка изображения капли и назначение атрибута rect.
        self.image = pygame.image.load('/Users/имяфамиля/Desktop/drop_Project/image/drop.bmp')
        self.rect = self.image.get_rect()
# Каждый новая капля появляется в левом верхнем углу экрана.
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height
 # Сохранение точной позиции капли.
        self.y = float(self.rect.y)
        self.x = float(self.rect.x)

    def update(self):
   #Перемещает  капли вниз."""
        self.y += self.ai_settings.drop_speed_factor
        self.rect.y = self.y

    def check_edges(self):
    #"""Возвращает True, если капли находятся внизу экрана."""
        screen_rect = self.screen.get_rect()
        if self.rect.bottom >= screen_rect.bottom:
            return True

размер изображения 30 на 30

Жду ваших ответов!
  • Вопрос задан
  • 141 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@YariKartoshe4ka
А почему вы создаете 1 каплю, если вам нужен новый ряд?
create_fleet(ai_settings, screen, drops)
вместо
create_drop()
Ну и проверьте, чтобы функция check_fleet_edges принимала screen
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@OpenYouEyes20 Автор вопроса
create_fleet(ai_settings, screen, drops)
вместо
create_drop()
Так же добавить в check_fleet_edges, update_drops чтобы принимала screen
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы