In questi giorni sto imparando le basi per programmare videogiochi in python, usando la libreria pygame!
Ho fatto questo mio videogioco tutto da me : si tratta di un razzo disperso nello spazio, tra giove e saturno si direbbe, e si ritrova a schivare una pioggia di asteroidi! Il gioco ha un sistema di punteggio, e maggiore diventa, più la difficoltà si fa sentire! Voglio far vincere il player a punteggio 500, ma attualmente ho programmato fino a 300. Le difficoltà aggiuntive sono: maggiore velocità degli asteroidi e più asteroidi. Esistono 3 tipi di asteroidi: i piccoli (1) medi (2) grandi (3).
Perora do la versione incompleta del gioco, per avere un feedback. ma ho intenzione di aggiungere cose come:

  • Possibilità di arrivare a 500 punti e vincere il gioco
  • Animazione del razzo
  • La possibilità di poter tenere premuto il tasto (per favore ditemi come)
  • Animazione degli asteroidi (facendoli girare su se stessi)
  • Maggiore randomicità degli asteroidi

Ecco il codice:

import pygame
from sys import exit
from random import randint

def display_score():
    current_time = (int(pygame.time.get_ticks()/1000) - tempo_iniziale)
    punti_surf =font.render("Punti: "+str(current_time),False,(51,255,209))
    punti_surf = pygame.transform.scale(punti_surf,(150,50))
    punti_rect = punti_surf.get_rect(center = (400,50))

    screen.blit(punti_surf,punti_rect)
    return current_time


pygame.init()

screen = pygame.display.set_mode((800,400))
pygame.display.set_caption("Spaceship Command Simulator")
clock = pygame.time.Clock()
tempo_iniziale = 0

sfondo = pygame.image.load("grafiche/sfondo.png")
game_active = True

#testo
font = pygame.font.Font("font/Pixeltype.ttf")

#razzo
razzo1 = pygame.image.load("grafiche/navicella/navicella1.png")
razzo_rect = razzo1.get_rect(center = (50,200))
#razzo game over
razzo1_go = pygame.transform.scale2x(razzo1)
razzo1_rect_go = razzo1.get_rect(center = (400,200))

#asteroide 1/piccolo
asteroide1 = pygame.image.load("grafiche/asteroide1/asteroide1_1.png")
asteroide1_rect = asteroide1.get_rect(center = (800,200))
asteroide1_1_rect = asteroide1.get_rect(center = (700,250))
asteroide1_2_rect = asteroide1.get_rect(center = (800,256))

#asteroide 2/medio
asteroide2 = pygame.image.load("grafiche/asteroide2/asteroide2_1.png")
asteroide2_rect = asteroide2.get_rect(center = (800,100))
asteroide2_1_rect = asteroide2.get_rect(center = (800,350))

#asteroide 3/grande
asteroide3 = pygame.image.load("grafiche/asteroide3/asteroide3_1.png")
asteroide3_rect = asteroide3.get_rect(center = (810,340))
asteroide3_1_rect = asteroide3.get_rect(center = (825,393))

