Загрузка данных


from pgzero.rect import Rect
from pgzero_api_stub import *
from pgzero.actor import Actor
import random
import time
import pgzrun
from pgzhelper import *
WIDTH = 800
HEIGHT = 600
TITLE = "Fruit Ninja"

bg=(0, 255, 255)
BLADE_COLOR = (255, 0, 255)

background = 'back1.png'

fruits = []
blade = []
score = 0


def create_fruit():
    """Создает новый фрукт"""
    fruit_types = ['banana', 'mango', 'apple']  # Список типов фруктов
    if random.random() < 0.1:
        fruit_type = 'bomb'
    else:
        fruit_type = random.choice(fruit_types)
    fruit = Actor(fruit_type)
    fruit.scale = 0.9  # Уменьшаем размер фрукта
    fruit.x = random.randint(100, WIDTH - 100)
    fruit.y = HEIGHT + 50
    fruit.speed = random.randint(5, 10)
    fruit.type = fruit_type
    fruit.sliced = False
    fruit.radius = 30
    fruit.angle = random.uniform(0, 360)
    fruit.rotation_speed = random.uniform(-3, 3)
    return 

def update_fruit(fruit):
    """Обновляет позицию и вращение фрукта"""
    if not fruit.sliced:
        fruit.y -= fruit.speed
        fruit.angle = (fruit.angle + fruit.rotation_speed) % 360  # обновляем угол
    else:
        if fruit.type == 'bomb':
            pass # Бомба не двигается после взрыва 
        else:
            fruit.y += fruit.speed * 0.8
            fruit.x += fruit.speed * 0.5 * (1 if random.random() > 0.5 else -1)
    return fruit

def draw():
    screen.fill(bg)
    screen.blit(background,(0,0))

    for fruit in fruits:
        fruit.draw()

    screen.draw.text(
            str(score),
            (10,10),
            fontsize=40,
            color="white")
    
        # Рисуем след лезвия
    if len(blade) > 1:            # Проверяем, что в списке blade есть хотя бы две точки
        for i in range(1, len(blade)):   # Проходим по всем точкам, начиная со второй
            screen.draw.line(blade[i-1], blade[i], BLADE_COLOR)    # Рисуем линию между текущей и предыдущей точкой следа

def update():
    global score
    for fruit in list(fruits):
        update_fruit(fruit)
        if fruit.y < - 50:
            sounds.critical.play()
            fruits.remove(fruit)
    if random.random() < 0.03:
        fruits.append(create_fruit())

        # Проверяем разрезание
    if len(blade) > 1:
        for fruit in list(fruits):
            if not fruit.sliced:
                for i in range(1, len(blade)):
                    if (abs(blade[i][0] - fruit.x) < fruit.radius and
                        abs(blade[i][1] - fruit.y) < fruit.radius):
                        fruit.sliced = True
                        if fruit.type == 'bomb':
                            sounds.asterisk.play()
                        else:
                            score +=  10 
                            sounds.asterisk.play()
                        break
    

# Функция, вызываемая при движении мыши
def on_mouse_move(pos):
    blade.append(pos)    # Добавляем текущую позицию мыши в список следа лезвия
    if len(blade) > 23:   
        blade.pop(0)     # Удаляем первую точку, если длина следа превышает 20

pgzrun.go()