M / CMuseo delle cose
inspiegabilmente preziose
TUTORAGGIO · FONDAMENTI DI PROGRAMMAZIONE

Il colpo del semestre.

Un museo assurdo, due bot Python e un bottino da conquistare. Qui trovi il regolamento e la guida per costruire il tuo agente, un esercizio alla volta.

Leggi la guida ↓Guarda la demo ↓Attività facoltativa · Singoli o coppie
GUARDA IL GIOCO IN AZIONE

Una partita al museo.

Avvia il replay o esplora le azioni un passo alla volta. Mappa: .

Demo illustrativa. Questo è un replay registrato del primo prototipo, non esegue il tuo codice. Per le regole aggiornate consulta la guida qui sotto.

PARTITA DI ESIBIZIONEINIZIO
Reperto +1Raccolta automatica
Teca punti +3Si apre con una minichallenge
Teca bonus · Pass parete0 punti · attraversa 1 parete
Muro
Spazio: pausa · ← →: un’azione · Home / End: inizio / fine
IL TUO PIANO, UN ESERCIZIO ALLA VOLTA

Guida alla competizione.

Regole del gioco, interfaccia Python, consegne e torneo.

01 / Il tuo colpo al museo

Una volta l’anno il Museo delle Cose Inspiegabilmente Preziose organizza un furto autorizzato. Due agenti automatici si contendono i reperti del museo. Il tuo compito è programmare un bot Python che scelga dove andare, raccolga bottino e apra le teche di cui sa risolvere la minichallenge.

Vince la partita chi raccoglie più punti. Il bottino ottenuto è subito al sicuro: non occorre riportarlo a una base e non può essere sottratto. La competizione riguarda gli oggetti ancora sulla mappa e l’occupazione dei passaggi; non ci sono combattimenti, guardie o punti vita.

Partecipazione completamente facoltativa. Il tutoraggio resta dedicato soprattutto alle esercitazioni classiche. Una parte degli esercizi sarà ambientata nel museo, seguendo gli argomenti del corso e spesso riprendendo problemi d’esame. Si partecipa da soli o in coppia, con organizzazione flessibile in base alle presenze.

Puoi partecipare anche entrando più avanti o senza implementare tutte le challenge: avrai un agente base, consegne, esempi e test. Gli esercizi possono diventare sia solutori delle teche sia componenti utili alla strategia.

02 / Oggetti, azioni e fine partita

Oggetti e premi

OggettoRegola
Reperto ordinarioVale 1 punto; si raccoglie automaticamente entrando nella cella.
Teca con bottinoVale 3 punti; richiede una minichallenge corretta.
Teca con passAssegna 1 pass e 0 punti. I pass sono accumulabili.

Azioni

AzioneRegola
MovimentoUna cella verso nord, sud, est o ovest. Nessuna diagonale.
AperturaEntra sulla teca e usa un’azione successiva per aprirla. Le teche chiuse sono attraversabili.

Regole della partita

CaratteristicaRegola
OccupazioneDue agenti non possono occupare la stessa cella.
TurniAzioni alternate. Dopo ogni azione il motore aggiorna lo stato prima di chiamare l’altro bot.

Il pass parete

Con un pass puoi superare una sola cella di muro adiacente e atterrare nella cella immediatamente successiva, due celle più avanti nella stessa direzione. L’attraversamento costa un’azione. La destinazione deve essere dentro la mappa, diversa da un muro e libera dall’avversario. Se contiene un reperto lo raccogli; se contiene una teca, l’apertura richiede un’altra azione.

Ogni attraversamento riuscito consuma un pass. Se l’azione non è valida, perdi il turno ma conservi il pass. Puoi raccogliere più pass, anche conquistando una teca per impedirne l’uso all’avversario.

Durata e risultato

