Forum > Progetti degli utenti

Minecraft Pilot

(1/1)

SB:
Motivazione
Per chi non conosce Minecraft, si tratta di un gioco 3D multiplayer client/server in cui si interagisce in un mondo costituito da blocchi di vari materiali che si possono piazzare e raccogliere.
Mi sono chiesto se fosse possibile controllare in maniera automatica il personaggio per fargli compiere delle (semplici) azioni.
L'obiettivo finale (se mai lo raggiungerò) sarebbe quello di introdurre i ragazzi alle problematiche della robotica e dell'intelligenza artificiale utilizzando un ambiente/gioco che conoscono.

Progetto
Il client del gioco è scritto in Java e questo ha portato allo sviluppo di client modificati dagli usi più disparati.
A mia conoscenza, ci sono dei problemi nel seguire questa strada.
Innanzi tutto si deve conoscere (molto) bene il linguaggio Java e avere a disposizione un apposito ambiente di sviluppo che non sempre è aggiornato.
Inoltre c'è il rischio concreto che un client modificato venga individuato dal server di gioco grazie ad anomalie nei comandi inviati. In tal caso il giocatore verrebbe classificato come imbroglione ed escluso permanentemente dal server.
Ho quindi deciso di seguire una strada diversa, grazie ad una funzionalità offerta dal gioco stesso.
Infatti è possibile attivare una sorta di modalità debug in cui a video compaiono molte informazioni riguardo al personaggio e al mondo.
Ad esempio vengono fornite le coordinate del personaggio e le caratteristiche del blocco puntato in quel momento.

(vedi img 1)

Tali informazioni sono disponibili su schermo e non ho accesso diretto ai dati.
Ho pensato quindi di realizzare una sorta di OCR per leggere i caratteri.
Sono stato facilitato in questo: i caratteri sono generalmente ben definiti rispetto allo sfondo e si riescono ad isolare.

(vedi img 2)

Per accedere alla schermata visualizzata ho utilizzato apposite funzioni di accesso al device context dello schermo fornite dal sistema operativo e disponibili in Lazarus

Ottenuta l'immagine ho dovuto leggere i singoli caratteri.
Sapendo le posizioni in cui i caratteri vengono visualizzati, ho realizzato un programma che mi permette di definire le regole per il riconoscimento di ogni carattere.
In pratica definisco dei punti "strategici" in cui un carattere ha i pixel accesi o spenti. Un po' rozzo ma funziona bene.

Ad esempio, per riconoscere la "M" definisco la larghezza in pixel, i punti accesi (blu) e i punti spenti (rossi)
Riconosciuta la "M" si passerà al successivo carattere.

(vedi img 3)

Una volta realizzato l'archivio dati per il riconoscimento, la procedura OCR legge tutti i testi riportati nella schermata:

 1>Minecraft 1.13.2 (1.13.2/vanilla)   <
 2>60 fps (0 chunk updates) T: 100 vsync vbo   <
 3><
 4>C: 80/51984 (s) D: 28, L: 0, pC: 000, pU: 0, aB: 40   <
 5>E: 29/76, B: 0   <
 6>P: 154. T: All: 76   <
...

Ci sono scritte allineate a sinistra e scritte allineate a destra.
In caso di errato riconoscimento di un carattere basta definire con maggiore precisione il criterio di riconoscimento.

Nel mio computer un po' datato, la decodifica viaggia a circa 20 fotogrammi al secondo.

Una volta ottenute le informazioni si deve controllare il personaggio come farebbe un umano, cioè tramite tastiera e mouse.
Usando Linux ho dovuto interfacciarmi con X11 e simulare la pressione dei tasti e il movimento del mouse.
Non è stato facile, ma spulciando il web con tanta pazienza si trova un po' di documentazione e codice C di esempio.
Il ricorso a programmi di sistema tipo "xdotool" è poco preciso per quanto riguarda la simulazione dei tempi di pressione dei tasti (o almeno per quello che sono le mie competenze)

Alla fine sono riuscito a muovere il personaggio, a ruotare la visuale e a controllare i click del mouse.
Allo stato attuale non sono ancora riuscito ad avere un controllo preciso del movimento.
Ho problemi nel controllare con precisione i tempi di pressione dei tasti.

Il programma è diviso in due parti: quella che prende lo screenshot e decodifica le informazioni e quella che elabora i comandi da dare.
Avevo tentato con il multithreading, ma ho ottenuto risultati deludenti (sembrava monothread). Non ho capito/approfondito se ciò dipenda dal sistema Linux o dal FreePascal.
Ho quindi realizzato due programmi distinti che comunicano mediante IPC su area di memoria condivisa.

La robotica interviene nei meccanismi di controllo dei movimenti, in cui si deve tenere conto dei tempi di risposta, delle informazioni limitate, della risposta che dipende dall'ambiente e non sempre come ci si aspetta, del controllo a retroazione per ottenere il comportamento desiderato senza innescare comportamenti instabili.
L'intelligenza artificiale interviene nello stabilire le azioni da compiere per raggiungere un certo risultato date delle informazioni limitate sul mondo.

Piattaforma
Linux

Stilgar:
Ciao.Hai scartato https://github.com/minetest/minetest?Sembra abbia delle interfacce per LUA.
Facendo uno scriptino di connessione tra i due applicativi?La butto lì senza passare per l'ocr.
Stilgar

xinyiman:
Per il movimento di mouse e pressione di tastiera potevi comodamente usare il package LazMouseAndKeyInput. Per il resto sembra un progettino interessante

SB:

--- Citazione da: Stilgar - Luglio 09, 2019, 12:56:51 pm ---Ciao.Hai scartato https://github.com/minetest/minetest?Sembra abbia delle interfacce per LUA.
Facendo uno scriptino di connessione tra i due applicativi?La butto lì senza passare per l'ocr.
Stilgar

--- Termina citazione ---

Interessante.

Però riuscire ad usare Minecraft ha tutto un altro appeal  ;)

SB:

--- Citazione da: xinyiman - Luglio 09, 2019, 02:03:02 pm ---Per il movimento di mouse e pressione di tastiera potevi comodamente usare il package LazMouseAndKeyInput. Per il resto sembra un progettino interessante

--- Termina citazione ---

Grazie della segnalazione. Usano la stessa libreria Xtst.

Navigazione

[0] Indice dei post

Vai alla versione completa