# Lezione 14 - Esercizio 1 - Il gioco di Nim

# In questo gioco, due giocatori prelevano alternativamente biglie da un mucchietto.
# Ad ogni mossa, un giocatore sceglie quante biglie prendere: almeno una e al
# massimo metà delle biglie disponibili. Il giocatore che prende l’ultima biglia
# perde la partita.

# Scrivere un programma che consenta all’utente di giocare contro il computer.
# Il programma deve:
# - generare un numero intero casuale compreso tra 10 e 100 da usare come dimensione
#   iniziale del mucchietto di biglie;
# - generare un numero intero casuale, o 0 o 1, da usare per decidere se sarà
#   l’utente o il computer a giocare per primo;
# - generare un numero intero casuale, o 0 o 1, da usare per decidere se il computer
#   giocherà in modo intelligente o stupido:
#    * giocando in modo stupido, ad ogni sua mossa il computer semplicemente preleva
#      dal mucchietto un numero di biglie casuale (ma valido, cioè compreso tra 1 e
#      n/2, se nel mucchietto sono rimaste n biglie);
#    * giocando in modalità intelligente, invece, preleva un numero di biglie tale
#      che il numero di quelle che rimangono nel mucchio sia una potenza di due
#      diminuita di un’unità, cioè 3, 7, 15, 31 o 63. Quest’ultima è sempre una mossa
#      valida, tranne quando la dimensione del mucchio è uguale a una potenza di due
#      diminuita di un’unità. In tal caso, il computer fa una mossa scelta a caso
#      (ovviamente tra quelle valide).

# Come potrete verificare sperimentalmente, il computer non può essere battuto quando
# gioca in modalità intelligente e fa la prima mossa, a meno che la dimensione
# iniziale del mucchio non sia 15, 31 o 63. Analogamente, un giocatore umano che faccia
# la prima mossa e conosca la strategia qui descritta è in grado di battere il calcolatore.

import random
import time

mucchietto = random.randint(10, 100)

print("Benveuro nel gioco di Nim!")
print(f"In questo gioco, l'obiettivo è far pescare al tuo avversario l'ultima biglia\npescandone una certa quantità a testa ogni turno, a partire da un\nmucchietto di {mucchietto} biglie.")

modalita_computer = random.randint(0, 1)

DIFFICOLTA = ['STUPIDO', 'INTELLIGENTE']

print(f'\nGiocherai contro il computer in difficoltà: {DIFFICOLTA[modalita_computer]}')

turno = random.randint(0, 1)

if turno == 0:
    print("Inizi tu a giocare!")
else:
    print("Inizia a giocare il computer!")

POTENZE_MENO_UNO = [3, 7, 15, 31, 63]

print("Il gioco inizia tra 3 secondi")
time.sleep(3)

while mucchietto > 1:
    if turno == 0:
        print(f"\n\nTocca a te.\nNel mucchietto ci sono {mucchietto} biglie.")
        mosse_valide = list(range(1, (mucchietto // 2) + (1 if mucchietto % 2 == 0 else 2)))
        mossa_utente = 0
        while mossa_utente not in mosse_valide:
            mossa_utente = int(input(f"Quante biglie vuoi prendere? La scelta è tra le seguenti:\n{mosse_valide}"))
        
        mucchietto -= mossa_utente
        turno = 1
    else:
        print(f"\n\nTocca al computer.\nNel mucchietto ci sono {mucchietto} biglie.")
        print("Il computer sta pensando...")
        time.sleep(1)
        if DIFFICOLTA[modalita_computer] == "STUPIDO":
                mossa_computer = random.randint(1, (mucchietto // 2) + (0 if mucchietto % 2 == 0 else 1))
        else:
            mossa_computer = -1
            for potenza in POTENZE_MENO_UNO[::-1]:
                print(f"Potenza: {potenza}")
                for possibile_scelta in list(range(1, (mucchietto // 2) + (1 if mucchietto % 2 == 0 else 2)))[::-1]:
                    print(f"Possibile scelta: {possibile_scelta}")
                    if mucchietto - possibile_scelta == potenza:
                        mossa_computer = possibile_scelta
                        break
                if mossa_computer != -1:
                    break
            if mossa_computer == -1:
                print("\nLa modalità intelligente non ha trovato alcuna scelta intelligente. Il computer sceglierà casualmente.")
                mossa_computer = random.randint(1, (mucchietto // 2) + (0 if mucchietto % 2 == 0 else 1))
            
        print(f"Il computer prende {mossa_computer} biglie.")
        mucchietto -= mossa_computer
        turno = 0

if turno == 0:
    print("Sei costretto a prendere l'ultima biglia. Hai perso!")
else:
    print("Il computer ha preso l'ultima biglia. Hai vinto!")

    # Nicolò puzza