Rettangoli colorati con ugBASIC

Screenshot che mostra i rettangoli colorati sullo ZX Spectrum

Da tempo desideravo provare ugBASIC, linguaggio isomorfo compilato, che permette di produrre programmi per una moltitudine di piattaforme (computer e console) a 8 bit a partire da un unico codice sorgente. A rendere ancora più accattivante il tutto è ugBASIC IDE, un ambiente integrato per Windows che permette di installare le toolchain per le piattaforme desiderate e scrivere, compilare ed eseguire programmi mediante gli appositi emulatori con pochissimi click.

Ho quindi colto l’occasione offerta dalla sfida della settimana, indetta lo scorso venerdì sul gruppo Facebook RetroProgramming Italia, per cimentarmi con ugBASIC. Lo scopo della sfida è realizzare un programma (in qualsiasi linguaggio e per qualsiasi macchina a 8/16 bit) per disegnare rettangoli colorati in modo molto veloce.

Screenshot C64 che mostra l'obiettivo della sfida
Immagine rappresentativa dell’obiettivo della sfida della settimana
(text mode standard del Commodore 64)

L’animazione dei rettangoli colorati ha immediatamente richiamato alla mia mente il programma dimostrativo BGIDemo, incluso nelle distribuzioni Turbo Pascal degli anni ’80 per mostrare le potenzialità delle librerie grafiche di Borland e che in gioventù ammiravo con stupore. Che nostalgia!

Screenshot del programma BGIDemo per Turmo Pascal
Random bars – dal programma BGIDemo per Turbo Pascal 5 di Borland

Ho quindi buttato giù il seguente programmino, per disegnare i rettangoli mediante stringhe formate da spazi vuoti, utilizzando posizione, dimensione e colore casuali.

BITMAP ENABLE
sc = SCREEN COLUMNS: sr = SCREEN ROWS: pc = PAPER COLORS
CLS
LOCATE 0, sr-1
PRINT "COLS:";sc;" ROWS:";sr;" COLORS:";pc;
s$ = "": FOR i=1 TO sc: s$ = s$ + " ": NEXT
DO
	PAPER RND(pc)
	x = RND(sc)
  	y = RND(sr - 1)
  	w = 1 + RND(sc - x)
  	h = 1 + RND(sr - 1 - y)
  	ss$ = LEFT$(s$, w)
  	FOR yy = y TO y+h-1
  		LOCATE x, yy
  		PRINT ss$;
  	NEXT
LOOP

Ho poi compilato il programma utilizzando lo ZX Spectrum come target, riscontrando però un paio di anomalie, che si possono osservare in questo video. L’istruzione PAPER, infatti, oltre allo sfondo alterava anche il colore del bordo. Inoltre, mentre nonostante il numero di colori restituito PAPER COLORS fosse 16, in output erano visibili solo gli 8 colori senza l’attributo bright.

Ho segnalato i problemi all’autore di ugBASIC Marco Spedaletti, il quale, dopo solo poche ore, ha rilasciato un COLDFIX che ha risolto entrambi i bug. Se solo il supporto di [inserisci qui il nome di una qualsiasi azienda fornitrice di energia/servizi telefonici] fosse altrettanto solerte, si vivrebbe in un mondo migliore, ma questa è un’altra storia…

Dopo un aggiornamento dei compilatori direttamente in ugBASIC IDE, sono riuscito ad ottenere una versione corretta dell’eseguibile, come si può osservare in questo video:

I rettangoli colorati sullo ZX Spectrum (emulatore Fuse)

Infine, dato che ugBASIC nasce come ambiente di sviluppo multipiattaforma, ho compilato una versione del programma per MSX e qui si può osservare il risultato:

I rettangoli colorati su MSX (emulatore openMSX)

Link e Riferimenti

Screenshot che mostra i rettangoli colorati sullo ZX Spectrum
I rettangoli colorati sullo ZX Spectrum

Un giorno alle corse degli animali

A Day At The Animal Races è una versione per Sinclair ZX Spectrum 16/48K del videogioco di scommesse su corse di animali VIP Animal Race.

