Forum >> Programmazione Python >> Videogames >> Gioco dello sciatore

Pagina: 1

Ciao a tutti, sono nuovo del gruppo e sono una totale capra in programmazione in python. Tutto quello che troverete è stato fatto da chatGPT.
Voglio preparare un gioco che è destinato a due giocatori, un vedente (guida) e un cieco (sciatore; se non è cieco per davvero lo si benda o lo si fa sedere dietro allo schermo con solo la tastiera a disposizione).

La guida deve dare indicazioni destra e sinistra, in modo da schivare gli alberi e il bambino. Vengono rappresentate anche delle cunette di neve, decorative, non hanno influsso nel gioco.

La figura dello sciatore varia in funzione della direzione e della velocità del movimento: infatti, come si fa realmente in pista, si modula la voce se la curva deve essere dolce (un solo tocco del tasto) o secca (tasto tenuto premuto).

Le foto cambiano da uno sciatore in derapata o in carving. Sono presenti sul mio PC nella stessa cartella, per il momento solo bozze, ma se servono ditemi come allegarle.

Il codice contiene tutto ciò che mi serve. Però ha dei bug che chatGPT non riesce più a risolvere (nonostante ripetute richieste).

Quando c'è una collisione con il bordo o con uno dei due ostacoli dovrebbe apparire una schermata con tre scelte: rigiocare, tornare al menu iniziale, uscire (nella versione quasi funzionante che metto sono due, quella con tre scelte va in crash, al limite la metto in un secondo tempo).

Alla fine di ogni partita deve salvare in un file csv il nome dei due giocatori, data e ora, punteggio.

I bug sono i seguenti:

- il comportamento delle collisioni bordo / ostacoli sono diversi, dopo avere giustamente mostrato entrambi la stessa schermata.

- le cunette non appaiono al primo giro, eventualmente al secondo, se la collisione era con il bordo.

- la collisione con lo sciatore avviene troppo presto se questo si trova a sinistra dell'ostacolo e troppo tardi se si trova a destra (questa cosa penso di saperla risolvere giocando con le impostazioni).




Qualcuno di voi riesce a venirne a capo?




Ecco il codice:

import pygame
import random
import sys
import csv
from datetime import datetime

# Inizializza Pygame
pygame.init()

# Dimensioni finestra di gioco
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Simulatore di sci con i ciechi")

# Colori
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (0, 128, 0)
BLUE = (0, 0, 255)
LIGHT_BLUE = (173, 216, 230)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)

# Clock
clock = pygame.time.Clock()

# Font
font = pygame.font.Font(None, 36)

# Caricamento immagini
player_images = {
    "right": pygame.image.load("DerapDes.gif"),
    "left": pygame.image.load("DerapSin.gif"),
    "fast_right": pygame.image.load("CarvDes.gif"),
    "fast_left": pygame.image.load("CarvSin.gif"),
}
bambino_images = {
    "right": pygame.image.load("SpazzDes.gif"),
    "left": pygame.image.load("SpazzSin.gif"),
}

# Caratteristiche del personaggio
player_width = 50  # Dimensioni del giocatore
player_height = 50
player_x = WIDTH // 2
player_y = HEIGHT - 150
player_speed = 3
player_direction = "right"  # "left", "fast_right", o "fast_left"

# Caratteristiche degli ostacoli
obstacles = []
cunette = []
bambino = None
TApp = 3000  # Millisecondi
DeltaTApp = 100  # Riduzione del tempo TApp
last_obstacle_time = pygame.time.get_ticks()

# Punteggio
score = 0


def input_names():
    """Permette di inserire i nomi di sciatore e guida."""
    sciatore = ""
    guida = ""
    active = "sciatore"
    while True:
        screen.fill(WHITE)
        draw_text("Inserisci il nome dello sciatore:", 50, 100, BLACK)
        draw_text(f"Sciatore: {sciatore}", 50, 150, BLUE)
        draw_text("Inserisci il nome della guida:", 50, 250, BLACK)
        draw_text(f"Guida: {guida}", 50, 300, BLUE)
        draw_text("Muovi lo sciatore con le frecce destra e sinistra.", 50, 400, BLACK)
        draw_text("Tenendo premuto il tasto esso si muoverà più veloce.", 50, 430, BLACK)
        draw_text("Evita gli ostacoli e i bordi.", 50, 460, BLACK)
        draw_text("Premi INVIO per iniziare.", 50, 500, RED)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN and sciatore and guida:
                    countdown()
                    return sciatore, guida
                if event.key == pygame.K_BACKSPACE:
                    if active == "sciatore" and sciatore:
                        sciatore = sciatore[:-1]
                    elif active == "guida" and guida:
                        guida = guida[:-1]
                elif event.key == pygame.K_TAB:
                    active = "guida" if active == "sciatore" else "sciatore"
                else:
                    if active == "sciatore":
                        sciatore += event.unicode
                    elif active == "guida":
                        guida += event.unicode

        pygame.display.flip()


