1. Home
  2. iThink
  3. Programmazione per Ragazzi
  4. Indovina il numero: il primo gioco in Python
Programmazione per Ragazzi Divento Programmatore · Capitolo 1

Indovina il numero: il primo gioco in Python

Codice Python sullo schermo di un computer
Foto: JohnsonMartin · Pixabay · Licenza dei contenuti Pixabay

Divento Programmatore — Capitolo 1: Il tuo primo gioco: Indovina il Numero

Obiettivi di Apprendimento

Al termine di questo capitolo avrai costruito il tuo primo gioco funzionante e imparerai a:

  • Scrivere ed eseguire il tuo primo programma Python in Thonny
  • Usare le variabili per memorizzare dati (nomi, numeri, punteggi)
  • Generare numeri casuali con la libreria random
  • Raccogliere input dall'utente con la funzione input()
  • Prendere decisioni nel codice con if, elif e else
  • Ripetere azioni con il ciclo while
  • Migliorare il gioco con sfide bonus: vite, difficoltà, punteggio

Termini Fondamentali

| Termine | Simbolo | Significato | | --------- | --------- | ------------- | | Programma | 💻 | Sequenza di istruzioni che il computer esegue | | Variabile | 📦 | Cassetto con etichetta che memorizza un valore | | Libreria | 📚 | Raccolta di funzioni pronte all'uso | | input() | ⌨️ | Legge ciò che l'utente scrive da tastiera | | print() | 🖨️ | Mostra testo a schermo | | random.randint(a, b) | 🎲 | Genera numero intero casuale tra a e b | | int() | 🔢 | Converte testo in numero intero | | if / elif / else | 🔀 | Struttura decisionale | | while | 🔁 | Ciclo che si ripete finché una condizione è vera | | Bug | 🐛 | Errore nel codice |


La Storia: Come è nato il gioco più semplice del mondo

1971. Don Daglow, giovane programmatore, se ne sta davanti a uno dei primi computer dell'università: un bestione che si mangiava mezza stanza. Gli studenti normali potevano toccarlo solo di notte, quando i prof erano a dormire. Don aveva un'idea in testa: un gioco. Niente grafica, niente suoni. Solo un terminale che sputava lettere su carta, una alla volta. E con quella roba lì tirò fuori il gioco più semplice della storia dell'informatica: il computer pensa un numero a caso, tu lo devi indovinare. Tutto qui.

Cinquant'anni dopo, "Indovina il Numero" è ancora il primo programma che ogni programmatore al mondo impara a costruire. Non perché sia facile — ma perché in quelle venti righe di codice sono nascosti tutti i concetti fondamentali che userai per il resto della tua carriera: variabili, cicli, condizioni e interazione con l'utente.

Oggi costruirai quella stessa magia. E poi la migliorerai.


Prepara il tuo laboratorio: Thonny

Prima di scrivere codice, hai bisogno di un posto dove scriverlo. Si chiama IDE (Integrated Development Environment, ovvero Ambiente di Sviluppo Integrato): è come un quaderno intelligente che capisce il Python, colora il codice per renderlo leggibile e ti dice subito se hai fatto un errore.

Per i primi capitoli useremo Thonny: è gratuito, si installa in 2 minuti e non ha distrazioni. Perfetto per cominciare.

Installazione rapida:

  1. Vai su thonny.org
  2. Scarica la versione per il tuo sistema operativo
  3. Installa e apri — vedrai due finestre: in alto scrivi il codice, in basso vedi i risultati

Quando apri Thonny per la prima volta, vedrai:

  • Editor (in alto): qui scrivi il tuo programma
  • Shell (in basso): qui il computer risponde ed esegue il codice

Prova subito: clicca nella Shell in basso, scrivi print("Ciao mondo!") e premi Invio. Se appare Ciao mondo! sullo schermo — funziona. Sei ufficialmente un programmatore.


I Mattoncini di Base: Variabili e Tipi di Dati

Un programma senza variabili è come una cucina senza cassetti: dove metti le cose? Le variabili sono i contenitori della memoria del tuo programma.

# Creiamo alcune variabili
nome       = "Marco"        # stringa di testo (str)
età        = 13             # numero intero (int)
altezza    = 1.72           # numero decimale (float)
ha_vinto   = False          # vero o falso (bool)

print("Ciao,", nome)
print("Hai", età, "anni")

💡 Il simbolo # introduce un commento: il computer lo ignora completamente. Serve a te e agli altri programmatori per capire cosa fa il codice.

