28 novembre 2009
Full Tilt Poker cards & CImg Library
Non avevo ancora menzionato qui sul blog il fatto che, durante la trasferta in terra napoletana, ho finalmente trovato un collega disposto a cimentarsi nell’apparentemente titanica impresa di creare un software capace di giocare un buon poker. Stiamo ora discutendo via email come procedere. L’idea, ad ogni modo, e’ quella di provare prima di tutto a sviluppare un HUD specifico per non piu’ di una o due room. Poi, una volta in possesso di questo strumento, iniziare a ragionare su tematiche di piu’ alto livello.
Va da se’ che per un po’ di tempo ci sara’ da rognare in C++. Sviluppare un HUD non e’ uno dei compiti in assoluto piu’ ardui a cui un programmatore possa dedicarsi, ma si tratta di qualcosa di sicuramente tedioso. Uno dei primi problemi da risolvere consiste nel riconoscere le carte presenti sullo schermo. Per fortuna (almeno in tutte le poker room di mia conoscenza) le carte occupano sempre la medesima posizione all’interno della finestra/tavolo di gioco. Le carte tipicamente utilizzate per l’Hold’Em, poi, tendono ad avere un sorta di “riassunto” negli angoli. Cosa che agevola il compito di riconoscimento, dato che non vi e’ la necessita’ di leggere l’intera carta, ma solo un subset di pixels.
Armato di certosina pazienza, ho scattato una raffica di screenshot da un po’ di sessioni di gioco random di Full Tilt Poker e poi mi sono ritagliato (manualmente) le singole 52 carte. Siccome sono buono, le metto pure a disposizione di chiunque potesse averne bisogno. Preciso che il formato in cui sono salvate e’ il PNG.

Per quanto riguarda poter riconoscere le carte via software, occorre appoggiarsi ad una libreria di image processing. Girovagando per la rete mi sono imbattuto in qualcosa che potrebbe fare al caso mio, vale a dire The CImg Library, dove CImg e’ un acronimo per C++ Template Image Processing Toolkit.

A questo indirizzo e’ possibile trovare una breve overview relativa a CImg, comprensiva della classica applicazione “Hello World!”, il
cui sorgente, come potete vedere, e’ davvero breve, semplice e pulito.
Per quanto riguarda la compilazione su Mac OS, occorre tenere presente che CImg si appoggia sulla infrastruttura X11. Per questo motivo, nel momento in cui si richiama g++ e’ necessario istruirlo a riguardo. La sintassi per farlo e’ simile a quella qui sotto.
$g++ -o hello_world hello_world.cpp -O2 -lm -lpthread -L/usr/X11R6/lib -lm -lpthread -lX11
Di seguito, il risultato finale. Venuto fuori al primissimo tentativo.

Le premesse sono senz’altro buone. Ora vediamo un po’ come si comporta la libreria quando si importano e si leggono immagini.


