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


import pygame
import pygame as pg
from random import randint

from pygame.sprite import groupcollide

from gesture import Gesture
import pygame_menu
pg.init()
person = 0
enemy = 0
SCREEN_WIDTH = 900
SCREEN_HEIGHT = 550
FPS = 60
persons = ['fire wizard', 'lightning wizard', 'earth monk']
g = Gesture()
frame = 0
font = pg.font.Font(None, 40)
mode = 'menu'

def load_image(file, width, height):
    image = pg.image.load(file).convert_alpha()
    image = pg.transform.scale(image, (width, height))
    return image


def text_render(text):
    return font.render(str(text), True, "black")


class FireBall(pg.sprite.Sprite):
    def __init__(self, center, side,size, image,move=False, ):
        super().__init__()
        self.image = pg.image.load(f"{image}")
        self.size = size
        self.side = side
        self.image = pg.transform.scale(self.image, size) if self.side == 'Left' else pg.transform.flip(pg.transform.scale(self.image, size), True, False)
        self.rect = self.image.get_rect()
        self.rect.center = center
        self.move = move

    def update(self):
     if self.move:
       if self.side == "Right":
        self.rect.x += 10
       elif self.side == "Left":
         self.rect.x -= 10
       else:
           self.rect.x += 10
     self.image = pg.transform.scale(self.image, self.size)

    def draw(self, screen):
        screen.blit(self.image, self.rect)