Regole per i nomi delle variabili:

  • ✅ punteggio_giocatore, vite_rimaste, numero_segreto
  • ✅ Usa solo lettere, numeri e underscore _
  • ❌ 2variabile (non iniziare con un numero)
  • ❌ nome variabile (niente spazi — usa _)

La Libreria random: Insegna al Computer a Tirare i Dadi

Un computer, di natura, è una macchina deterministica: fa sempre la stessa cosa dati gli stessi input. Allora come fa a "scegliere" un numero casuale? Usa una libreria specializzata: una raccolta di funzioni già scritte da altri programmatori che puoi importare nel tuo programma.

import random   # carica la libreria random

# Genera un numero intero casuale tra 1 e 100 (inclusi)
numero = random.randint(1, 100)
print("Il numero segreto è:", numero)   # durante il gioco vero, NON stamperemo questo!

Esegui più volte: ogni volta ottieni un numero diverso. La funzione random.randint(a, b) genera un intero tra a e b compresi.


Parlare con l'Utente: input()

Un gioco che non interagisce con il giocatore non è un gioco — è un film. La funzione input() mette in pausa il programma, aspetta che l'utente scriva qualcosa e prema Invio, poi restituisce quel testo come stringa.

nome = input("Come ti chiami? ")
print("Benvenuto,", nome + "!")

Attenzione importante: input() restituisce sempre una stringa (testo), anche se l'utente scrive un numero. Per usarla come numero devi convertirla:

# SBAGLIATO — confronta testo con numero, non funziona
risposta = input("Indovina: ")
if risposta > 50:    # ❌ Errore! Non puoi confrontare str con int
    print("Troppo alto")

# GIUSTO — converti prima con int()
risposta = int(input("Indovina: "))
if risposta > 50:    # ✅ Funziona!
    print("Troppo alto")

Prendere Decisioni: if, elif, else

Il codice deve saper reagire in modo diverso a situazioni diverse. La struttura if/elif/else è il cervello decisionale del programma:

temperatura = 35

if temperatura > 30:
    print("Fa caldo! 🥵")
elif temperatura > 20:
    print("Temperatura perfetta 😊")
elif temperatura > 10:
    print("Un po' fresco 🧥")
else:
    print("Fa freddo! 🥶")

Regola fondamentale: il codice dentro un if deve essere indentato (rientrato) con 4 spazi o un Tab. L'indentazione dice a Python "questo blocco appartiene a questa condizione". Se dimentichi l'indentazione, Python si arrabbia con un IndentationError.

# SBAGLIATO
if True:
print("ciao")   # ❌ IndentationError

# GIUSTO
if True:
    print("ciao")   # ✅ 4 spazi di rientro

Ripetere Azioni: Il Ciclo while

Nel gioco "Indovina il Numero" il giocatore può sbagliare più volte. Il programma deve continuare a chiedere finché non indovina. Questo è il lavoro del ciclo while:

contatore = 0

while contatore < 5:
    print("Contatore vale:", contatore)
    contatore = contatore + 1   # oppure: contatore += 1

print("Fine! Il ciclo ha girato 5 volte.")

Il ciclo while funziona così:

  1. Controlla la condizione (contatore < 5)
  2. Se è vera → esegue il blocco indentato → torna al punto 1
  3. Se è falsa → esce dal ciclo e continua

⚠️ Loop infinito: se la condizione non diventa mai falsa, il programma gira per sempre! In Thonny puoi fermarlo con il pulsante ⏹ rosso o con Ctrl+C.


Costruiamo il Gioco: Versione Base

Ora hai tutti i mattoncini. Mettiamoli insieme:

import random

# 1. Il computer sceglie il numero segreto
numero_segreto = random.randint(1, 100)
tentativi      = 0
indovinato     = False

print("=" * 40)
print("   🎲 INDOVINA IL NUMERO! 🎲")
print("   Ho scelto un numero tra 1 e 100.")
print("=" * 40)

# 2. Il ciclo di gioco
while not indovinato:
    tentativo  = int(input("\nIl tuo tentativo: "))
    tentativi += 1

    if tentativo < numero_segreto:
        print("📉 Troppo basso! Prova più in alto.")
    elif tentativo > numero_segreto:
        print("📈 Troppo alto! Prova più in basso.")
    else:
        indovinato = True

# 3. Messaggio di vittoria
print("\n🎉 BRAVO! Hai indovinato il numero", numero_segreto, "!")
print("Ci hai messo", tentativi, "tentativi.")

Copia questo codice in Thonny, salvalo come indovina_numero.py e premi ▶. Gioca!