def countdown():
    """Mostra un conto alla rovescia prima dell'inizio del gioco."""
    for i in range(1, 0, -1):
        screen.fill(WHITE)
        draw_text(str(i), WIDTH // 2, HEIGHT // 2, RED, 100)
        pygame.display.flip()
        pygame.time.delay(1000)


def draw_text(text, x, y, color=BLACK, size=36):
    """Disegna un testo sullo schermo."""
    font = pygame.font.Font(None, size)
    text_surface = font.render(text, True, color)
    screen.blit(text_surface, (x, y))


def draw_cunetta(x, y):
    """Disegna una cunetta come una mezzaluna."""
    pygame.draw.arc(screen, LIGHT_BLUE, (x, y, 30, 15), 0, 3.14, 2)


def draw_tree(x, y):
    """Disegna un abete sullo schermo."""
    pygame.draw.rect(screen, GREEN, (x + 15, y + 70, 10, 15))  # Tronco
    pygame.draw.polygon(screen, GREEN, [(x, y + 70), (x + 40, y + 70), (x + 20, y + 35)])  # Base
    pygame.draw.polygon(screen, GREEN, [(x + 5, y + 55), (x + 35, y + 55), (x + 20, y + 25)])  # Centro
    pygame.draw.polygon(screen, GREEN, [(x + 10, y + 40), (x + 30, y + 40), (x + 20, y + 10)])  # Punta


def save_score(sciatore, guida, score):
    """Salva il punteggio in un file CSV."""
    with open("punteggio.csv", "a", newline="") as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow([sciatore, guida, datetime.now().strftime("%Y-%m-%d %H:%M:%S"), score])


def reset_game():
    """Resetta le variabili del gioco."""
    global player_x, player_direction, obstacles, cunette, score, TApp, last_obstacle_time, bambino
    player_x = WIDTH // 2
    player_direction = "right"
    obstacles = []
    cunette = [(random.randint(0, WIDTH - 30), random.randint(0, HEIGHT - 30)) for _ in range(10)]
    bambino = None
    score = 0
    TApp = 3000
    last_obstacle_time = pygame.time.get_ticks()


def end_game_screen():
    """Mostra la schermata di fine partita."""
    while True:
        screen.fill(WHITE)
        draw_text("Partita Terminata!", WIDTH // 2 - 150, HEIGHT // 2 - 100, RED, 48)
        draw_text(f"Punteggio: {score}", WIDTH // 2 - 80, HEIGHT // 2 - 40, BLACK, 36)
        draw_text("Premi R per ricominciare o ESC per uscire.", WIDTH // 2 - 250, HEIGHT // 2 + 40, BLUE, 28)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_r:
                    countdown()
                    reset_game()
                    return "restart"
                elif event.key == pygame.K_ESCAPE:
                    reset_game()
                    input_names()
                    
                    
        pygame.display.flip()


def move_bambino(bambino):
    """Gestisce il movimento del bambino."""
    x, y, direction = bambino
    y += 2
    if random.random() < 0.02:  # Cambia direzione casualmente
        direction = "right" if direction == "left" else "left"
    if direction == "right":
        x = min(WIDTH - 30, x + 1)
    else:
        x = max(0, x - 1)
    return (x, y, direction)


def move_cunette():
    """Aggiorna la posizione delle cunette."""
    global cunette
    cunette = [(x, y + 5 if y < HEIGHT else -15) for x, y in cunette]


# Input iniziale
sciatore_nome, guida_nome = input_names()

# Ciclo principale del gioco
running = True
while running:
    screen.fill(WHITE)

    # Eventi
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            save_score(sciatore_nome, guida_nome, score)
            pygame.quit()
            sys.exit()

    # Movimento personaggio
    keys = pygame.key.get_pressed()
    if player_direction == "right":
        player_x += 3 if not keys[pygame.K_RIGHT] else 9
    else:
        player_x -= 3 if not keys[pygame.K_LEFT] else 9

    if keys[pygame.K_LEFT] and player_direction == "right":
        player_direction = "left"
    elif keys[pygame.K_RIGHT] and player_direction == "left":
        player_direction = "right"


    # Controllo collisione con i bordi
    if player_x < 0 or player_x + player_width > WIDTH:
        save_score(sciatore_nome, guida_nome, score)
        if end_game_screen() == "restart":
            sciatore_nome, guida_nome = input_names()
        continue

    # Generazione nuovi ostacoli
    current_time = pygame.time.get_ticks()
    if current_time - last_obstacle_time > TApp:
        obstacles.append((random.randint(0, WIDTH - 30), -60))
        last_obstacle_time = current_time
        TApp = max(500, TApp - DeltaTApp)  # Diminuisce TApp fino a un minimo di 500ms

    # Generazione del bambino
    if bambino is None and random.random() < 0.01:
        bambino = (random.randint(0, WIDTH - 30), -60, "right")

    # Movimento delle cunette
    move_cunette()
    for x, y in cunette:
        draw_cunetta(x, y)


    # Movimento ostacoli
    new_obstacles = []
    for x, y in obstacles:
        y += 5
        if y < HEIGHT:
            new_obstacles.append((x, y))
            draw_tree(x, y)
            # Controllo collisione con il personaggio
            if pygame.Rect(player_x, player_y, player_width, player_height).colliderect((x, y + 10, 30, 60)):
                save_score(sciatore_nome, guida_nome, score)
                end_game_screen()
        else:
            score += 1
    obstacles = new_obstacles

    # Movimento del bambino
    if bambino:
        bambino = move_bambino(bambino)
        sx, sy, sdir = bambino
        screen.blit(bambino_imagessdir, (sx, sy))
        if pygame.Rect(player_x, player_y, player_width, player_height).colliderect((sx, sy, 50, 50)):
            save_score(sciatore_nome, guida_nome, score)
            end_game_screen()
        if sy > HEIGHT:
            bambino = None

    # Disegna il personaggio
    player_image_key = "fast_right" if keys[pygame.K_RIGHT] else "fast_left" if keys[pygame.K_LEFT] else player_direction
    screen.blit(player_imagesplayer image key, (player_x, player_y))

    # Mostra il punteggio
    draw_text(f"Punteggio: {score}", 10, 10)

    # Aggiorna schermo
    pygame.display.flip()
    clock.tick(30)




Ciao e benvenuto. :birrame:


C'è un problema col tuo messaggio, ma non nella forma, quanto nelle intenzioni. Posti del codice scritto da una AI e del quale vorresti che noi correggessimo ed integrassimo quanto hai fatto? Non è l'approccio corretto e non è lo scopo per cui questo forum esiste.

Devi sporcarti le sante manine col codice, capirlo, scriverlo, interpretarlo e provare a risolvere le problematiche. Poi se ti blocchi e non capisci una determinata sezione, si prova a darti supporto, ma analizzare per tuo conto una sbrodolata di codice non è utile per nessuno, perdonami se sono così diretto.

Ti consiglio di studiare e provare a scrivere e correggere il codice da te, magari facendoti aiutare da ChatGPT e chiedendo aiuto a noi o altri se ti blocchi, ma devi essere l'attore protagonista dello sviluppo.

Buon proseguimento.

Lo so che mi sono imbarcato in una cosa più grande di me.
Io ho conoscenze praticamente nulle di programmazione, il massimo che conosco è VBA per excel.

Le mani me le sporcherei anche volentieri, ma con le mie conoscenze facile che strapperei i fiori e terrei le erbacce.

A differenza del VBA, per esempio, non riesco a fare scorrere una operazione alla volta, per capire dov'è l'inghippo.

Riesco solo a leggere, per esempio, che le collisioni tra bordo e ostacoli vengono gestite diversamente, ma cosa comportino le differenze per me è arabo.

Quindi contavo su un'anima pia che si divertisse a darci un occhio.

Se non è possibile mi tengo questa versione con i suoi bug e imparo a gestirli.


Pagina: 1



Esegui il login per scrivere una risposta.