• Nenhum resultado encontrado

Aplicarea tehnicilor inteligenței artificiale și comunicarea în timp real în jocurile de tip

N/A
N/A
Protected

Academic year: 2023

Share "Aplicarea tehnicilor inteligenței artificiale și comunicarea în timp real în jocurile de tip "

Copied!
47
0
0

Texto

Declar că Lucrarea de licență cu titlul „Aplicarea tehnicilor de inteligență artificială și comunicare în timp real în jocurile cu browser” a fost scrisă de mine și nu a fost niciodată prezentată la o facultate sau altă instituție de învățământ superior din țară sau din străinătate. Declar că sunt de acord ca lucrarea de licență intitulată „Aplicarea tehnicilor de inteligență artificială și comunicare în timp real în jocurile cu browser”, codul sursă al programelor și al altor conținuturi (grafică, multimedia, date de testare etc.) care însoțesc această lucrare. pentru a fi utilizat în cadrul Facultăţii de Informatică.

Figura 1: Veniturile dezvoltatorilor de jocuri din Statele Unite
Figura 1: Veniturile dezvoltatorilor de jocuri din Statele Unite

Aplicații asemănătoare

Implementare

Practic, metoda Node.js „require(’module’)” a fost portată și au implementat-o ​​să funcționeze la fel, în browser, pe client. Acesta caută toate apelurile „require()” în aplicație și creează un singur fișier (pachet) din aceste resurse, care este încărcat ulterior în aplicație.

Arhitectura aplicației

Cu ajutorul acestuia, putem crea o conexiune la baza de date în care putem executa interogări SQL. În prima linie de cod, o instanță a obiectului Phaser.Game este creată și atribuită unei constante numite matrice. Aceasta este dimensiunea în care va fi afișat jocul, dar ar putea fi mult mai mare.

Al treilea parametru poate fi Phaser.CANVAS, Phaser.WEBGL sau Phaser.AUTO, acesta din urmă fiind contextul de randare pe care vreau să-l folosesc. Setarea recomandată este Phaser.AUTO care încearcă automat să folosească WebGL, dar dacă browserul sau dispozitivul nu îl acceptă, va folosi canvas. Al patrulea parametru este ID-ul elementului DOM în care este inserat elementul canvas.

Deci, dacă doriți să împărțiți jocul în blocuri de cod sau interfețe, puteți dezvolta fiecare dintre aceste interfețe ca o stare (en:state) și de fiecare dată când starea se schimbă, memoria resurselor și memoria obiectelor neutilizate din aplicație sunt eliberate. este gestionat (unul: colectarea de gunoi gestionată), ceea ce este cu siguranță un plus.

Figura 4: Modelul și arhitectura client-server
Figura 4: Modelul și arhitectura client-server

Interfețele jocului

  • Interfața de autentificare și înregistrare
  • Interfața meniu
  • Interfața de configurare a jocului
  • Interfața de așteptare a jucătorilor
  • Interfața de joc

Phaser are unele funcții rezervate care rulează în anumite puncte ale jocului și trebuie să conțină diferite tipuri de cod. Cod Secțiunea 5: Cod pentru a inițializa conexiunea la server și pentru a emite evenimentele newGame și joinGame. Sistemul de fizică Arcade (Phaser.Physics.ARCADE) este probabil cel mai folosit de dezvoltatorii de jocuri deoarece are cele mai multe tutoriale și este cel mai simplu și rapid sistem din punct de vedere al performanței.

Sistemul de fizică Ninja (Phaser.Physics.NINJA) este puțin mai complex decât sistemul de fizică Arcade. Sistemul de fizică P2 (Phaser.Physics.P2JS) este cel mai complex și mai realist, dar consumă și mai multe resurse. De exemplu, puteți avea sistemul de fizică P2 pentru gestionarea terenului construit cu poligoane peste care trece un vehicul în timp ce trage gloanțe care sunt folosite de sistemul de fizică Arcade mult mai rapid.

