Una prima AI semplice per il giocatore automatico.
“Manca una parte del codice”
L’intenzione è quella di creare una modalità giocatore con il secondo giocatore rappresentato dal computer.
is_vs_computer = False # Imposta il default a due giocatori umani
Per prima cosa inizializziamo una variabile dal nome “is_vs_computer” che di “default” è impostata uguale a False. Ciò significa che la modalità giocatore sarà a due giocatori umani. Se tale variabile è impostata a True la modalità passa a un giocatore umano contro un giocatore del computer.
Successivamente, dobbiamo fare in modo che nella schermata iniziale di “START” vi sia l’opzione un giocatore vs computer e due giocatori. Il seguente codice permette di creare il secondo bottone sotto al primo e al centro della schermata.
button_vs_computer_rect = pygame.Rect((width - button_width) / 2, (height - button_height) / 2 + 100, button_width, button_height)
button_vs_computer_text = button_font.render('VS COMPUTER', True, (255, 255, 255)) # Testo bianco
button_vs_computer_text_rect = button_vs_computer_text.get_rect(center=button_vs_computer_rect.center)
La prima riga assegna alla variabile “button_vs_computer” un oggetto Rect (rettangolo) che rappresenta la posizione e le dimensioni di un pulsante con l’etichetta “VS COMPUTER“. Le coordinate x e y del rettangolo sono calcolate in modo che il pulsante sia centrato orizzontalmente nella finestra e leggermente spostato verso il basso (100 pixel in più rispetto al centro verticale) rispetto al centro della finestra. Le variabili “width” e “height” sono la larghezza e l’altezza della finestra del gioco, mentre “button_width” e “button_height” sono la larghezza e l’altezza del pulsante.
La seconda linea di codice assegna alla variabile “button_vs_computer_text” un’immagine del testo “VS COMPUTER” usando un oggetto font (button_font) che è stato definito in precedenza nel codice. Al metodo render vengono passati i seguenti parametri: il testo da “renderizzare”, un booleano che indica se al testo deve essere applicato l’antialiasing (True per l’antialiasing, il che rende i bordi del testo più lisci), e un valore RGB per il colore del testo, che in questo caso è (255, 255, 255), cioè il bianco.
Infine, l’ultima riga di codice, assegna alla variabile “button_vs_computer_text_rect” un oggetto Rect che ha le stesse dimensioni dell’immagine del testo che è stata appena creata. Questo rettangolo è utilizzato per posizionare il testo all’interno del pulsante. In pratica, ciò assicura che il testo “VS COMPUTER” sia centrato sul pulsante.
Il seguente codice aggiunge il secondo bottone al metodo draw_start_button() come di seguito descritto.
def draw_start_button():
pygame.draw.rect(screen, button_color, button_rect)
screen.blit(button_text, button_text_rect.topleft)
pygame.draw.rect(screen, button_color, button_vs_computer_rect)
screen.blit(button_vs_computer_text, button_vs_computer_text_rect.topleft)
La prima istruzione pygame.draw.rect disegna un rettangolo (che funge da pulsante) sullo schermo. Il primo argomento screen è l’oggetto superficie su cui verrà disegnato il rettangolo, “button_color” è il colore del rettangolo (una tupla RGB), e button_rect è un oggetto Rect che specifica la posizione e le dimensioni del rettangolo (pulsante) da disegnare.
La seconda istruzione screen.blit utilizza il metodo blit (block image transfer) usato per disegnare il testo del pulsante sulla superficie screen. Il testo è rappresentato dalla variabile “button_text“. Questa viene posizionata in modo che il punto in alto a sinistra (top-left) dell’immagine del testo corrisponda al punto in alto a sinistra del rettangolo del pulsante definito da button_text_rect.
La terza riga disegna un secondo rettangolo sullo schermo usando gli stessi parametri del primo rettangolo ma con una dimensione e posizione che sono differenti, specificate dall’oggetto button_vs_computer_rect. Questo rettangolo rappresenta il secondo pulsante con l’etichetta “VS COMPUTER” che è stato impostato nel codice precedente.
Infine, l’ultima riga disegna il testo “VS COMPUTER” sulla superficie screen, posizionandolo in modo che il suo punto in alto a sinistra corrisponda al punto in alto a sinistra del rettangolo del pulsante “VS COMPUTER“. Ciò assicura che il testo sia allineato correttamente con il rettangolo del pulsante.
Il risultato della schermata iniziale è il seguente, non un granché!
Ora, si tratta di gestire il click del nuovo bottone con la funzione seguente.
def is_vs_computer_button_clicked():
mouse_pos = pygame.mouse.get_pos()
return button_vs_computer_rect.collidepoint(mouse_pos)
La prima riga della funzione is_vs_computer_button_clicked() chiama la funzione get_pos() dal modulo mouse di Pygame. La funzione get_pos() restituisce le coordinate correnti del mouse nell’interfaccia grafica, in termini di posizione x e y, e le assegna alla variabile “mouse_pos“.
Nella seconda riga Il metodo collidepoint() verifica se un punto specificato (in questo caso, le coordinate del mouse) si trova all’interno del rettangolo dell’oggetto Rect “button_vs_computer_rect” e restituisce True se il punto è all’interno del rettangolo o False in caso contrario.
Infine, nella funzione principale del ciclo while di PyGame si intercetta la pressione del secondo bottone così come descritto di seguito
def start_screen():
global is_vs_computer
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
if event.type == MOUSEBUTTONDOWN:
if is_button_clicked():
return
if is_vs_computer_button_clicked():
is_vs_computer = True
return
Come si vede dal codice, se viene “clikkato” il secondo pulsante presente nella schermata di START la variabile “is_vs_computer” viene impostata a True, il che significa che verrà attivata la modalità in cui il secondo giocatore è il computer.
Bene, ora il gioco è quasi completo e la variante di Pong è quasi terminata. Però, vorrei migliorare il tocco della palla che sembra quasi irrealistico, aggiungere qualche sonorità in più, e qualche altra diavoleria.