Leggi il codice riga per riga:

  • random.randint(1, 100) → numero casuale tra 1 e 100
  • indovinato = False → variabile booleana che diventa True quando il giocatore vince
  • while not indovinato → continua finché indovinato è False
  • tentativi += 1 → abbreviazione di tentativi = tentativi + 1
  • "=" * 40 → stampa 40 volte il carattere = (trucco per fare linee decorative)

Sfide: Migliora il tuo Gioco

Il gioco funziona, ma può diventare molto più bello. Prova queste sfide in ordine di difficoltà:

Sfida 1 — Il Giudice dei Tentativi

Aggiungi un messaggio finale diverso in base al numero di tentativi:

  • 1-3 tentativi → "Sei un genio! Voto: LEGGENDA 🏆"
  • 4-6 tentativi → "Ottimo! Voto: ESPERTO 🥇"
  • 7-10 tentativi → "Bene! Voto: BRAVO 🥈"
  • Oltre 10 → "Puoi fare meglio! Voto: ALLIEVO 📚"
# Aggiungi DOPO il ciclo while, prima di print("\n🎉 BRAVO!...")
if tentativi <= 3:
    voto = "LEGGENDA 🏆"
elif tentativi <= 6:
    voto = "ESPERTO 🥇"
elif tentativi <= 10:
    voto = "BRAVO 🥈"
else:
    voto = "ALLIEVO 📚"

Sfida 2 — Vite Limitate

Il giocatore ha solo 7 tentativi prima di perdere. Modifica il ciclo while per tenere conto delle vite:

MAX_TENTATIVI = 7   # prova a cambiare questo numero!

while not indovinato and tentativi < MAX_TENTATIVI:
    ...

# Dopo il ciclo, controlla se ha vinto o perso
if indovinato:
    print("🎉 Hai vinto!")
else:
    print("💀 Hai esaurito i tentativi! Il numero era:", numero_segreto)

Sfida 3 — Tre Livelli di Difficoltà

All'inizio del gioco, chiedi al giocatore che difficoltà vuole:

  • Facile: numero tra 1 e 20, 10 tentativi
  • Medio: numero tra 1 e 100, 7 tentativi
  • Difficile: numero tra 1 e 500, 5 tentativi
print("Scegli la difficoltà:")
print("  1 - Facile   (1-20,  10 tentativi)")
print("  2 - Medio    (1-100,  7 tentativi)")
print("  3 - Difficile (1-500, 5 tentativi)")

scelta = input("La tua scelta (1/2/3): ")

if scelta == "1":
    massimo       = 20
    MAX_TENTATIVI = 10
elif scelta == "2":
    massimo       = 100
    MAX_TENTATIVI = 7
else:
    massimo       = 500
    MAX_TENTATIVI = 5

numero_segreto = random.randint(1, massimo)

Sfida 4 — Gioca ancora?

Dopo la partita, chiedi se il giocatore vuole rigiocare. Avvolgi tutto il gioco in un ciclo esterno while True e usa break per uscire:

while True:
    # ... tutto il codice del gioco qui dentro ...

    ancora = input("\nVuoi giocare ancora? (s/n): ")
    if ancora.lower() != "s":
        print("Grazie per aver giocato! Alla prossima! 👋")
        break

Il tuo Primo Bug: Cosa succede se l'utente non inserisce un numero?

Prova questo: esegui il gioco e invece di un numero scrivi "ciao". Vedrai un errore così:

ValueError: invalid literal for int() with base 10: 'ciao'

Il programma va in crash perché int("ciao") è impossibile. Come si risolve? Con la gestione degli errori — lo vedremo nel Capitolo 4. Per ora tienilo a mente: i programmi reali devono sempre gestire gli input sbagliati degli utenti.


Il Codice Completo con Tutte le Sfide

import random

def scegli_difficolta():
    """Chiede la difficoltà e restituisce (massimo, max_tentativi)."""
    print("\n🎮 Scegli la difficoltà:")
    print("  1 - Facile    (1-20,  10 tentativi)")
    print("  2 - Medio     (1-100,  7 tentativi)")
    print("  3 - Difficile (1-500,  5 tentativi)")
    scelta = input("La tua scelta (1/2/3): ")
    if scelta == "1":
        return 20, 10
    elif scelta == "3":
        return 500, 5
    else:
        return 100, 7   # default: medio