#timer
tempo_iniziale = 0

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
            if razzo_rect.y <= 0:
                razzo_rect.y = 1
            else:
                razzo_rect.y -= 20
        if event.type == pygame.KEYDOWN and event.key == pygame.K_s:
            if razzo_rect.bottom >= 400:
                razzo_rect.bottom = 399
            else:
                razzo_rect.y += 20
        if event.type == pygame.KEYDOWN and event.key == pygame.K_a:
            if razzo_rect.left <= 0 :
                razzo_rect.left = 1
            else:
                razzo_rect.x -= 20
        if event.type == pygame.KEYDOWN and event.key == pygame.K_d:
            if razzo_rect.right >= 800:
                razzo_rect.right = 799
            else:
                razzo_rect.x += 20
        if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
            game_active = True
            asteroide1_rect.x = 800

    if game_active == razzo_rect.colliderect(asteroide1_rect) or razzo_rect.colliderect(
            asteroide1_1_rect) or razzo_rect.colliderect(asteroide2_rect) or razzo_rect.colliderect(asteroide2_1_rect)\
            or razzo_rect.colliderect(asteroide3_rect) or razzo_rect.colliderect(asteroide3_1_rect):
        game_active = False
        asteroide1_rect.x = 800
        asteroide1_1_rect.x = 800
        asteroide1_2_rect.x = 800

        asteroide2_rect.x = 800
        asteroide2_1_rect.x = 800

        asteroide3_rect.x = 800
        asteroide3_1_rect.x = 800

        asteroide1_rect.y = randint(0, 400)
        asteroide1_1_rect.y = randint(0, 400)
        asteroide2_rect.y = randint(0, 400)



    if game_active == True:
        screen.blit(sfondo,(0,0))
        screen.blit(razzo1,razzo_rect)
        punti = display_score()
        if punti <=20:
            #asteroide 1_0
            asteroide1_rect.x -= 5
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint (0,400)
            screen.blit(asteroide1,asteroide1_rect)

            #asteroide 1_1
            asteroide1_1_rect.x -= 5
            if asteroide1_1_rect.x <= -50:
                asteroide1_1_rect.x = 800
                asteroide1_1_rect.y = randint (56,372)
            screen.blit(asteroide1,asteroide1_1_rect)

            #asteroide 2_1
            asteroide2_rect.x -= 2
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint (0,400)
            screen.blit(asteroide2,asteroide2_rect)
        elif punti >=20 and punti <=50:
            # asteroide 1_0
            asteroide1_rect.x -= 6
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint(0, 400)
            screen.blit(asteroide1, asteroide1_rect)

            # asteroide 1_1
            asteroide1_1_rect.x -= 6
            if asteroide1_1_rect.x <= -50:
                asteroide1_1_rect.x = 800
                asteroide1_1_rect.y = randint(56, 372)
            screen.blit(asteroide1, asteroide1_1_rect)

            # asteroide 2_1
            asteroide2_rect.x -= 3
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint(0, 400)
            screen.blit(asteroide2, asteroide2_rect)
        elif punti >=50 and punti <=100:   #aggiungere gli asteroidi grandi
            # asteroide 1_0
            asteroide1_rect.x -= 6
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint(0, 400)
            screen.blit(asteroide1, asteroide1_rect)

            # asteroide 1_1
            asteroide1_1_rect.x -= 6
            if asteroide1_1_rect.x <= -50:
                asteroide1_1_rect.x = 800
                asteroide1_1_rect.y = randint(56, 372)
            screen.blit(asteroide1, asteroide1_1_rect)

            # asteroide 2_1
            asteroide2_rect.x -= 3.5
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint(0, 400)
            screen.blit(asteroide2, asteroide2_rect)

            #astreroide 3
            asteroide3_rect.x -= 2
            if asteroide3_rect.x <= -25:
                asteroide3_rect.x = 825
                asteroide3_rect.y = randint(0,400)
            screen.blit(asteroide3,asteroide3_rect)
        elif punti >=100 and punti <=150: #aggiungere maggiore velocità
            # asteroide 1_0
            asteroide1_rect.x -= 7
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint(0, 400)
            screen.blit(asteroide1, asteroide1_rect)

            # asteroide 1_1
            asteroide1_1_rect.x -= 7
            if asteroide1_1_rect.x <= -50:
                asteroide1_1_rect.x = 800
                asteroide1_1_rect.y = randint(56, 372)
            screen.blit(asteroide1, asteroide1_1_rect)

            # asteroide 2_1
            asteroide2_rect.x -= 5
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint(0, 400)
            screen.blit(asteroide2, asteroide2_rect)

            # astreroide 3
            asteroide3_rect.x -= 3
            if asteroide3_rect.x <= -25:
                asteroide3_rect.x = 825
                asteroide3_rect.y = randint(0, 400)
            screen.blit(asteroide3, asteroide3_rect)
        elif punti >=150 and punti <=250:  #maggiore frequenza di asteroidi medi e grandi
            # asteroide 1_0
            asteroide1_rect.x -= 7
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint(0, 400)
            screen.blit(asteroide1, asteroide1_rect)

            # asteroide 2
            asteroide2_rect.x -= 5
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint(0, 400)
            screen.blit(asteroide2, asteroide2_rect)

            #asteroide 2_1
            asteroide2_1_rect.x -= 5
            if asteroide2_1_rect.x <= -75:
                asteroide2_1_rect.x = 834
                asteroide2_1_rect.y = randint(0,357)
            screen.blit(asteroide2,asteroide2_1_rect)
            # astreroide 3
            asteroide3_rect.x -= 3
            if asteroide3_rect.x <= -25:
                asteroide3_rect.x = 825
                asteroide3_rect.y = randint(0, 400)
            screen.blit(asteroide3, asteroide3_rect)
            #asteroide 3_1
            asteroide3_1_rect.x -= 1
            if asteroide3_1_rect.x <= -75:
                asteroide3_1_rect.x = 900
                asteroide3_1_rect.y = randint(0,400)
            screen.blit(asteroide3,asteroide3_1_rect)
        elif punti >=250 and punti <= 300: #aumento degli asteroidi
            # asteroide 1_0
            asteroide1_rect.x -= 7
            if asteroide1_rect.x <= -50:
                asteroide1_rect.x = 800
                asteroide1_rect.y = randint(0, 400)
            screen.blit(asteroide1, asteroide1_rect)
            #asteroide 1_1
            asteroide1_1_rect.x -= 8
            if asteroide1_1_rect.x <= -50:
                asteroide1_1_rect.x = 801
                asteroide1_1_rect.y = randint(150,250)
            screen.blit(asteroide1,asteroide1_1_rect)

            #asteroide 1_2
            asteroide1_2_rect.x -= 7.5
            if asteroide1_2_rect.x <= -85:
                asteroide1_2_rect.x = 810
                asteroide1_2_rect.y = randint(0,200)
            screen.blit(asteroide1,asteroide1_1_rect)

            # asteroide 2
            asteroide2_rect.x -= 5
            if asteroide2_rect.x <= -50:
                asteroide2_rect.x = 800
                asteroide2_rect.y = randint(0, 400)
            screen.blit(asteroide2, asteroide2_rect)

            # asteroide 2_1
            asteroide2_1_rect.x -= 5
            if asteroide2_1_rect.x <= -75:
                asteroide2_1_rect.x = 834
                asteroide2_1_rect.y = randint(0, 357)
            screen.blit(asteroide2, asteroide2_1_rect)
            # astreroide 3
            asteroide3_rect.x -= 3
            if asteroide3_rect.x <= -25:
                asteroide3_rect.x = 825
                asteroide3_rect.y = randint(0, 400)
            screen.blit(asteroide3, asteroide3_rect)
            # asteroide 3_1
            asteroide3_1_rect.x -= 1
            if asteroide3_1_rect.x <= -75:
                asteroide3_1_rect.x = 900
                asteroide3_1_rect.y = randint(0, 400)
            screen.blit(asteroide3, asteroide3_1_rect)

        #elif punti >=300 and punti <=400:
            #solo asteroidi medi e grandi
        #elif punti >=400 and punti <=450:
            #maggiore velocità asteroidi
        #elif punti >=450 and punti <500:
            #più asteroidi
        #elif punti>=500:
            #VITTORIA
    else:
        screen.blit(sfondo,(0,0))
        screen.blit(razzo1,razzo1_rect_go)
        game_over = font.render("GAME OVER",False,(111,196,169))
        game_over = pygame.transform.scale(game_over,(400,100))
        game_over_rect = game_over.get_rect(center = (400,100))
        punti_mess = font.render("i tuoi punti sono: "+str(punti),False,(111,196,169))
        punti_mess = pygame.transform.scale(punti_mess,(400,100))
        punti_rect = punti_mess.get_rect(center = (400,200))
        screen.blit(game_over,game_over_rect)
        screen.blit(punti_mess,punti_rect)
        tempo_iniziale = int(pygame.time.get_ticks()/1000)
        razzo_rect.x = 50
        razzo_rect.y = 200


    pygame.display.update()
    clock.tick(60)