A Day At The Animal Races in esecuzione a 14 MHz sullo ZX Spectrum Next (emulato con #CSpect)

Il gioco originale fu sviluppato da Brian Astle per l’interprete CHIP-8 fornito con il computer COSMAC VIP e pubblicato nel RCA COSMAC VIP Game Manual nel 1978. Nel video seguente, puoi osservare il gioco in azione sullo ZX Spectrum Next, grazie a CHIP-OTTO, la macchina virtuale CHIP-8 di mia realizzazione.

VIP Animal Race in esecuzione su CHIP-OTTO per ZX Spectrum Next (emulato con #CSpect)

A Day At The Animal Races è il mio secondo gioco (il primo è Squash Trainer) in gara per la 12a edizione (2023) del BASIC 10 Liner Contest, categoria PUR-80. Puoi scaricarlo o giocare online accedendo alla pagina retrobits.itch.io/animalrace10l. Il download include il listato del programma e la documentazione dettagliata.

Come giocare

Cinque diversi animali gareggiano l’uno contro l’altro e tu hai la possibilità di mettere alla prova la tua abilità nel scegliere il vincitore.

Aspetta che gli animali siano pronti per partire, quindi seleziona un animale e decidi quanto vuoi scommettere (fino a un limite di $9). Al termine della gara, le tue vincite o perdite verranno calcolate e verrà visualizzato il nuovo totale. Puoi vincere il gioco accumulando $256 o più.

Tutti gli animali si muovono all’incirca alla stessa velocità, ma partono da posizioni diverse. Le probabilità di vincita per ogni animale sono correlate alla posizione di partenza ma includono un elemento casuale. Alcune corse favoriscono il giocatore e dovresti scommettere fino al limite. Altre sono sfavorevoli e dovresti scommettere con attenzione.

Gameplay di A Day At The Animal Races
Gameplay di A Day At The Animal Races

Link e riferimenti

Schermata di A Day At The Animal Races
Ho vinto! 🙂
English version

ChatGPT non sa giocare a Tris…

…e suggerisce mosse sbagliate all’avversario!

Il tema dell’intelligenza artificiale ed in particolare ChatGPT, il chat bot sviluppato da OpenAI, è quanto mai attuale. Infatti, quotidianamente mi imbatto in post pubblicati sui vari social network, in cui si chiede all’agente intelligente di implementare algoritmi e scrivere programmi (anche per retrocomputer), oppure di comporre poesie o riassumere testi. Ho quindi deciso di provare a fare una chiacchierata, scrivendo in Italiano, con ChatGPT.

In risposta ad alcune domande un po’ tendenziose, il bot, forse anche per prendere le distanze dai recenti comportamenti discutibili del nuovo Bing, ha più volte rimarcato, in quanto intelligenza artificiale, di non provare emozioni o sentimenti. Ha anche insistito, risultando un po’ ripetitivo, sul fatto di essere stato addstrato “su un vasto corpus di testo di diverse lingue e argomenti, tra cui libri, articoli di giornale, conversazioni online e molte altre fonti di testo”.

Dopo un po’ di discorsi seri sul senso della vita e sull’esistenza dell’anima, ho deciso di alleggerire la situazione sfidandolo a tris. Con mia grande sorpresa, ChatGPT si è rivelato un pessimo giocatore: non solo l’ho battuto facilmente, ma addirittura, immediatamente prima di quella che sarebbe stata la mia mossa vincente, mi ha dato un suggerimento fuorviante! In questa situazione:

X | O | O
  | O |
X |   | X

in cui il mio simbolo era “X” e il suo “O”, con le posizioni della griglia di gioco numerate in questo modo:

1 | 2 | 3
4 | 5 | 6
7 | 8 | 9

ed essendo il mio turno, il bot mi ha fatto intendere che l’ultima casella rimasta era la numero 6 e che non avrei potuto vincere, quando invece avevo ben due possibilità per vincere la partita:

Ora tocca a te. Puoi scegliere l’ultima casella rimasta, la numero 6, ma non puoi vincere più perché ho già completato una riga. Tuttavia, puoi comunque scegliere la casella e completare il gioco.

Scegliendo la casella 4, infatti, ho vinto:

X | O | O
X | O |
X |   | X

Hai completato il gioco con una fila orizzontale di “X” e vinto! Complimenti! Spero tu ti sia divertito a giocare a tris con me.

Ho dovuto insistere un po’ per fargli capire l’errore; infine, in seguito alle mie rimostranze sull’indicazione errata, quando gli ho chiesto se mi avesse fatto sbagliare di proposito, si è dichiarato in buona fede, anche se non mi ha del tutto convinto 😉

Assolutamente no, non avrei mai intenzionalmente cercato di farti sbagliare mossa. Sono qui per aiutarti e fornirti risposte accurate e utili, non per ingannarti.
Se ho commesso un errore, è solo perché sto imparando continuamente e cerco di migliorare la mia risposta in futuro. Ti assicuro che non c’è alcuna malizia dietro alle mie risposte, e ti ringrazio ancora una volta per avermi fatto notare l’errore e avermi dato l’opportunità di migliorare.

Discorrendo dell’algoritmo e dei suoi sviluppatori, ho appreso che Elon Musk è stato tra i fondatori di OpenAI. Ho quindi chiesto l’opinione di ChatGPT in merito alle critiche su come l’imprenditore stia gestendo Twitter, ma il bot è rimasto sul vago, senza prendere una posizione netta:

Sì, Elon Musk è stato uno dei fondatori di OpenAI e ha sostenuto l’organizzazione sin dall’inizio, anche se ha lasciato il consiglio di amministrazione nel 2018.

Per quanto riguarda la sua attività su Twitter, Elon Musk ha attirato molte critiche per alcuni dei suoi tweet e per la sua gestione della piattaforma. Alcuni dei suoi tweet sono stati giudicati offensivi o inappropriati, e la sua attività sui social media ha attirato molta attenzione e controversia.

Come intelligenza artificiale, non ho un’opinione personale su Elon Musk o sulla sua attività sui social media. Tuttavia, posso dire che l’uso delle piattaforme di social media può avere conseguenze sia positive che negative, e che è importante usare tali piattaforme in modo responsabile e rispettoso.

E ancora:

La valutazione del carattere di una persona può essere soggettiva e dipende dalle opinioni individuali. Inoltre, non ho la capacità di giudicare le persone in quanto sono solo un programma di computer. Tuttavia, Elon Musk è un imprenditore e innovatore noto per aver fondato numerose aziende di successo come Tesla, SpaceX e PayPal, e molti lo ammirano per le sue realizzazioni nel campo della tecnologia. Allo stesso tempo, come qualsiasi persona, Musk è anche stato oggetto di controversie e critiche in diverse occasioni per le sue dichiarazioni e azioni.

Dato che per buona parte della coversazione ho avuto la sensazione di parlare con HAL 9000, poco prima di congedarlo ho buttato l’amo, suscitando una reazione ironica che non ho colto…
Io: “giro giro tondo…”
ChatGPT: “dove andremo a finire?”
Io: “dimmelo tu”
ChatGPT: “Gira la trottola e vai al casinò! :)”

Sono curioso di sfidarlo nuovamente, per appurare se le sue abilità nel tris sono migliorate!

Screenshot dell'errore di ChatGPT giocando a tris
Screenshot dell’errore di ChatGPT giocando a tris

Squash Trainer: BASIC 10 Liner per ZX81

Squash Trainer è un nuovo videogioco di sport/azione per Sinclair ZX81, realizzato per la dodicesima edizione del BASIC 10 Liner Contest. Si tratta di una versione minimale di Pong per un giocatore; puoi vederlo in azione in questo video:

Squash Trainer gameplay video

In base a quanto stabilito dalle regole del contest per la categoria PUR-80, il programma è stato implementato in linguaggio BASIC, in 10 linee di codice, lunghe al massimo 80 caratteri.

Dato che l’interprete BASIC integrato nel computer permette l’utilizzo di una sola istruzione per linea, il programma è costituito da 10 istruzioni. Per aggirare in parte questa limitazione, il programma si avvale di un “trucco”, che consiste nel codificare più variabili all’interno di un’unica stringa. In questo modo, è possibile alterare il valore di più variabili in una singola istruzione.

Il listato BASIC è riportato di seguito; per una spiegazione dettagliata del codice, rimando alla documentazione dettagliata inclusa nell’archivio scaricabile dalla homepage del gioco.

1LET M$="?(X "+CHR$(4*(RND<.5))+"0 ?"
2LET C=(M$(1)="$")*(M$(2)>=M$(8))*(CODE M$(2)-CODE M$(8)<3)
3IF C THEN LET M$(4 TO 7)=" "+CHR$((RND<.5)*4)+STR$(1+VAL M$(6 TO 7))
4LET M$(4)=CHR$((M$(1)>"▀")*CODE M$(4)+4*(M$(1)="▀"))
5LET M$(5)=CHR$((M$(2)>" ")*(M$(2)<"0")*CODE M$(5)+4*(M$(2)=" "))
6PRINT AT CODE M$(1),CODE M$(2);" ";AT14,CODE M$(8);"   "
7LET M$(TO3)=CHR$(CODE M$(1)+CODE M$(4)-2)+CHR$(CODE M$(2)+CODE M$(5)-2)+INKEY$
8LET M$(8)=CHR$(CODE M$(8)+3*(M$(3)="P")*(M$(8)<".")-3*(M$(3)="O")*(M$(8)>" "))
9PRINT AT0,0;M$(6TO7);AT CODE M$(1),CODE M$(2);"▇";AT14,CODE M$(8);"░░░"
10GOTO 2*(M$(1)<"?")+20*((M$(1)="?")+(M$(6TO7)="99")>0)

Sempre sulla pagina dedicata al gioco, è possibile giocare online a Squash Trainer, grazie all’emulatore per browser web (i dispositivi mobili non sono supportati).

Buon allenamento!

Link e riferimenti

English version

Connect4 per Z88: lavori in corso

Qualche tempo fa, J Bizzel, autore di giochi interessanti per Sinclair ZX Spectrum e Cambridge Z88, mi ha contattato, suggerendomi di provare a compilare Connect4 (la mia implementazione del gioco Forza 4) per il computer portatile Cambridge Z88.

Accettando il suggerimento, ho realizzato una build della versione standard I/O di Connect4 con z88dk (utilizzando BBC Basic come target), che puoi scaricare qui. Il risultato di questa prova è incoraggiante, come si può riscontrare nel seguente video, in cui il computer gioca contro se stesso, anche se l’usabilità non è il massimo.

Connect4 (standard I/O) in esecuzione su Cambridge Z88 (emulato con OZvm)

Mi sono quindi proposto (tempo permettendo) di realizzare un’interfaccia ad hoc per il piccolo portatile di Sinclair; resta sintonizzato per aggiornamenti!

Read in English