← Tutte le idee Giochi e hobby

SimCity, ma con i permessi

Un gioco di costruzione di città dove il nemico vero è la burocrazia

Cosa fa

Gioco nel browser che prende in giro la burocrazia: per costruire la tua città devi ottenere permessi, timbri e autorizzazioni. Ha ricevuto quasi mille voti su Hacker News.

Come guadagna

Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: versione completa a pagamento una tantum, pubblicità sui portali di giochi.

Rendilo tuo

  • La versione italiana sarebbe irresistibile: SCIA, marche da bollo, uffici chiusi il pomeriggio.
  • I giochi satirici girano molto sui social: ogni livello è un meme.

Le frasi da scrivere all'AI

1. Base del sito e grafica

Crea un'app web in italiano chiamata "Permesso Negato": un gioco satirico nel browser: costruisci la tua città, ma ogni edificio richiede permessi, timbri e moduli che dipendono da altri permessi. Ridere della burocrazia giocando. Usa React, Vite, TypeScript e Tailwind CSS.

Pagine da creare:
1. Pagina iniziale con "Gioca" e qualche schermata
2. Mappa della città a griglia con gli edifici
3. Ufficio: le pratiche aperte, i moduli da compilare, le code
4. Il catalogo dei permessi con le loro dipendenze assurde
5. Classifica: città più grande costruita in meno giorni

Stile: satirico da ufficio anni '80: sfondo carta da modulo #F5F1E3, verde ministeriale #3F6212, timbri rossi #B91C1C, carattere "Courier Prime" per i moduli e "Inter" per il resto, edifici in pixel art. Nessuna immagine generica di stock.

Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.

2. Database, account e sicurezza

Collega il progetto a Supabase e attiva la registrazione con email e password.

Crea queste tabelle:
- "partite": stato della città in JSON, giorno di gioco, punteggio, collegate all'utente (facoltativo)
- "classifica": nome, abitanti raggiunti, giorni impiegati

Regole di sicurezza obbligatorie:
- si gioca anche senza account, salvando nel browser
- ogni utente vede solo le sue partite; la classifica è pubblica con solo nome e punteggio
- il piano non si modifica dal browser

Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.

3. Permessi che dipendono da altri permessi

Ogni edificio richiede dei permessi; ogni permesso ha requisiti (altri permessi, giorni di attesa, costi, "marca da bollo") descritti come dati. Esempio: il panificio richiede "Agibilità", che richiede "Certificato di conformità", che richiede... il panificio già costruito.

Il gioco calcola l'ordine in cui ottenere i permessi e rileva i cicli assurdi (codice nei Dettagli tecnici): quando ne trova uno, compare un evento ironico ("Il funzionario va in ferie") e una via d'uscita a pagamento in monete del gioco ("Deroga straordinaria").

Eventi casuali: sciopero degli uffici, modulo cambiato senza preavviso, timbro sbagliato. Tutti i nomi sono inventati: nessun riferimento a uffici o persone reali.

4. Ufficio e classifica

La schermata "Ufficio" mostra le pratiche in corso con le code (numerini che scorrono), e moduli da compilare con campi volutamente ridondanti ("Scrivi il tuo nome. Ora riscrivilo in stampatello").

Classifica pubblica: abitanti raggiunti e giorni di gioco. Condivisione di un'immagine con la città e il "record di timbri".

5. Pagamenti con Stripe

Aggiungi un pagamento singolo di 3,99 € una volta sola. Il pagamento sblocca le altre 3 città (Comune montano, Città metropolitana, Isola), la modalità infinita e toglie la pubblicità.

A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.

Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.

6. Controlli specifici di questo progetto

Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Gioco: verifica che ogni partita sia sempre vincibile: ogni ciclo di permessi deve avere una via d'uscita.
Correggi quello che non va e scrivimi cosa hai cambiato.

Dettagli tecnici

Ordine dei permessi e cicli assurdi

Ordina i permessi in modo che ognuno venga dopo quelli che richiede (ordinamento topologico). Se trova un permesso che, giro dopo giro, richiede se stesso, segnala il ciclo.

type Permessi = Record<string, string[]>;   // permesso -> permessi richiesti

export function ordinePermessi(obiettivo: string, permessi: Permessi):
  { ordine: string[] } | { ciclo: string[] } {
  const ordine: string[] = [];
  const stato = new Map<string, "visita" | "fatto">();
  const percorso: string[] = [];

  function visita(p: string): string[] | null {
    if (stato.get(p) === "fatto") return null;
    if (stato.get(p) === "visita") {                   // già in corso: è un ciclo
      return [...percorso.slice(percorso.indexOf(p)), p];
    }
    stato.set(p, "visita");
    percorso.push(p);
    for (const richiesto of permessi[p] ?? []) {
      const ciclo = visita(richiesto);
      if (ciclo) return ciclo;
    }
    percorso.pop();
    stato.set(p, "fatto");
    ordine.push(p);                                    // dopo tutti i suoi requisiti
    return null;
  }

  const ciclo = visita(obiettivo);
  return ciclo ? { ciclo } : { ordine };
}

// ordinePermessi("Panificio", {
//   Panificio: ["Agibilità"], Agibilità: ["Conformità"], Conformità: ["Panificio"],
// }) -> { ciclo: ["Panificio", "Agibilità", "Conformità", "Panificio"] }

Pezzi comuni a tutti i progetti

Glossario

JSONB
Un tipo di colonna che contiene dati strutturati flessibili, come un piccolo documento.
Ordinamento topologico
Mettere in fila delle cose in modo che ognuna venga dopo quelle da cui dipende.