Topic: come reinizializzare le vite  (Letto 115 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Fabio Cricelli

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
come reinizializzare le vite
« il: Dicembre 05, 2022, 04:05 »
Ciao a tutti, sono un principiante in Python e sto seguendo un corso online per imparare ad utilizzare Python e Pygame.
Come ultima lezione è stato realizzato un semplice giochino per sparare agli alieni con un'astronave, e venivano richieste alcune modifiche da effettuare per migliorarlo e per esercitarsi con quanto appreso: tutto ok all'inizio, ma all'ultima richiesta, implementare le vite dell'astronave... un disastro! E siccome il corso è testuale e il docente irreperibile, non ho la più pallida idea di come capire dove ho sbagliato!
Le ho tentate tutte, ma o il gioco continua all'infinito, o non va oltre la prima vita, o si incanta per ragioni ignote; allo stesso tempo, non riesco a caricare con la blit() le immagini del numero di vite sulla Surface apposita. Sarò grato a chiunque riesca a spiegarmi quale cavolo di errore ho commesso e come rimediare.
Non so per quale motivo, ma il mio computer non mi sta consentendo di caricare il file del programma in allegato, quindi stampo qui sotto il codice:


import pygame, random
from pygame.locals import *
from os.path import join
import animimage

# --- Definizione di funzioni
def vertical_scroll(surf, dy):
    rect1 = pygame.Rect(0, 0, surf.get_width(), surf.get_height() - dy)
    rect2 = pygame.Rect(0, surf.get_height() - dy, surf.get_width(), dy)
    surf_temp = surf.copy()
    surf.blit(surf_temp, (0, 0), rect2)
    surf.blit(surf_temp, (0, dy), rect1)

# --- Inizializzazione
pygame.init()
screen = pygame.display.set_mode()
pygame.display.set_caption("Aliens")
clk = pygame.time.Clock()

# --- Risorse grafiche
surf_back = pygame.image.load(join("Backgrounds", "Space.png")).convert()
surf_ship = pygame.image.load(join("Sprites", "SpaceArt", "player.png")).convert_alpha()
surf_ship_left = pygame.image.load(join("Sprites", "SpaceArt", "playerLeft.png")).convert_alpha()
surf_ship_right = pygame.image.load(join("Sprites", "SpaceArt", "playerRight.png")).convert_alpha()
surf_alien = []
for i in range(1, 4):
    filename = join("Sprites", "SpaceArt", "enemyShip{}.png".format(i))
    img = pygame.image.load(filename).convert_alpha()
    surf_alien.append(img)
surf_alien1 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip1.png")).convert_alpha()
surf_alien2 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip2.png")).convert_alpha()
surf_alien3 = pygame.image.load(join("Sprites", "SpaceArt", "enemyShip3.png")).convert_alpha()
surf_bullet = pygame.image.load(join("Sprites", "SpaceArt", "laserGreen.png")).convert_alpha()
surf_title = pygame.image.load(join("Sprites", "Aliens_text.png")).convert_alpha()
surf_play = pygame.Surface(surf_back.get_size())
surf_info = pygame.Surface((250, surf_play.get_height()))
fnt = pygame.font.SysFont("Arial", 48)
anim_expl = []
for i in range(32):
    filename = join("Sprites", "Animations", "expl_06_{:0>4}.png".format(i))
    img = pygame.image.load(filename).convert_alpha()
    anim_expl.append(pygame.transform.scale2x(img))
anim_big_expl = []
for i in range(32):
    filename = join("Sprites", "Animations", "expl_10_{:0>4}.png".format(i))
    img = pygame.image.load(filename).convert_alpha()
    anim_big_expl.append(pygame.transform.rotozoom(img, 0, 4.0))
game_over = pygame.image.load(join("Sprites", "gameover3.gif")).convert()
game_over.set_colorkey(game_over.get_at((0, 0)))
game_over_rect = game_over.get_rect()
game_over_rect.center = screen.get_rect().center
life = pygame.image.load(join("Sprites", "SpaceArt", "life.png")).convert_alpha()
life_rect = life.get_rect()

# --- Risorse sonore
sound_laser = pygame.mixer.Sound(join("Effects", "smc-wwvi", "synthetic_laser.ogg"))
sound_expl = pygame.mixer.Sound(join("Effects", "smc-wwvi", "synthetic_gunshot_2.ogg"))
sound_end = pygame.mixer.Sound(join("Effects", "smc-wwvi", "big_explosion.ogg"))
pygame.mixer.music.load(join("Music", "SoundImage", "Techno-Gameplay_Looping.ogg"))
sound_laser.set_volume(0.5)
sound_expl.set_volume(0.5)
sound_end.set_volume(0.5)

# Costanti
TIMERSHOT = pygame.event.custom_type()
BACKCOLOR = (10, 160, 10)
TEXTCOLOR = (255, 255, 40)
SHIP_TOPLEFT = (320, 500)
PLAY_TOPLEFT = (20, 40 + surf_title.get_height())
INFO_TOPLEFT = (40 + surf_play.get_width(), 40 + surf_title.get_height())

# --- Altre variabili
pressed = None
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
aliens = pygame.sprite.Group()
spr_ship = pygame.sprite.Sprite(all_sprites)
spr_ship.image = surf_ship
spr_ship.rect = spr_ship.image.get_rect()
spr_ship.rect.topleft = SHIP_TOPLEFT
score = 0
animations = pygame.sprite.Group()

# QUESTO E' L'INIZIO DEL CICLO DELLE VITE:
lifecount = 3
while lifecount > 0:
   
    # --- Inizio del gioco
    pygame.mixer.music.play(-1)
    pygame.time.set_timer(TIMERSHOT, random.randrange(400, 1501))
    screen.fill(BACKCOLOR)
    rect_title = surf_title.get_rect()
    rect_title.midtop = (surf_play.get_width() // 2 + 20, 20)
    screen.blit(surf_title, rect_title)

    # --- Ciclo principale
    done = False
    while not done:
        # --- Ciclo degli eventi
        for ev in pygame.event.get():
            if ev.type == pygame.QUIT:
                pygame.quit()
            elif ev.type == KEYDOWN and ev.key in (K_n, K_m):
                pressed = ev.key
            elif ev.type == KEYUP and ev.key == pressed:
                pressed = None
                spr_ship.image = surf_ship
            elif ev.type == KEYDOWN and ev.key == K_SPACE and len(bullets) < 8:
                bullet = pygame.sprite.Sprite(all_sprites, bullets)
                bullet.image = surf_bullet
                bullet.rect = surf_bullet.get_rect()
                bullet.rect.midbottom = spr_ship.rect.midtop
                sound_laser.play()
            elif ev.type == TIMERSHOT:
                pygame.time.set_timer(TIMERSHOT, random.randrange(400, 1501))
                alien = pygame.sprite.Sprite(all_sprites, aliens)
                alien.image = surf_alien[random.randrange(len(surf_alien))]
                alien.rect = alien.image.get_rect()
                alien.rect.bottomleft = (random.randrange(0, surf_play.get_width() - alien.rect.width + 1), -1)

        # --- Logica del gioco
        if pressed == K_n and spr_ship.rect.left > 0:
            spr_ship.rect.x -= 5
            spr_ship.image = surf_ship_left
        elif pressed == K_m and spr_ship.rect.right < surf_play.get_width():
            spr_ship.rect.x += 5
            spr_ship.image = surf_ship_right
        for bullet in bullets:
            bullet.rect.y -= 4
            if bullet.rect.bottom < 0:
                bullet.kill()
        for alien in aliens:
            alien.rect.y += (surf_alien.index(alien.image) + 1)
            if alien.rect.top > surf_play.get_height():
                sound_end.play()
                expl = animimage.AnimSprite(animations, all_sprites)
                expl.set_images(anim_big_expl)
                expl.rect.center = alien.rect.midtop
                expl.set_rate(3.5)
                done = True
        collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)
        for i in collisions.keys():
            for alien in collisions:
                score += 10
                sound_expl.play()
                expl = animimage.AnimSprite(animations, all_sprites)
                expl.set_images(anim_expl)
                expl.rect.center = alien.rect.midbottom
                expl.set_rate(3.5)
        if pygame.sprite.spritecollide(spr_ship, aliens, True):
            sound_end.play()
            spr_ship.kill()
            expl = animimage.AnimSprite(animations, all_sprites)
            expl.set_images(anim_big_expl)
            expl.rect.center = spr_ship.rect.midtop
            expl.set_rate(3.5)
            done = True
                   
        # --- Aggiornamento dello schermo
        animations.update()
        vertical_scroll(surf_back, 1)
        surf_play.blit(surf_back, (0, 0))
        all_sprites.draw(surf_play)
        screen.blit(surf_play, PLAY_TOPLEFT)
        surf_info.fill(BACKCOLOR)
        surf_info.blit(fnt.render("Score: " + str(score), True, TEXTCOLOR), (0, 0))
        for y in range(lifecount):
            surf_info.blit(life, (y * life_rect.x, 200))
        screen.blit(surf_info, INFO_TOPLEFT)
        pygame.display.flip()
        clk.tick(30)

    # DECREMENTO DEL CONTATORE DELLE VITE:
    lifecount -= 1

# --- Uscita
pygame.mixer.music.stop()
while pygame.mixer.get_busy():
    animations.update()
    surf_play.blit(surf_back, (0, 0))
    all_sprites.draw(surf_play)
    screen.blit(surf_info, INFO_TOPLEFT)
    pygame.display.flip()
    clk.tick(30)
pygame.mixer.music.load(join("Music", "Avgvsts_midi", "Darkness Approaches.mid"))
pygame.mixer.music.play(-1)
screen.fill(BACKCOLOR)
screen.blit(game_over, game_over_rect)
pygame.display.flip()
pygame.time.wait(4000)
pygame.quit()



Grazie a tutti
Fabio

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 657
  • Punti reputazione: 0
    • Mostra profilo
Re:come reinizializzare le vite
« Risposta #1 il: Dicembre 07, 2022, 16:44 »
Non conosco pygame e non è argomento che al momento mi interessi ma ritengo che se Tu voglia re-inizializzare il ciclo delle vite, in sostanza giocare una nuova partita, allora dovresti racchiudere il ciclo di gioco in un blocco di codice (p.e. funzione/i) da richiamare in base a delle condizioni pre-stabilite e selezionabili dall'utente che gioca (p.e. una domanda tipo "giochiamo di nuovo?" con relativo input dell'user da proporre all'uscita da una partita)