Ogni bot dispone di un massimo di 60 azioni, incluse attese e azioni fallite. La partita termina prima se non restano reperti ordinari né teche con punti per cui almeno un bot abbia ancora un tentativo disponibile. Una teca conta anche se il bot non ha registrato il solutore: il motore non valuta la sua strategia. Le sole teche con pass non prolungano la partita. Vince chi ha più bottino; a pari punti la partita è pareggiata.

Questi sono i valori della versione attuale. Il bilanciamento deve ancora essere verificato con prove sistematiche; eventuali modifiche saranno comunicate prima della consegna finale.

03 / La mappa e lo stato della partita

La mappa è una matrice Python: una lista di liste. Le coordinate sono (riga, colonna), a partire da zero; (0, 0) è in alto a sinistra. Per leggere una cella usa mappa[riga][colonna].

Contenuto della cellaSignificato
"#"Muro
"."Pavimento
"R"Reperto ordinario
"T1", "T2", …Identificativo di una teca, presente anche nel dizionario dei dettagli
mappa = [
    ["#", "#",  "#", "#", "#"],
    ["#", ".",  "R", ".", "#"],
    ["#", "T1", "#", ".", "#"],
    ["#", ".",  ".", ".", "#"],
    ["#", "#",  "#", "#", "#"],
]

teche = {
    "T1": {
        "posizione": (2, 1),
        "challenge": "codice_etichetta",
        "premio": "punti",
        "valore": 3,
    }
}

Il motore passa i dettagli delle teche in un dizionario con identificativo come chiave. Garantisce la coerenza tra dizionario e griglia. Dopo un’apertura riuscita la teca viene rimossa dalle disponibilità e la cella diventa pavimento; lo stesso avviene raccogliendo un reperto.

Le posizioni degli agenti sono passate separatamente, così non nascondono il contenuto della cella. Tutta la mappa è visibile, comprese posizioni dell’avversario, tipo di challenge e premio delle teche.

Cosa riceve il bot

Lo stato è un dizionario con mappa, dettagli delle teche, posizioni e punteggi degli agenti, pass disponibili, azioni rimanenti, disponibilità dei tentativi ed esito dell’ultima azione. I nomi completi dei campi e le specifiche tecniche saranno pubblicati con il motore; gli esempi qui illustrano il contratto concordato.

Mappe pubbliche, gara inedita

Avrai mappe di allenamento pubbliche. Le mappe del torneo saranno inedite, ma conformi a specifiche rese disponibili in anticipo: dimensioni ammesse, simboli e garanzie di costruzione. Non sarà necessario conoscere una particolare mappa per costruire un bot funzionante.

04 / Cosa devi implementare

Il motore comune gestisce mappe, turni, verifica delle risposte e punteggi. Tu scrivi la strategia del bot e, facoltativamente, i solutori delle teche.

def scegli_azione(stato, memoria):
    azione = {"tipo": "muovi", "direzione": "nord"}
    return azione, memoria

La funzione viene chiamata a ogni tuo turno e restituisce azione, nuova_memoria. L’azione è un dizionario. La memoria personale è un dizionario inizialmente vuoto, conservato tra i turni e azzerato a ogni partita: puoi usarlo per ricordare una destinazione o un percorso, oppure lasciarlo vuoto.

AzioneEffetto
{"tipo": "muovi", "direzione": "nord"}Un passo; direzioni: nord, sud, est, ovest.
{"tipo": "apri"}Tenta la teca nella cella attuale.
{"tipo": "pass", "direzione": "est"}Attraversa un muro consumando un pass.
{"tipo": "aspetta"}Resta fermo per un turno.
Una base da cui partire, e da migliorare. Forniremo un agente funzionante e funzioni di supporto molto basilari per controllare mosse e trovare percorsi. Puoi usarle, ma ti incoraggiamo a migliorarle e costruirci sopra una strategia personale. Gli esercizi del tutoraggio potranno diventare componenti del tuo agente.

Non è necessario scrivere il motore né implementare ogni challenge. Anche un agente semplice può raccogliere reperti ordinari e partecipare.

