Prima consegna: solutori
Gli esercizi delle teche accompagnano la preparazione dell’esame. Consegna i solutori che hai implementato.
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.
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.
Regole del gioco, interfaccia Python, consegne e torneo.
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.
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.
| Oggetto | Regola |
|---|---|
| Reperto ordinario | Vale 1 punto; si raccoglie automaticamente entrando nella cella. |
| Teca con bottino | Vale 3 punti; richiede una minichallenge corretta. |
| Teca con pass | Assegna 1 pass e 0 punti. I pass sono accumulabili. |
| Azione | Regola |
|---|---|
| Movimento | Una cella verso nord, sud, est o ovest. Nessuna diagonale. |
| Apertura | Entra sulla teca e usa un’azione successiva per aprirla. Le teche chiuse sono attraversabili. |
| Caratteristica | Regola |
|---|---|
| Occupazione | Due agenti non possono occupare la stessa cella. |
| Turni | Azioni alternate. Dopo ogni azione il motore aggiorna lo stato prima di chiamare l’altro bot. |
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.
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.
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 cella | Significato |
|---|---|
"#" | 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.
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.
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.
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, memoriaLa 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.
| Azione | Effetto |
|---|---|
{"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. |
Non è necessario scrivere il motore né implementare ogni challenge. Anche un agente semplice può raccogliere reperti ordinari e partecipare.
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.
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.
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.
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 strategiaIl 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.
Gli esercizi delle teche accompagnano la preparazione dell’esame. Consegna i solutori che hai implementato.
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.
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.
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.
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.
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.
Le regole qui descritte sono quelle concordate per la versione attuale. Prima della consegna finale saranno pubblicati:
Guida aggiornata alle decisioni dell’11 ottobre 2026. Il replay della demo qui sopra appartiene al primo prototipo e non sostituisce queste specifiche.