class Player(pg.sprite.Sprite):
    def __init__(self, player, mode):
        super().__init__()
        self.mode = mode
        global person
        self.index_fireball = 0
        self.idles = [pg.image.load(f"images/{player}/idle{i}.png")for i in range(1,4)]
        self.moves = [pg.image.load(f"images/{player}/move{i}.png")for i in range(1,5)]
        self.moves1 = [pg.transform.flip(pg.image.load(f"images/{player}/move{i}.png"), True, False)for i in range(1,5)]
        self.down = pg.transform.scale(pg.image.load(f'images/{player}/down.png'), (400,500))
        self.size = [50, 50]
        self.rect = pg.Rect(100, 250, 400, 500)
        self.rect.center = (100, SCREEN_HEIGHT // 2)
        self.rect2 = pg.Rect(100, 250, 200, 50)
        self.displacement = 0
        self.health_point = 500
        self.is_seating = False
        self.group = pg.sprite.Group()
        temp1 = 0
        self.moving = False
        for i, d, e in zip(self.idles, self.moves, self.moves1):
            i, d, e = pg.transform.scale(i, (400,500)), pg.transform.scale(d, (400,500)), pg.transform.scale(e, (400,500))
            self.idles[temp1], self.moves[temp1], self.moves1[temp1] = i, d, e
            temp1 += 1

        self.image_index = 0
        self.is_adding_fireball = True
        self.is_fireball_release = True

    def draw(self, screen):
      if not self.moving:
        self.is_seating = False
        screen.blit(self.idles[self.image_index], self.rect)
      else:
        if self.moving == 'Right':
          self.is_seating = False
          screen.blit(self.moves[self.image_index], self.rect)
        elif self.moving == 'Left':
          screen.blit(self.moves1[self.image_index], self.rect)
          self.is_seating = False
        elif self.moving == 'Down':
          self.is_seating = True
          screen.blit(self.down, self.rect)
      self.group.draw(screen)
      pg.draw.rect(screen, pg.Color('red'), self.rect2)
    def update(self, key):
        global frame
        if key[pg.K_a] and self.rect.centerx > 50:
            self.rect.x -= 3
            self.moving = 'Left'
        elif key[pg.K_d] and self.rect.x < 600:
            self.rect.x += 3
            self.moving = 'Right'
        elif key[pg.K_s] and not key[pg.K_d] and not key[pg.K_a]:
            self.moving = 'Down'
        else:
            self.moving = False
        self.rect2.center = (self.rect.centerx - self.displacement, 100)

        frame += 1
        self.group.update()
        if frame % 30 == 0:
         current_gesture = g.get_gesture()

         match current_gesture:
            case "rock":
              if self.moving != 'Down':
                 if self.is_adding_fireball:
                  self.group.add(FireBall(self.rect.center, self.moving,self.size, f'images/{persons[person]}/magicball.png' ))
                  self.is_adding_fireball = False
                 self.is_fireball_release = False
                 self.size[0] += 40
                 self.size[1] += 40
                 self.group.sprites()[self.index_fireball].rect.centery -= 20
                 self.group.sprites()[self.index_fireball].rect.centerx -= 20
            case _:
                  if not self.is_fireball_release:
                   self.group.sprites()[self.index_fireball].size = self.size
                   self.group.sprites()[self.index_fireball].move = True
                   self.is_adding_fireball = True
                   self.index_fireball += 1
                   self.is_fireball_release = True
                   self.size = [50,50]


class Enemy(pg.sprite.Sprite):
    def __init__(self, enemy, mode):
        super().__init__()
        self.mode = mode
        self.enemy = enemy
        self.idles = [pg.transform.flip(pg.transform.scale(
            pg.image.load
            (f'images/{enemy}/idle{i}.png'),
            (400,500)),
            True,
            False) for i in range(1,4)]
        self.moves = [pg.transform.scale(pg.image.load(f'images/{enemy}/move{i}.png'), (400,500)) for i in range(1,4)]
        self.moves1 = [pg.transform.flip(pg.transform.scale(pg.image.load(f'images/{enemy}/move{i}.png'), (400,500)), True, False) for i in range(1,4)]
        self.down = pg.transform.flip(pg.transform.scale(pg.image.load(f'images/{enemy}/down.png'), (400,500)), True, False)
        self.image_index = 0
        self.health_point = 500
        self.rect = self.idles[self.image_index].get_rect()
        self.rect.center = (800, SCREEN_HEIGHT // 2)
        self.rect2 = pg.Rect(100, 250, 200, 50)
        self.displacement = 0
        self.group = pg.sprite.Group()
        self.random_seat = 0
        self.random_fireball = 1
        self.size = [50,50]
        self.moving = 'Left'
        self.is_adding_fireball = True
        self.if_fireball_release = True
        self.number_fireball = -1
        self.is_seating = False
    def update(self):
        if self.mode == 2:
         if frame % 30 == 0:
          if self.random_fireball == 1:
            if self.is_adding_fireball:
              self.group.add(FireBall(self.rect.center, 'Left', self.size, f'images/{self.enemy}/magicball.png'))
              self.number_fireball += 1
              self.is_adding_fireball = False
            self.size[0] += 40
            self.size[1] += 40
            self.group.sprites()[self.number_fireball].rect.centery -= 20
            self.group.sprites()[self.number_fireball].rect.centerx -= 20
            if  self.size[0] > 209 and self.size[1] > 209:
                  self.group.sprites()[self.number_fireball].size = self.size
                  self.group.sprites()[self.number_fireball].move = True
                  self.is_adding_fireball = True

                  self.size = [50, 50]
                  self.random_fireball = randint(1, 4)
          if self.random_fireball != 1:
            self.random_fireball =randint(1, 4)
        else:
            if frame % 30 == 0:
               print(1)
               if pg.key.get_pressed()[pg.K_UP]:
                print(2)
                if self.is_adding_fireball:
                    self.group.add(FireBall(self.rect.center, 'Left', self.size, f'images/{self.enemy}/magicball.png'))
                    self.number_fireball += 1
                    self.is_adding_fireball = False
                self.if_fireball_release = False
                self.size[0] += 40
                self.size[1] += 40
                self.group.sprites()[self.number_fireball].rect.centery -= 20
                self.group.sprites()[self.number_fireball].rect.centerx -= 20
               else:
                   if not self.if_fireball_release:
                       self.group.sprites()[self.number_fireball].size = self.size
                       self.group.sprites()[self.number_fireball].move = True
                       self.is_adding_fireball = True

                       self.size = [50, 50]
            if pg.key.get_pressed()[pg.K_LEFT]:
             self.rect.centerx -= 3
             self.moving = 'Left'
            elif pg.key.get_pressed()[pg.K_RIGHT]:
             self.rect.centerx += 3
             self.moving = 'Right'
            else:
             self.moving = 'Left'
        self.group.update()
        self.rect2.center = (self.rect.centerx - self.displacement, 100)
    def draw(self,screen):
      if self.mode == 2:
        if frame % 30 == 0:
         self.random_seat = randint(1, 3)
        if self.random_seat == 2:
         self.is_seating = True
         screen.blit(self.down , self.rect)
        else:
         screen.blit(self.idles[self.image_index], self.rect)
         self.is_seating = False
      else:
         if pg.key.get_pressed()[pg.K_DOWN]:
             self.is_seating = True
             screen.blit(self.down, self.rect)
         else:
             screen.blit(self.idles[self.image_index], self.rect)
             self.is_seating = False
      self.group.draw(screen)
      pg.draw.rect(screen, pg.Color('red'), self.rect2)

class Menu:
    def __init__(self):
        self.surface = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        self.menu = pygame_menu.Menu(height=SCREEN_HEIGHT,
                                     width=SCREEN_WIDTH,
                                     theme=pygame_menu.themes.THEME_ORANGE,
                                     title="Битва магов")
        self.menu.add.selector("Персонаж: ", [('fire wizard', 1), ('lighting wizard', 2), ('earth monk', 3)], onchange=self.set_character)
        self.menu.add.selector("Враг: ", [('fire wizard', 1), ('lighting wizard', 2), ('earth monk', 3)],onchange=self.set_enemy)
        self.menu.add.selector("Режим: ", [('На двоих', 1), ('На одного', 2)], onchange=self.set_mode)
        self.mode = ''
        self.menu.add.button("Играть", self.start_game)
        self.menu.add.button('Выход', quit)
        self.modes = ['На двоих', 'На одного']
        self.persons = ['fire wizard', 'lightning wizard', 'earth monk']
        self.player = self.persons[0]
        self.enemy = self.persons[0]
        self.run()

    def set_mode(self,character,value):
        self.mode = value

    def set_character(self,character,value):
        global person
        person = value - 1
        print(character, person)
        self.player = self.persons[value - 1]

    def set_enemy(self, character,value):
        global enemy
        enemy = value - 1
        self.enemy = self.persons[value - 1]
        print(enemy, character)
    def start_game(self):
        Game(self.player, self.enemy, self.mode)

    def run(self):
        self.menu.mainloop(self.surface)




class Game:
    def __init__(self, player, enemy, mode):
        # Создание окна
        self.screen = pg.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
        pg.display.set_caption("Битва магов")
        self.player = Player(player, mode)
        self.enemy = Enemy(enemy, mode)
        self.background = load_image("images/background.png", SCREEN_WIDTH, SCREEN_HEIGHT)
        self.image_index_event = pg.USEREVENT + 1
        self.image_index_event1 = pg.event.Event(self.image_index_event)
        pg.time.set_timer(self.image_index_event, 400)
        self.clock = pg.time.Clock()
        self.run()

    def run(self):
        while True:
            self.event()
            self.update()
            self.draw()
            self.clock.tick(FPS)

    def event(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                quit()
            if event.type == self.image_index_event:
              if self.player.image_index != len(self.player.idles) - 1:
                self.player.image_index += 1
                self.enemy.image_index += 1
              else:
                self.player.image_index = 0
                self.enemy.image_index = 0

    def update(self):
        self.player.update(pg.key.get_pressed())
        self.enemy.update()
        if pg.sprite.spritecollide(self.player, self.enemy.group, True) :
          if not self.player.is_seating:
            self.player.health_point -= 100
            self.player.rect2.width -= 40
            self.player.displacement += 25
          self.enemy.number_fireball -= 1
        if pg.sprite.spritecollide(self.enemy, self.player.group, True):
           if not self.enemy.is_seating:
            self.enemy.health_point -= 100
            self.enemy.rect2.width -= 40
            self.enemy.displacement += 25
           self.player.index_fireball -= 1

    def draw(self):
        self.screen.blit(self.background, (0, 0))
        self.enemy.draw(self.screen)
        self.player.draw(self.screen)

        pg.display.flip()


if __name__ == "__main__":

       Menu()