def gioca():
    """Una partita completa."""
    massimo, MAX_TENTATIVI = scegli_difficolta()
    numero_segreto = random.randint(1, massimo)
    tentativi      = 0
    indovinato     = False

    print(f"\n{'=' * 40}")
    print(f"   🎲 Ho scelto un numero tra 1 e {massimo}.")
    print(f"   Hai {MAX_TENTATIVI} tentativi. Buona fortuna!")
    print(f"{'=' * 40}")

    while not indovinato and tentativi < MAX_TENTATIVI:
        rimasti   = MAX_TENTATIVI - tentativi
        tentativo = int(input(f"\n[{rimasti} tentativi rimasti] Il tuo numero: "))
        tentativi += 1

        if tentativo < numero_segreto:
            print("📉 Troppo basso!")
        elif tentativo > numero_segreto:
            print("📈 Troppo alto!")
        else:
            indovinato = True

    if indovinato:
        if tentativi <= 3:
            voto = "LEGGENDA 🏆"
        elif tentativi <= 6:
            voto = "ESPERTO 🥇"
        elif tentativi <= MAX_TENTATIVI:
            voto = "BRAVO 🥈"
        print(f"\n🎉 Hai indovinato in {tentativi} tentativi! Voto: {voto}")
    else:
        print(f"\n💀 Hai perso! Il numero era: {numero_segreto}")

# Loop principale
print("╔══════════════════════════════════════╗")
print("║   🎲  INDOVINA IL NUMERO!  🎲        ║")
print("╚══════════════════════════════════════╝")

while True:
    gioca()
    ancora = input("\nVuoi giocare ancora? (s/n): ")
    if ancora.lower() != "s":
        print("\nGrazie per aver giocato! Alla prossima! 👋")
        break

Analisi del Codice Completo

Nota come il codice finale usa le funzioni (def scegli_difficolta() e def gioca()) per organizzare il programma in blocchi logici. Il programma principale in fondo è solo 6 righe — tutto il resto è nascosto dentro funzioni chiare e riutilizzabili. Questo è il modo in cui i programmatori professionisti strutturano il codice.

Nota anche le f-string: f"Ho {tentativi} tentativi" — il modo moderno e leggibile per inserire variabili nel testo. La f prima delle virgolette dice a Python: "le cose tra {} sono variabili, non testo".


Curiosità: La Ricerca Binaria

Il numero teorico minimo di tentativi per indovinare un numero tra 1 e 100 è 7 — se usi sempre la strategia della ricerca binaria: indovina sempre il numero di mezzo tra il minimo e il massimo ancora possibili. Questo è lo stesso algoritmo che usano i computer per cercare dati in database enormi in millisecondi!


Provaci tu! — Il Torneo della Classe

Organizza un torneo con i tuoi amici. Ognuno deve indovinare lo stesso numero segreto (impostalo nel codice invece di generarlo). Chi usa meno tentativi vince. Poi discutete: qual è la strategia migliore? Chi ha iniziato dal numero 50 ha fatto meglio di chi ha iniziato da 1?


Il Piccolo Glossario

| Termine | Definizione | | --------- | ------------- | | Thonny | IDE gratuito e semplice, perfetto per imparare Python. Scaricabile su thonny.org. | | Libreria (o modulo) | Raccolta di funzioni già pronte che puoi importare nel tuo programma con import. | | random | Libreria standard di Python per generare valori casuali. | | int() | Funzione che converte un valore in numero intero. int("42") → 42. | | input() | Funzione che legge una riga di testo scritta dall'utente da tastiera. | | Indentazione | Il rientro di 4 spazi che indica a Python quali righe appartengono a un blocco (if, while, def). | | f-string | Stringa che inizia con f"..." e permette di inserire variabili tra {}. | | break | Istruzione che esce immediatamente dal ciclo while o for in cui si trova. | | Bug | Errore nel codice che causa un comportamento inatteso. Il termine nasce da una falena reale trovata dentro un computer nel 1947! |


Prossimo capitolo

Capitolo 2: Quiz Show — Diventa il re delle domande
Liste, dizionari, ciclo for, enumerate(), random.shuffle, file I/O, multiplayer a turni. Codice completo con 4 sfide: timer suspense, high score su file, domande da file esterno, modalità 2 giocatori.


Questo post è un estratto dal libro "Divento Programmatore: Python e i Giochi" (Volume 2 della collana "Cervello Elettronico") di Rocco Balzamà. Target: 10-14 anni · ~180 pagine · Thonny + VS Code.

Per approfondire

Fonti e riferimenti

Condividi LinkedIn Facebook X WhatsApp
Continua a leggere

Tutti gli articoli del blog

Strumenti gratuiti