05 / Le minichallenge nelle teche

Le teche contengono problemi conosciuti in anticipo: normali esercizi Python, spesso simili a quelli d’esame, riadattati al museo. Durante la gara cambiano gli input, non il tipo di problema. Il solutore deve quindi funzionare su nuove istanze.

def risolvi_etichetta(dati):
    # Implementa la soluzione secondo la consegna della challenge.
    ...

solutori = {
    "codice_etichetta": risolvi_etichetta,
    # Aggiungi soltanto le challenge che hai implementato.
}

Quando scegli {"tipo": "apri"}, il motore identifica la challenge e chiama automaticamente solutori[nome_challenge](dati). Il solutore restituisce la risposta; il motore la verifica e assegna il premio. La funzione non modifica direttamente mappa o punteggio.

Ogni bot ha un tentativo per ogni teca. La risposta corretta apre la teca e assegna immediatamente il premio al bot, rimuovendo la teca per entrambi. Una risposta errata, un’eccezione o il superamento del limite di esecuzione consumano l’azione e il tentativo di quel bot. L’altro può ancora provarci. L’input della teca resta invariato durante la partita.

Le challenge sono bonus, non requisiti di partecipazione. Specifiche, esempi e test pubblici saranno disponibili prima della gara, insieme a partite di allenamento ripetibili. Gli input del torneo saranno nuovi.

Per challenge su file, cartelle o immagini, il motore fornirà i dati e gli strumenti necessari secondo la relativa consegna.

06 / Errori e strumenti per provare

Il motore avvisa il bot quando un’azione fallisce. Al turno successivo lo stato contiene l’esito della sua ultima azione, con un codice di errore e una breve descrizione. Gli errori compariranno anche nel resoconto della partita.

stato["ultima_azione"] = {
    "riuscita": False,
    "errore": "destinazione_occupata",
    "messaggio": "La destinazione è occupata dall'altro agente.",
}

Gli errori possono riguardare, per esempio, una destinazione fuori mappa, un muro, una cella occupata, l’assenza di un pass o un problema nel solutore. I codici completi saranno documentati con il motore.

Le azioni fallite consumano il turno. Un pass non valido resta nell’inventario; un tentativo di challenge fallito esaurisce il tentativo sulla teca. Le verifiche preliminari dell’azione e le regole per gli altri errori saranno precisate nel contratto tecnico.

Ambiente di esecuzione

Sono consentiti la libreria standard Python, gli strumenti forniti e i moduli scritti dagli studenti inclusi nella consegna. Nessuna dipendenza esterna da installare e nessun accesso a Internet. Il bot lavora sullo stato ricevuto e sui dati messi a disposizione per le challenge.

I limiti di tempo e memoria saranno generosi, uguali per tutti e pubblicati con il motore. La velocità del codice non assegna punti aggiuntivi. Saranno forniti un progetto minimo, test delle challenge e strumenti per provare partite localmente; il pacchetto di avvio non è ancora disponibile su questo sito.

07 / Preparazione e consegna

La consegna finale è una cartella compressa in formato ZIP. Deve contenere bot.py, dove il motore troverà scegli_azione e il dizionario solutori. Puoi aggiungere altri moduli Python per separare strategia, solutori e funzioni di supporto.

# Possibile organizzazione della cartella:
# bot.py        — funzione scegli_azione e dizionario solutori
# teche.py      — solutori (facoltativo)
# percorsi.py   — funzioni di supporto (facoltativo)
# README.md    — partecipanti, nome del bot e strategia

Il modello minimo funzionerà anche con il solo modulo Python bot.py. Aggiungi un breve README.md con i nomi dei partecipanti, il nome del bot e una descrizione della strategia.

PRIMA DEGLI APPELLI

Prima consegna: solutori

Gli esercizi delle teche accompagnano la preparazione dell’esame. Consegna i solutori che hai implementato.

DOPO GLI APPELLI

