Textics

Ciao ragazzi!

Voglio presentare un piccolissimo videogame, una piccola applicazione di nome Textics. Si tratta di un videogame testuale, che si gioca direttamente da console, senza alcuna grafica.

L’obiettivo del gioco è quello di raggiungere l’uscita di ogni stanza senza farsi catturare dai nemici. Alcuni di questi saranno immobili, e basterà non passargli davanti: altri invece si muoveranno secondo pattern prestabiliti, e sarà dunque utile osservare i loro movimenti prima di agire!

L’area di gioco è divisa in righe e colonne, come una scacchiera: ogni cella è individuata da una coppia di coordinate, del tipo (A;g).

Di seguito uno screen del gioco:

Textics screenshot

Legenda:

  • P: la posizione del giocatore
  • E: la posizione del nemico
  • +: la linea visiva del nemico: se ci si passa sopra, si viene catturati!
  • X: l’uscita da raggiungere
  • | oppure _: questi caratteri rappresentano dei muri, su cui il giocatore non può andare e oltre cui i nemici non possono vedere (ovviamente!)

Comandi

Per controllare il giocatore, è possibile utilizzare i seguenti comandi:

  • goto Xy: vai alla casella di coordinate (X; y)Attenzione: il giocatore può muoversi solo in linea retta!
  • wait: aspetta un turno di gioco, così da poter osservare il movimento dei nemici.;
  • exit: supera l’uscita e passa al prossimo livello. Valido solo se ci si trova in una casella adiacente all’uscita;
  • menu: torna al menu principale;
  • quit: chiude il gioco.

Struttura dei livelli

I livelli sono salvati all’interno del file levels.dat. Si tratta di un file XML, che viene letto dall’eseguibile ed utilizzato per creare i livelli. L’utente può liberalmente modificarlo per creare nuovi livelli, semplicemente aggiungendo nuovi dati alla fine del file.

Ecco come. Per prima cosa, bisogna creare un nodo <level id=”xx”>…</level> alla fine del file (ma sempre all’interno del root <levels>), e aggiornare il contatore all’inizio del file <levels count=”xx”>.

Di seguito la lista di tutti i possibili elementi che possono essere aggiunti al livello. Nota: le coordinate xy di ogni nodo devono essere valori numerici compresi tra 0 e 19.

I nodi che vanno obbligatoriamente aggiunti sono:

  • <player x=”xx” y=”yy” />, che individua la posizione del giocatore;
  • <exit x=”xx” y=”yy” />, che individua la posizione dell’uscita.

Gli altri nodi sono:

  • <hwall x=”xx” y=”yy” />, che individua un muro orizzontale, rappresentato sulla mappa dal carattere ‘_’;
  • <vwall x=”xx” y=”yy” />, che individua un muro verticale, rappresentato sulla mappa dal carattere ‘|’;
  • <enemy x=”xx” y=”yy” view=”u/r/l/d” />, che individua un nemico. Il parametro view, i cui possibili valori sono u, r, l, d rappresenta da che lato il nemico è rivolto: nell’ordine, up, right, left, down.
    • Si è già detto che i nemici possono muoversi secondo pattern prestabiliti. Per far ciò, è necessario aggiungere al nodo enemy un nodo <movement>, al cui interno vanno aggiunti tanti nodi <point> quanti sono i punti che il nemico deve raggiungere (escluso il punto di partenza). La sintassi è la seguente: <point x=”xx” y=”yy” view=”u/r/l/d” />.
  • <dialogue>, che può essere aggiunto all’inizio del livello: in esso, racchiuso all’interno del tag <![CDATA[ … ]]>, è possibile inserire il testo che si vuole venga visualizzato alla destra della mappa. Esso deve essere composto al massimo da 20 righe, ognuna delle quali può contenere un massimo di 30 caratteri.

Conclusioni

Allo stato attuale, il gioco conta soltanto 10 livelli, e richiederà non più di una manciata di minuti per essere completato. I progressi vengono salvati dopo ogni livello superato, ed è possibile riprendere il gioco in qualsiasi momento.

In futuro, potrei aggiungere un sistema di inventario, con la possibilità di raccogliere chiavi per aprire l’uscita e altri gadget che possono aiutare il giocatore.

Il codice può essere visualizzato nell’apposito repository, e l’archivio con l’eseguibile è scaricabile da qui.

Stay tuned!

Annunci

Expeditus: prima demo

Ciao ragazzi!

Eccomi dopo un po’ di tempo con un nuovo aggiornamento riguardante Expeditus.

