* * * *

Privacy Policy

Blog italiano

Clicca qui se vuoi andare al blog italiano su Lazarus e il pascal.

Forum ufficiale

Se non siete riusciti a reperire l'informazione che cercavate nei nostri articoli o sul nostro forum vi consiglio di visitare il
Forum ufficiale di Lazarus in lingua inglese.

Lazarus 1.0

Trascinare un file nel programma
DB concetti fondamentali e ZeosLib
Recuperare codice HTML da pagina web
Mandare mail con Lazarus
Stabilire il sistema operativo
Esempio lista in pascal
File INI
Codice di attivazione
Realizzare programmi multilingua
Lavorare con le directory
Utilizzare Unità esterne
TTreeView
TTreeview e Menu
Generare controlli RUN-TIME
LazReport, PDF ed immagini
Intercettare tasti premuti
Ampliare Lazarus
Lazarus e la crittografia
System Tray con Lazarus
UIB: Unified Interbase
Il file: questo sconosciuto
Conferma di chiusura di un applicazione
Liste e puntatori
Overload di funzioni
Funzioni a parametri variabili
Proprietà
Conversione numerica
TImage su Form e Panel
Indy gestiore server FTP lato Client
PopUpMenu sotto Pulsante (TSpeedButton)
Direttiva $macro
Toolbar
Evidenziare voci TreeView
Visualizzare un file Html esterno
StatusBar - aggirare l'errore variabile duplicata
Da DataSource a Excel
Le permutazioni
Brute force
Indy 10 - Invio email con allegati
La gestione degli errori in Lazarus
Pascal Script
Linux + Zeos + Firebird
Dataset virtuale
Overload di operatori
Lavorare con file in formato JSON con Lazarus
Zeos ... dietro le quinte (prima parte)
Disporre le finestre in un blocco unico (come Delphi)
Aspetto retrò (Cmd Line)
Lazarus 1.0
Come interfacciare periferica twain
Ubuntu - aggiornare free pascal e lazarus
fpcup: installazioni parallele di lazarus e fpc
Free Pascal e Lazarus sul Raspberry Pi
Cifratura: breve guida all'uso dell'algoritmo BlowFish con lazarus e free pascal.
Creare un server multithread
guida all'installazione di fpc trunk da subversion in linux gentoo
Indice
DB concetti fondamentali e connessioni standard
Advanced Record Syntax
DB concetti fondamentali e DBGrid
DB concetti fondamentali e TDBEdit, TDBMemo e TDBText
Advanced Record Syntax: un esempio pratico
Superclasse form base per programmi gestionali (e non)
Superclasse form base per programmi gestionali (e non) #2 - log, exception call stack, application toolbox
Superclasse form base per programmi gestionali (e non) #3 - traduzione delle form
Superclasse form base per programmi gestionali (e non) #4 - wait animation
Un dialog per la connessione al database:TfmSimpleDbConnectionDialog
Installare lazarus su mac osx sierra
immagine docker per lavorare con lazarus e free pascal
TDD o Test-Driven Development
Benvenuto! Effettua l'accesso oppure registrati.
Novembre 10, 2024, 08:16:18 pm

Inserisci il nome utente, la password e la durata della sessione.

86 Visitatori, 0 Utenti

Autore Topic: Minecraft Pilot  (Letto 3583 volte)

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Minecraft Pilot
« il: Luglio 09, 2019, 12:42:00 pm »
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

  • Global Moderator
  • Hero Member
  • *****
  • Post: 2386
  • Karma: +10/-0
Re:Minecraft Pilot
« Risposta #1 il: 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
Al mondo ci sono 10 tipi di persone ... chi capisce il binario e chi no.

xinyiman

  • Administrator
  • Hero Member
  • *****
  • Post: 3270
  • Karma: +12/-0
Re:Minecraft Pilot
« Risposta #2 il: 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
Ieri è passato, domani è futuro, oggi è un dono...

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Re:Minecraft Pilot
« Risposta #3 il: Luglio 10, 2019, 07:25:34 am »
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

Interessante.

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

SB

  • Scrittore
  • Sr. Member
  • *****
  • Post: 283
  • Karma: +1/-0
Re:Minecraft Pilot
« Risposta #4 il: Luglio 10, 2019, 07:29:39 am »
Per il movimento di mouse e pressione di tastiera potevi comodamente usare il package LazMouseAndKeyInput. Per il resto sembra un progettino interessante

Grazie della segnalazione. Usano la stessa libreria Xtst.

 

Recenti

How To

Utenti
  • Utenti in totale: 802
  • Latest: Il Faro
Stats
  • Post in totale: 19116
  • Topic in totale: 2281
  • Online Today: 114
  • Online Ever: 900
  • (Gennaio 21, 2020, 08:17:49 pm)
Utenti Online
Users: 0
Guests: 86
Total: 86

Disclaimer:

Questo blog non rappresenta una testata giornalistica poiché viene aggiornato senza alcuna periodicità. Non può pertanto considerarsi un prodotto editoriale ai sensi della legge n. 62/2001.