risorse | analisi del gioco pong

Analisi del gioco Pong

Introduzione

Pong è stato il primo videogioco cui abbia mai giocato, verso la fine degli anni settanta, su una consolle molto simile a questa:

Il “TV Game” della Tenko, modello PP-150 — una delle tante varianti

Qualche anno dopo (sarà stato il 2000 o giù di lì), spinto dalla nostaglia, ne comprai una a una fiera dell'antiquariato della zona per 1000 lire, senza garanzia che funzionasse:

La consolle acquistata alla fiera — senza marca, modello nè numero di serie.

La consolle fortunatamente funzionava. Ora giace inutilizzata, perché le moderne televisioni cui l'ho collegata non riescono ad agganciare il segnale generato dal modulatore.

Nell'autunno del 2016 ho provato a cimentarmi nella realizzazione di un emulatore della consolle che fosse il più fedele possibile all'originale; di seguito le informazioni raccolte nel frattempo, in attesa di completare il progetto.

Il chip AY-3-8500

La maggior parte delle consolle del tempo erano basate sul chip AY-3-8500 della General Instrument che implementava la logica di gioco oltre alla generazione del quadro video.

L'idea di scrivere un emulatore è nata nel momento in cui sono riuscito ad entrare in possesso del manuale del chip (qui una copia locale). Nel frattempo ho scovato in rete un remake basato su Arduino a cura di Grant Searle (qui una copia locale della pagina, qui dei sorgenti del progetto), che mi è risultata utile per comprendere meglio alcuni dettagli.

Geometria del gioco

Il manuale riporta chiaramente le dimensioni dei vari oggetti grafici che fanno parte del gioco: linee di demarcazione del campo, racchette, punteggio e palla.

La pagina del manuale che descrive la geometria di Pong

Le dimensioni orizzontali sono espresse in µs, essendo legate alla temporizzazione del segnale che genera l'immagine in bianco e nero; quelle verticali sono invece espresse in numero di linee. Sono riportate sia le dimensioni per la codifica PAL che per la NTSC. Io faccio ovviamente riferimento alla prima.

Dimensioni dello schermo

L'unità di misura orizzontale è il tick, ovvero la durata di un impulso di clock, che corrisponde a 0.5µs. Poiché il tracciamento di una linea dello schermo dura esattamente 64µs, si conclude che lo schermo è suddiviso in 128 tick/colonne. Essendo il quadro PAL composto da 625 linee, ed essendo la scansione interlacciata, ad ogni ciclo viene disegnato un semi-quadro — composto alternativamente dall linee pari o dispari — da 312 linee. Deduco che il secondo semi-quadro sia identico al primo, ad ogni modo sul manuale non ho trovato nulla a riguardo.

Riassumendo:

1 tick = 0.5µs
1 linea = 64µs → 128 colonne

625 linee per quadro
1 quadro = 2 semi-quadri → 312 linee

1 frame = 128×312

Le dimensioni del campo di gioco si ricavano sottraendo dalle dimensioni complessive del quadro video quelle dei bordi, oltre ovviamente ai tempi di retrace (tutti i dati citati sono facilmente ricavabili dal manuale):

larghezze (in ticks)
-------------------------------------
 larghezza bordo sinistro.......: 27
 larghezza bordo destro.........: 16
 tempo di retrace orizzontale...: 12
 larghezza del campo di gioco...: 128 - 27 - 16 - 12 = 73

altezze (in linee)
-------------------------------------
 altezza bordo superiore........: 44
 altezza bordo inferiore........: 30
 tempo di retrace verticale.....: 6
 altezza del campo di gioco.....: 312 - 44 - 30 - 6 = 232

Se si vuole ricostruire l'aspetto del Pong originale si dovranno rispettare queste propozioni, sacrificando eventualmente la corretta corrispondenza dei bordi.

Inizialmente pensavo di realizzare l'emulatore con Scratch, che ha una risoluzione fissa di 480×360 pixel. Per questa ragione ho riscalato la geometria originale di Pong sull'area disponibile in Scratch, raggiungendo il seguente compromesso:

larghezza massima disponibile...: 480 pixel
altezza massima disponibile.....: 360 pixel

larghezza del campo di gioco....: 438 pixel (rapporto 6:1)
altezza del campo di gioco......: 348 pixel (rapporto 3:2)
bordo verticale.................:   6 pixel
bordo orizzontale...............:  21 pixel

Lo schema qui sotto evidenzia posizione e dimensione dei singoli componenti del quadro video di Pong in colori diversi, su un quadro di 480×360 pixel:

Pong riscalato a 480×360 per il porting su Scratch

È possibile scaricare una versione incompleta del progetto Scratch dell'emulatore Pong che contiene tutti i componenti grafici ma con una logica di gioco appena abbozzata.

Avevo anche valutato la possibilità di realizzare l'emulatore su ZX Spectrum, che ha una risoluzione di 256×192 pixel; in questo caso una buona approssimazione potrebbe essere:

larghezza massima disponibile...: 256 pixel
altezza massima disponibile.....: 192 pixel

larghezza del campo di gioco....: 219 pixel (rapporto 3:1)
altezza del campo di gioco......: 174 pixel (rapporto 3:4)
bordo verticale.................:   9 pixel
bordo orizzontale...............:  18 pixel uno, 19 pixel l'altro

Per determinare i valori più adatti delle dimensioni del quadro video dell'emulatore avevo preparato un sistema automatico di riscalatura dei valori che riporto qui sotto. È sufficiente impostare le dimensioni del quadro video desiderate e premere il pulsante «Ricalcola» per vedere come cambiano di conseguenza posizione e dimensione degli oggetti:

dimensioni originale nuovo
larghezza
altezza
distanze verticali (linee) inizio fine inizio fine
bordo superiore
linea superiore
punteggio
linea laterale superiore
linea laterale inferiore
linea inferiore
bordo inferiore
tempo di retrace verticale
distanze orizzontali (ticks) inizio fine inizio fine
bordo sinistro
linea sinistra
prima racchetta giocatore 1
seconda racchetta giocatore 2
decine punteggio giocatore 1
unità punteggio giocatore 1
mezzeria
decine punteggio giocatore 2
unità punteggio giocatore 2
racchetta giocatore 2 (squash)
seconda racchetta giocatore 1
prima racchetta giocatore 2
linea destra
bordo destro
tempo di retrace orizzontale
oggetti principali larghezza altezza larghezza altezza
racchetta
racchetta «small»
palla
punteggio
campo di gioco

In conclusione, alcune osservazioni relative alle linee di demarcazione: quelle verticali hanno spessore pari a 1µs (2 tick), e ogni tratto è alto 1 linea; Quelle orizzontali hanno spessore pari a 2 linee, e ogni tratto è lungo 0.5µs (1 tick). La linea di mezzeria, anch'essa larga 1 tick, è costituita da una sequenza di 28 tratti pieni alternati a 28 vuoti, ognuno dei quali è costituito da 4 linee, e sembra distare 2 linee dalla linea di demarcazione superiore (la linea centrale, essendo compresa tra le due linee superiore ed inferiore, è lunga esattamente 274 - 46 = 228):

2 + (4 + 4) * 28 + 2 = 228

Movimento

Gli unici oggetti del gioco che si muovono sono le racchette e la palla. Le racchette si muovono solo in verticale, e la loro posizione è determinata dal valore di resistenza del potenziometro di controllo. Il movimento della palla è invece controllato dal chip.

Velocità orizzontale della palla

Relativamente al moto della palla, il manuale riporta a pag. 6 i tempi di percorrenza dello schermo per le due velocità: 1.3s in «low speed», 0.65s in «high speed». Nello specchietto in fondo a pag. 12 invece si fa riferimento alle velocità angolari, riportando, sempre per la velocità orizzontale, i valori di ±5µs in «slow», ±1µs in «fast». Terminologia a parte, i due valori sono coerenti:

durata di un quadro........: 20 ms
larghezza di un quadro.....: 64 ticks

low speed
-------------------------------------
tempo di attraversamento...: 1.30 s
spostamento per quadro.....: 64 / (1300 / 20) = 64 / 65 ≅ 1 tick

high speed
-------------------------------------
tempo di attraversamento...: 0.65 s
spostamento per quadro.....: 64 / (650 / 20) = 64 / 32.5 ≅ 2 tick

Se i tempi dichiarati fossero rispettivamente 1.28s e 0.64s, allora gli spostamenti orizzontali della palla sarebbero dei tick interi. Essendo la palla larga 2 tick, in modalità «slow» orizzontale si muove di metà della sua larghezza, esattamente della sua larghezza in modalità «fast».

Velocità verticale della palla

La palla si può muovere su due angolazioni diverse, ±20°/±40°, in funzione di come è configurata la consolle e il punto in cui la palla impatta sulle racchette.

L'angolazione d'uscita della palla nella modalità 20°

L'angolazione d'uscita della palla nella modalità 20°/40°

Ciò che caratterizza le due angolazioni è la velocità verticale, che cambia a seconda che il gioco stia funzionando il modalità «slow» o «fast»:

low speed
-------------------------------------
velocità verticale 20°...: ±1 linea
velocità verticale 40°...: ±3 linee

high speed
-------------------------------------
velocità verticale 20°...: ±2 linee
velocità verticale 40°...: ±5 linee

Movimento

Non è chiaro cosa accada alla palla quando un giocatore segna un punto. All'apparenza la palla prosegue la sua corsa, riapparendo dalla parte opposta del campo rispetto a dove è uscita, mantenendo velocità e direzione:

Rientro della palla in campo dopo una segnatura (disegno fuori scala!)

In rete non ho trovato nulla di definitivo. L'emulatore realizzato da Grant Searle per esempio adotta la seguente strategia (i due valori della coordinata x si riferiscono alle due possibili posizioni iniziali, una sul campo sinistro, una su quello destro):

all'accensione
-------------------------------------
x.............: 0
y.............: -18

dopo una segnatura
-------------------------------------
x.............: 0.3 / 0.7 × fieldWidth → 23 / 55
y.............: immutata

L'emulatore WinArcadia invece utilizza i seguenti parametri:

all'accensione
-------------------------------------
x.............: 63
y.............: 160

dopo una segnatura
-------------------------------------
x.............: 32 / 93
y.............: immutata

Non sembra dunque esserci una risposta definitva al momento. D'altra parte, questo particolare non dovrebbe impattare troppo sul game play.

Suono

Durante il gioco vengono emessi diversi suoni, in corrispondenza dei seguenti eventi: quando la palla viene colpita da una racchetta («hit»), quando la palla colpisce una delle linee laterali («boundary reflection») e quando un giocatore segna un punto («score»). I tre beep, tutti della durata di 32ms, hanno altezza diversa, secondo la tabella seguente (nell'ordine: frequenza emessa dal chip AY-3-8500, caratteristiche della nota del sistema temperato più vicina):

frequenza (Hz)notaottavafrequenza (Hz)offset (cents)
hit976.0B5987.77-20.74
boundary reflection488.0B4493.88-20.74
score1952.0B61975.53-20.74

Conclusioni

Segnalo la pagina PONG In A Chip che contiene un'interessante rassegna delle diverse implementazioni del gioco.

Pagina modificata il 13/05/2018