Pentru a plasa obstacolele pe hartă am folosit o matrice bidimensională; Fiind un joc 2D, sistemul de coordonate este un sistem bidimensional format din două axe x și y. Pentru a detecta coliziunea dintre rezervor și obstacol, am folosit funcția collide() a sistemului de fizică Arcade al jocului, care poate fi folosită între instanțe simple de obiect de joc, precum și între o instanță de obiect și un grup de obiecte. Sistemul de fizică face totul prea ușor, trebuie doar să adăugăm o linie simplă de cod la funcția update().

Figura 8: Autentificare sau înregistrare reușită
Figura 8: Autentificare sau înregistrare reușită

Modul singleplayer și aplicarea tehnicilor de inteligență artificială

Ciclul de decizie al personajului nejucator (af: personaj nejucator) realizeaza continuu trei pasi: (10). De fapt, jocurile video nu au nevoie de personaje non-jucatoare la fel de sofisticate și pricepute ca jucătorii umani care le joacă. Un personaj care nu este jucător poate fi programat să se deplaseze într-un anumit punct țintă, înaintând de-a lungul axelor x și y până când coordonatele x și y ale personajului coincid cu locația țintă.

Un exemplu de comportament nedeterminist este un personaj non-jucător care învață să se adapteze la tacticile de luptă ale unui jucător. Trișarea astfel ajută personajul care nu este jucător să aibă un avantaj față de inteligența jucătorului uman, dar poate fi și un lucru rău. După cum am explicat mai sus, sistemul AI nu trebuie să fie prea bun, iar acest truc pentru personajele care nu sunt jucători trebuie să fie suficient de echilibrat pentru a crea o provocare suficientă pentru jucător, dar suficient pentru a menține jocul interesant și plăcută.

În acel moment, tancul non-jucător se oprește, schimbă direcția către rezervorul jucătorului uman și continuă să tragă până când rezervorul jucătorului se mișcă și niciuna dintre axele x și y nu mai coincid.

Figura 14: Cele patru cadrane ale unui sistem de coordonate carteziene
Figura 14: Cele patru cadrane ale unui sistem de coordonate carteziene

Modul multiplayer și comunicarea în timp real dintre client și server

Logica jocului începe atunci când toți jucătorii din lobby sunt gata să înceapă și proprietarul lobby-ului apasă butonul PLAY care va emite un eveniment de start. După ce jocul este încărcat, fiecare jucător va emite un eveniment gameLoaded, ceea ce înseamnă că jocul este încărcat și sunt gata să înceapă; după ce toți jucătorii trimit acest eveniment, vor asculta evenimentul startGame unde vor fi primite toate pozițiile cărților de rezervor și vor putea începe jocul. Deoarece informațiile despre rezervor sunt trimise și primite numai atunci când direcția și accelerația se schimbă, trebuie să rulăm animația rezervorului schimbându-și poziția pe partea clientului, acesta este un sistem de predicție pentru client, iar în următoarea actualizare erorile ar trebui să fie foarte ușor de determinat din predicție, pentru a menține pozițiile tancului sincronizate, rezolvând astfel problema timpului mare de răspuns în care se pot trimite informații.

Informația ajunge la celălalt client după 150 de milisecunde, timp în care începe să miște tancul jucătorului inamic pe hartă. Aplicația server constă din două fișiere situate în folderul serverului, un fișier care conține datele de conectare la baza de date, adresa URL a aplicației client și adresa URL a aplicației server numită config.js și main.js, care deține tot codul specific aplicației server. După cum am explicat și în capitolul 1.3 Arhitectura aplicației, Express este utilizat în această configurație pentru a gestiona solicitările HTTP care vin în aplicația Node.js.

În componența sa, Express are diverse tehnici pe care le putem folosi atunci când se dorește o solicitare pentru o anumită pagină web sau o anumită informație pentru afișare în browser.

Cererile HTTP

La autentificare sau după înregistrare, se generează un token unic, care este introdus în baza de date a utilizatorului pentru care a fost generat și apoi trimis acestuia. Aplicația client îl stochează într-un cookie și atâta timp cât accesează aplicația de pe același computer și browser, nu mai trebuie să se autentifice folosind utilizatorul și parola de fiecare dată. Aplicația verifică dacă există un token în cookie, care este apoi trimis la server pentru a vedea dacă se potrivește cu cel din baza de date.