Il sistema per i dialoghi è ormai completato: legge testi da file binari, è possibile utilizzare l’animazione che simula il battere a macchina (mostra un carattere alla volta), può mostrare un singolo o una sequenza di dialoghi, e chiede all’utente di rispondere YES o NO ad eventuali domande.

Dopo la fase di introduzione, vi è una piccolissima demo che mostra la feature NPC patterns: il rettangolino rosso inizia a muoversi in tondo seguendo sempre lo stesso pattern, finché non viene riacciuffato.

In fondo al post vi è uno screenshot.

Qui è possibile scaricare l’eseguibile con le librerie necessarie; per consultare il codice sorgente vi rimando al repository.

Stay tuned!

Expeditus: sistema dialoghi

Seppur con lentezza e qualche difficoltà, lo sviluppo del progetto Expeditus procede. Il sistema di dialogo è ormai pronto, anche se manca la possibilità di fornire risposte (i semplici YES/NO): questa feature verrà presto implementata.

Alla fine del post, una gif mostra la finestra di dialogo in azione. Ho voluto rendere un piccolo omaggio al mondo dei Pokémon, ricavando le prime battute del Prof. Oak da Pokémon Versione Oro.

Vi invito a seguire il repository ufficiale per informazioni più frequenti e dettagliate.

Update: ora è presente un piccolo cursore animato in basso a destra.

Stay tuned!

Nuovo progetto: Expeditus

Salve a tutti!

Oggi voglio parlarvi del progetto a cui sto lavorando in questi giorni: Expeditus. Il titolo è latino, e sta per agile, armato, pronto.

Si tratta di un piccolo videogioco d’avventura in 2D, con vista dall’alto in stile Pokémon. Alla base del gioco vi sono delle carte, che il giocatore potrà collezionare, scambiare, ed utilizzare per compiere qualsiasi azione.

Esistono quattro tipi di carte:

object_cardCarte oggetto: rappresentano un oggetto che può essere utilizzato dal giocatore, come una pozione o un indumento;

utility_cardCarte utilità: rappresentano strumenti utilizzabili dal giocatore, come la capacità di spostarsi velocemente da un punto ad un altro della mappa;

battle_cardCarte combattimento: rappresentano i tipi di attacchi (o difesa) utilizzabili dal giocatore in combattimento;

special_cardCarte speciali: sono carte molto rare e potenti, che danno grande vantaggio al giocatore che le utilizza.

Ulteriori dettagli sulla struttura del gioco verranno condivise appena disponibili.

Ci tengo a sottolineare che in questo progetto non ho come obiettivo quello di produrre un videogioco nel tentativo di competere con gli altri, di ottenere numerosi download, né tantomeno vendite. L’obiettivo principale di Expeditus è fornirmi una base di sperimentazione per le mie capacità di programmazione, che spero miglioreranno con l’aiuto di questo gioco.

Proprio per questo motivo, cercherò di non utilizzare librerie esterne (al limite del possibile), ma di produrre io stesso tutto il codice. Il linguaggio di programmazione utilizzato è C++, con Lua per la parte di scripting relativa all’utilizzo delle carte.

A breve sarà disponibile un repository pubblico su bitbucket.org, tramite cui sarà possibile visionare e scaricare il codice sorgente.

Update: Il repository è ora online!

Stay tuned!

 

Risolutore di sudoku

Versione italiana (english version below)

Oggi voglio presentarvi un risolutore di sudoku che ho scritto in C++. Si tratta di un programma non troppo complicato, ma che consente di esercitarsi bene nell’utilizzo del linguaggio.

Nota: risolve solo i sudoku più semplici

Il funzionamento è molto semplice: per ogni cella, il programma considera tutte le possibilità, da 1 a 9. Poi, per ogni cella, esclude le alternative impossibili: così via per tutte le celle, fino a risolvere il sudoku.

Il software ricava l’input dal file di testo ‘sudoku.txt’, che contiene il sudoku nella forma mostrata in figura.

sudokuOgni cella è separata da una virgola, ogni riga da un a capo;

le x rappresentano le celle vuote che il software dovrà riempire.

Il software è molto veloce: tutti i sudoku che ho provato sono stati risolti in meno di un secondo.

Il codice dovrebbe risultare abbastanza chiaro e di facile lettura. All’interno della funzione main(), durante la lettura del testo dal file, vi è un comando all’interno della direttiva #ifdef _WIN32. Quando si utilizza Windows, infatti, il carattere “a capo” è reso con la coppia CRLF (o ‘rn’), mentre su sistemi Unix solo con ‘n’. Tale comando serve a rimuovere il carattere ‘r’ e proseguire con il normale svolgimento del programma.

Stay tuned!