Grande, non male!
Per aggiungere la possibilità di vincere a 500 punti possiamo aggiungere un if prima di pygame.display.update()

if punti >= 500:
    # VITTORIA
    screen.blit(sfondo, (0, 0))
    vittoria_text = font.render("HAI VINTO!", False, (255, 255, 255))
    vittoria_text = pygame.transform.scale(vittoria_text, (400, 100))
    vittoria_rect = vittoria_text.get_rect(center=(400, 100))
    screen.blit(vittoria_text, vittoria_rect)
    punti_mess = font.render("i tuoi punti sono: " + str(punti), False, (255, 255, 255))
    punti_mess = pygame.transform.scale(punti_mess, (400, 100))
    punti_rect = punti_mess.get_rect(center=(400, 200))
    screen.blit(punti_mess, punti_rect)
    game_active = False

Per l'animazione della navicella, aggiungi questo prima del while:

frame_counter = 0
animation_frames = [pygame.image.load(f"grafiche/navicella/navicella{i}.png") for i in range(1, 5)]

E al posto della sezione del razzo:

razzo_frame = frame_counter // 10 % len(animation_frames)
razzo1 = animation_frames[razzo_frame]
frame_counter += 1

screen.blit(sfondo, (0, 0))
screen.blit(razzo1, razzo_rect)

