Trenutno radim na projektu za jednog klijenta koji sam započeo pre oko dva meseca, ali dodajem povremeno nove definicije u ovom. Za sad proučavam dostupne NLP i ML biblioteke za Python pa ću pokušati da ostvarim ono što sam zamislio.
Da ukratko objasnim šta sam zamislio. U src direktorijumu se nalazi kod igre, dok se u test direktorijumu nalaze testovi. Kod same igre je podeljen na 2 dela. Jedan deo je kod koji sadrži main funkciju i implementaciju interfejsa za čitanje i pisanje teksta i taj deo se kompajlira kao programska datoteka, dok sve ostalo ide u drugi deo koji se kompajlira kao biblioteka.
Na ovaj način mogu biblioteku da iskoristim i prilikom pisanja testova.
Trenutno stanje igre se nalazi u klasi GameState. Trenutno, ova klasa sadrži samo pozdravnu poruku koja će se pokazati na početku igre, listu svih soba (klasa Stage) i sobu u kojoj se igrač trenutno nalazi.
Osim ove dve klase, postoji još i GameSerializer klasa koja zna da zapiše ili pročita ceo GameState objekat iz bilokog stream-a.
Logika igre se nalazi u klasi Game, koja trenutno ne radi mnogo. U njoj se koristi i IoService interfejs koji definiše kako se tekst čita i piše. Implementacija ovog interfejsa se nalazi u klasi StdIoService koja čita sa tastature i ispisuje na ekran.
Testovi su vrlo jednostavni jer igra trenutno ne radi ništa posebno. Jedina razlika u odnosu na samu igru je da testovi koriste lažnu klasu za implementaciju IoService interfejsa i preko nje mogu da prate da li se igra dobro ponaša u kontrolisanim uslovima.
To je to. Sledeće što imam u planu je obrada komandi i mogućnost kretanja kroz sobe. Videćemo kako će to sve zajedno da se uklopi
Dopuna: 22 Jul 2016 17:19
Woho, evo me opet Na brzaka sam sklepao sistem za obradu i izvršavanje komandi. Sada je moguće kretati se kroz igru i gledati šta se oko igrača nalazi. Sledeće na redu su inventar i stvari koje će igrač moći da koristi.
Dopuna: 22 Jul 2016 17:30
I opet sam zaboravio da malo opišem šta sam uradio. Komande koje korisnik kuca se obrađuju u dva koraka. Prvi korak je da igra pronađe da li se uneti tekst slaže sa nekom od registrovanih komandi. Provera se vrši preko regex-a. Ako igra ne nađe komandu, ispisuje se poruka o grešci.
U slučaju da komanda bude pronađena, igra pripremi listu internih komandi koje je potrebno izvršiti. Na taj način mogu u igri da imam komandu "pijuči" i da igra ispiše tekst "piju, piju" bez menjanja koda. Igra protrči kroz sve regex grupe u upisanoj komandi i zatim odradi regex replace nad svim internim komandama tako da parametri koje je korisnik ukucao pređu i na interne komande. Npr. ako igrač ukuca "idi na sever", i komanda je definisana kao ^idi na (.*)$, a interna komanda kao go $1, igra će tekst sever (prva regex grupa) prebaciti u internu komandu i ono što će igra dobiti da izvrši je go sever.
+ Moja struktura je ovakvaGameManager je najbitnija skripta u svakoj igri koja kontroliše ono najbitnije - tok igre.
Njoj se druge komponente obraćaju za informacije i upute itd.
Skripte koje nisu komponente (one koje ne potiču od MonoBehaviora) koristim za podatke.
Skripte koje su komponente najčešće se fokusiraju na jedan zadatak.
Putevi imaju skriptu koja stvara vozila na njima i kontroliše ostale parametre.
Svako vozilo ima skriptu koja kontroliše samo kretanje vozila itd.
Skripte koje su komponente a koje nisu specifične za bilo koji objekat trpam u Helpers folder i težim ka tome da ih pišem tako da budu univerzalne.
Jedan od primera je skripta koja "animira" float na shaderu i tako pomera teksturu na materijalu.
Na koji god model da je okačim, radiće i to joj je jedini zadatak.
Što se projekta tiče, ja sam se već smorio malo.
Od poslednje objave sam napisao :
- Safe zone - put koji nema vozila :
Eventualno će biti zamenjeni nekom livadom
- Sezone - zima, leto, jesen; na putevima : sneg -> ništa -> kiša
Trenutno postoji samo vizuelna promena, sezone će uticati na gejmplej na neki način sigurno.
- nešto bolji kod za pozicioniranje pačića :
-- Sve postojeće zone se pomere ka novim izračunatim koordinatama
-- Svim patkama se dodele nove zone
-- Patkice dobiju mini bust i nakon .xf se vrate na poziciju
- difficulty modifier -> što duže preživite to je više vozila na putu sa većom brzinom
- Spawn queue na putevima -> umesto odmah, automobili se stvaraju nakon određenog intervala uz prethodnu proveru dostupnosti na lokaciji stvaranja
i svašta nešto.
Trenutno tražim rešenja za stapanje materijala, jer se trenutno pozove sezona i prema njoj stvaraju novi putevi. Međutim ja bih hteo da postepeno svaki put postane leden ili da kiša postepeno počne da pada ...
Takođe tražim rešenja za fullscreen animaciju tekstura jer bih da propratim nekim efektima promenu sezona.
Nemoj da nam se smoriš Čini mi se da ti usput tražiš rešenja za probleme koji su se pojavili, a možda i za one za koje misliš da će se možda pojaviti, pa te to malo demotiviše.
Jedna od tehnika za izbegavanje stanja u kojem si se našao je da napraviš detaljan plan onoga što treba da uradiš pre nego što počneš da programiraš. Odlučiš se za biblioteke koje ćeš koristiti, algoritme kojima ćeš obrađivati podatke, izdefinišeš sve u sitna crevca i onda kad počneš da programiraš nemaš više o čemu da misliš, samo uživaš u programiranju i gledaš kako se sve razvija pred tvojim očima
Red bi bilo i da ja objasnim na koji način radi Q7:
Pri započinjanju bot "uči" sve definicije iz /definitions (definicije su razdvojene po temama pa tako mogu da postoje definicije vezane za život, nauku, sport, muziku itd). Definicije su pisane u XML sintaksi i to izgleda ovako:
<category>
<pattern>KAKO SI *</pattern>
<template>
Dobro, hvala na pitanju!
</template>
</category>
Što pokriva sve slučajeve kod kojih rečenica na početku sadrži reči Kako si.
Kako si danas? => Dobro, hvala na pitanju!
Kako si Q7? => Dobro, hvala na pitanju!
Moguće je odraditi nešto slično ako se reči nalaze unutar rečenice menjanjem šablona:
<pattern>_ KAKO SI *</pattern>
Q7, kako si danas? => Dobro, hvala na pitanju!
I naravno ako reči trebaju da budu na kraju samo se ukloni asteriks s kraja. Naravno, obzirom da se na razne načine može pitati ista stvar, pri postavljanju nekog pitanja moguće je prebaciti bota na već postojeću definiciju i izbeći time pisanje istog koda više puta (ispoštovan DRY princip):
<category>
<pattern>JA SAM *</pattern>
<template>
Drago mi je, <star/>!
</template>
</category>
<category>
<pattern>ZOVEM SE *</pattern>
<template>
<srai>JA SAM <star/></srai>
</template>
</category>
Pored toga moguće je i započinjati određenu temu preko <topic> taga gde se preko atributa name definiše ime teme o kojoj se raspravlja tako da tu mogu da budu definisane posebne definicije vezane za tu temu (više tok nego klasa), a iz tema se može i izlaziti postavljanjem šablona na * i nastaviti opšti tok razgovora. Ima tu još stvarčica poput definisanja promenljivih, uslova, sakrivanje procesuiranja od korisnika preko taga <think>, ali ne bih da vas zamaram time
E sad, da je samo to bilo bi lagano, nego treba sad to prebaciti na web i odraditi front-end + back-end koji treba i da procesuira te podatke. Najverovatnije ću to da odradim preko Rails-a jer je Node kilav za bilo kakve zahtevnije stvari
Osnovna podrška za inventar i stvari je gotova. Trenutno je moguće pogledati stvari koje se nalaze oko igrača ili u inventaru, uzeti neku stvar, što može prouzrokovati neke posledice (uzimanje može pokrenuti bilo koju komandu, npr. ispis teksta, promenu opisa nivoa, pomeranje na drugi nivo, itd...).
Sledeće na redu je korišćenje stvari. To bi trebalo da bude prilično jednostavno. nakon toga dolazi na red dodavanje novih komandi koje će mi biti potrebne za sam scenario igre... npr. dodavanje/brisanje stvari s nivoa, dodavanje/brisanje prolaza do drugih nivoa, možda kombinovanje 2 stvari u jednu... videćemo
Na kraju će mi ostati da smislim neki scenario... to će biti najteže
Dopuna: 28 Jul 2016 13:47
Previše optimistički sam se bacio na ovaj projekat Hteo sam da kod aplikacije bude relativno jednostavan i da se većina logike nalazi u podacima koji opisuju igru (koje sobe postoje, koje stvari, šta je sa čim povezano i slično). Elem, optimistično je bilo to što sam hteo sve to da odradim bez nekog type sistema za objekte i nekog malo ozbiljnijeg skript jezika.
Još jedna stvar koju sam svesno izbegao je dodeljivanje komandi objektima. Zato sada u igri neće biti moguće ukucati recimo "otključaj vrata", nego će igrač morati da ukuca "upotrebi ključ". Sve u svemu, sad je već malo kasno da sve ovo reorganizujem, ali kada se završi takmičenje, možda odradim neki normalan endžin za pravljenje tekstualnih avantura
Sve u svemu, korišćenje objekata je napravljeno. Objekti koji ne mogu da se uzmu ili da se koriste se označavaju tako što je prvi znak njihovog Id donja crta. To so stvari koje samo stoje u sobi i moguće ih je pogledati.
Ostale stvari mogu da se uzmu i koriste. Svako uzimanje ili korišćenje aktiviraju komande koje su povezane za tu akciju. Uz to, svaka svtav može da ima i listu stvari koje moraju biti u sobi ili inventaru da bi mogla da se iskoristi. Na taj način mogu da imam stvar ključ1, koja zahteva da u sobi budu vrata1 da bi mogao da se iskoristi.
Endžin je manje-više gotov. Možda ću morati da dodam još po neku komandu u zavisnosti od toga šta ću smisliti u priči igre, ali se sada polako bacam na pisanje pričice. Ne očekujte neko veliko remek delo. Biće kratka igrica koja će moći da se završi za par minuta
Btw. sa gejmplej strane bi mnogo bolje bilo da igrač može da napiše bilo šta pre reči "wall", na primer "look at bad wall", a igra da shvati to kao "look at wall"; ili "take big hammer" -> "take hammer"
Ovako moram da grešim dok ne pogodim pravu reč na koju si mislio.
U svakom slučaju je super utisak, strašno volim te tekstualne avanturice.
Nemoj da zaboraviš da dodaš komandu za izlistavanje svega iz inventara