Când utilizatorul se înregistrează pentru o adresă de e-mail, el primește un link cu un simbol unic. La accesarea unei conexiuni, serverul verifică dacă jetonul din conexiune se potrivește cu jetonul utilizatorului din baza de date; în acest caz, adresa de e-mail verificată este actualizată în baza de date și redirecționată către aplicația client.

WebSockets

În comparație cu celelalte solicitări care au folosit metoda de solicitare POST, aceasta folosește GET, ceea ce înseamnă că cererea poate fi accesată prin simpla introducere a linkului în browser. Atunci când un client se conectează la server folosind Socket.IO, token-ul primit în timpul autentificării este trimis și pentru a valida conexiunea folosind o funcție intermediară, numită și middleware. După autentificare, clientul va emite un nou eveniment de joc pentru a crea jocul sau pentru a se alătura unui joc deja creat joinGame.

Când evenimentul newGame este emis de client, serverul generează un token, încarcă fișierul de configurare a hărții, adaugă noile date de joc la o variabilă obiect, creează o cameră cu ID-ul tokenului generat și emite un eveniment gameCreated clientului care jocul a fost creat împreună cu ID-ul camerei. O sală va grupa conexiunile clienților pentru a permite ca evenimentele să fie difuzate numai către clienții din sală. Fără camere, ar fi mult mai greu să ne dăm seama ce jucători și gazde ar trebui să se conecteze între ei dacă mai multe persoane încearcă să lanseze mai multe jocuri de pe același server.

Pe partea de server, atunci când evenimentul joinGame este emis de client împreună cu jetonul de joc, obiectul jocului este actualizat cu un jucător nou și plasat în sala de joc, apoi evenimentul updatePlayers este emis cu o listă actualizată a tuturor jucătorilor din toate conexiunile din cameră.

Validarea informațiilor primite prin WebSocket de la jucător

O soluție este să rulați motorul de joc pe server și să rulați tot ce se întâmplă sub controlul său și să faceți clienții simpli spectatori privilegiați ai jocului. Această soluție se numește server autorizat, deoarece serverul este singura autoritate cu privire la ceea ce se întâmplă în joc. Serverul de joc WarTank nu este un server autorizat, deoarece nu rulează motorul de joc.

După primirea evenimentelor de tragere, se verifică viteza de tragere, adică. timpul care trece între emisia evenimentelor nu trebuie să fie mai mic decât cel stabilit. De exemplu, dacă rezervorul începe să se miște, se verifică poziția în care s-a oprit ultima dată să fie egală cu poziția din care a pornit cu o marjă de eroare de 10 pixeli, iar la schimbarea direcției de mers, distanța de la locul în care a plecat. și unde își schimbă direcția astfel încât să nu fie mai mare decât cea calculată din timpul scurs și viteza rezervorului. În ceea ce privește un singur jucător, cea mai mare provocare a fost oferirea fiecărui tanc non-jucător o personalitate diferită pentru a crea iluzia inteligenței și găsirea unui echilibru în sistemul AI care nu trebuie să fie prea bun, ci suficient pentru joc pentru a fi câștigat într-un mod provocator și distractiv.

În dezvoltarea serverului, cea mai mare provocare a fost să protejăm jocul de trucuri prin verificarea informațiilor primite.

Imagem

Figura 1: Veniturile dezvoltatorilor de jocuri din Statele Unite
Figura 2: Jocul Massive Tanks                                       Figura 3: Jocul Tinny Tanks
Figura 4: Modelul și arhitectura client-server
Figura 5: Monitorizarea traficului și a schimbului de mesaje WebSocket
+7

Referências

Documentos relacionados

Acosta Pereira e Rodrigues (2010) entendem que os gêneros apresentam marcas históricas e sociais, e, com sua estabilidade relativa, escapam à padronização formal. Em sua