Per tenere premuto il tasto basta aggiungere keys = pygame.key.get_pressed()
Quindi:

if keys[pygame.K_w]:
    if razzo_rect.y <= 0:
        razzo_rect.y = 1
    else:
        razzo_rect.y -= 20
if keys[pygame.K_s]:
    if razzo_rect.bottom >= 400:
        razzo_rect.bottom = 399
    else:
        razzo_rect.y += 20
if keys[pygame.K_a]:
    if razzo_rect.left <= 0:
        razzo_rect.left = 1
    else:
        razzo_rect.x -= 20
if keys[pygame.K_d]:
    if razzo_rect.right >= 800:
        razzo_rect.right = 799
    else:
        razzo_rect.x += 20

Semplici animazioni per gli asteroidi:

# Asteroide 1_0
asteroide1_rect.x -= 7
if asteroide1_rect.x <= -50:
    asteroide1_rect.x = 800
    asteroide1_rect.y = randint(0, 400)
rotated_asteroide1 = pygame.transform.rotate(asteroide1, frame_counter)
screen.blit(rotated_asteroide1, asteroide1_rect)

# Asteroide 1_1
asteroide1_1_rect.x -= 8
if asteroide1_1_rect.x <= -50:
    asteroide1_1_rect.x = 800
    asteroide1_1_rect.y = randint(56, 372)
rotated_asteroide1_1 = pygame.transform.rotate(asteroide1, frame_counter)
screen.blit(rotated_asteroide1_1, asteroide1_1_rect)

# Asteroide 2_1
asteroide2_rect.x -= 5
if asteroide2_rect.x <= -50:
    asteroide2_rect.x = 800
    asteroide2_rect.y = randint(0, 400)
rotated_asteroide2 = pygame.transform.rotate(asteroide2, frame_counter)
screen.blit(rotated_asteroide2, asteroide2_rect)

frame_counter += 1

In questo modo evidenzi meglio la randomicità degli spawn e li fai casuali:

asteroide1_rect.x -= 7
asteroide1_rect.y += randint(-3, 3)  # variabile casuale alla posizione y
if asteroide1_rect.x <= -50:
    asteroide1_rect.x = 800
    asteroide1_rect.y = randint(0, 400)
rotated_asteroide1 = pygame.transform.rotate(asteroide1, frame_counter)
screen.blit(rotated_asteroide1, asteroide1_rect)

asteroide1_1_rect.x -= 8
asteroide1_1_rect.y += randint(-3, 3)
if asteroide1_1_rect.x <= -50:
    asteroide1_1_rect.x = 800
    asteroide1_1_rect.y = randint(56, 372)
rotated_asteroide1_1 = pygame.transform.rotate(asteroide1, frame_counter)
screen.blit(rotated_asteroide1_1, asteroide1_1_rect)

asteroide2_rect.x -= 5
asteroide2_rect.y += randint(-3, 3)
if asteroide2_rect.x <= -50:
    asteroide2_rect.x = 800
    asteroide2_rect.y = randint(0, 400)
rotated_asteroide2 = pygame.transform.rotate(asteroide2, frame_counter)
screen.blit(rotated_asteroide2, asteroide2_rect)

Powered by: FreeFlarum.
(remove this footer)