Consegna finale: progetto completo

Consegna lo ZIP con strategia e solutori. Puoi correggere i solutori fino a questa scadenza. Seguono torneo e presentazioni.

Date e canale di consegna saranno annunciati. Non è richiesto recuperare tutti gli esercizi o implementare ogni solutore per partecipare.

08 / Torneo, classifica e spareggi

Il formato previsto è un girone unico, poi una fase finale per i migliori quattro bot, con semifinali e finale. Il formato potrà essere adattato al numero di partecipanti e sarà comunicato prima del torneo.

Ogni coppia di bot si affronta su più mappe. Per ogni mappa si giocano due partite, scambiando le posizioni iniziali e chi agisce per primo. Nel girone, ogni singola partita assegna 3 punti per una vittoria, 1 per un pareggio e 0 per una sconfitta. I punti di classifica sono distinti dai punti di bottino.

Ordine dei criteri di spareggio

  1. Scontri diretti. Si considera il risultato degli incontri tra i bot a pari merito.
  2. Mappa di spareggio. Se resta parità, si rigioca lo scontro diretto su una mappa fuori dal pool precedente, con due partite scambiando partenze e primo giocatore.
  3. Bottino totale. Se resta parità, passa il bot con il maggior bottino acquisito durante tutto il torneo, compreso lo spareggio.
  4. Merito del codice. Se anche il bottino è pari, il tutor valuta chiarezza, correttezza, robustezza e organizzazione del codice. Non si premiano complessità, tecniche avanzate o micro-ottimizzazioni.

In caso di parità tra più bot, si considera prima la classifica degli incontri tra i soli bot interessati, poi si applicano i criteri alle parità residue. La procedura vale per l’accesso alla fase finale e per gli incontri a eliminazione; il dettaglio operativo per eventuali spareggi a più bot sarà annunciato con il formato definitivo.

L’evento finale

Ogni squadra presenterà il bot in circa 4–5 minuti, raccontando strategia, un solutore, scelte personali e una difficoltà incontrata. Seguirà una breve domanda sul codice o su una variante. Tutti i componenti contribuiranno; le slide sono facoltative. Presentazioni e partite potranno essere alternate: ci interessano le vostre idee e ciò che avete imparato, oltre al piazzamento.

09 / Prima prova con le tue forze

Per imparare è importante tentare una soluzione, fare esperimenti, sbagliare e dedicare un po’ di tempo a capire dove sei bloccato. Anche “sbatterci la testa” fa parte del percorso: riuscire a risolvere un problema con le proprie idee è più soddisfacente e aiuta a costruire autonomia.

Se non riesci a proseguire, puoi usare strumenti di supporto, inclusa l’IA, per ottenere un indizio, chiarire un concetto o capire un errore. Devi comunque comprendere, saper spiegare e modificare tutto il codice che consegni.

Durante il tutoraggio daremo spazio a primi tentativi personali, esempi risolti a mano, piccole varianti e spiegazioni tra studenti. La presentazione finale è un’occasione per condividere il lavoro svolto.

10 / Cosa sarà annunciato

Le regole qui descritte sono quelle concordate per la versione attuale. Prima della consegna finale saranno pubblicati:

  • Date delle due consegne, canale di invio ed evento finale.
  • Pacchetto di avvio, motore, funzioni basilari di supporto e comandi per provare il bot.
  • Specifiche complete dello stato, dei solutori e dei codici di errore, versione Python e limiti di tempo e memoria.
  • Catalogo delle challenge con consegne, esempi, test e strumenti per i relativi dati.
  • Dimensioni ammesse, garanzie delle mappe, numero di mappe e partite, e formato definitivo del torneo.
  • Eventuali aggiustamenti ai valori dopo le prove di bilanciamento.

Guida aggiornata alle decisioni dell’11 ottobre 2026. Il replay della demo qui sopra appartiene al primo prototipo e non sostituisce queste specifiche.