Page 1 of 2

Botit

Posted: Thu Jun 05, 2008 7:17 pm
by Monsteruy
Miten te tekisitte botit? Olen miettinyt bottien tekoa siitä lähtien kun sain pelimoottorin muuten valmiiksi... Eli ampuvia vastustaja botteja pitäisi saada liikkumaan ympäri tilekarttaa, sillä tavalla ettei ne törmäisi koko aika tilen seiniin vaan liikkuisi siellä. Olen yrittänyt mm. arpoa Randillä lukuja jotka toimisi botin liikkeinä, mutta siitä tulee liian holtiton. Sen lisäksi niiden pitäisi itse tajuta ampua jos ne näkee vastustajan tai jos niitä ammutaa. Jonkin näköisen tekoälyn ne tarvitsevat, mutta en oikein tiedä mistä alkaa...

Re: Botit

Posted: Thu Jun 05, 2008 7:32 pm
by nevssons
Monsteruy wrote:Miten te tekisitte botit? Olen miettinyt bottien tekoa siitä lähtien kun sain pelimoottorin muuten valmiiksi... Eli ampuvia vastustaja botteja pitäisi saada liikkumaan ympäri tilekarttaa, sillä tavalla ettei ne törmäisi koko aika tilen seiniin vaan liikkuisi siellä. Olen yrittänyt mm. arpoa Randillä lukuja jotka toimisi botin liikkeinä, mutta siitä tulee liian holtiton. Sen lisäksi niiden pitäisi itse tajuta ampua jos ne näkee vastustajan tai jos niitä ammutaa. Jonkin näköisen tekoälyn ne tarvitsevat, mutta en oikein tiedä mistä alkaa...
Ne kävelee tiettyyn suuntaan jos tietyn matkan päässä on seinä vaihdetaan suuntaa. objectin poiminta on hödyllinen "näköä" tehtäessä

Re: Botit

Posted: Thu Jun 05, 2008 7:54 pm
by Eräs cb koodaaja
Liikkumiseen voi hyödyntää myös tilekarttojen datoja. Eli kun botin kohdalla on jokin datanumero, se käännetään johonkin asentoon. Tämä vaatii kyllä sen, että reitit ollaan jo valmiiksi määritetty tilekarttaan.

Re: Botit

Posted: Thu Jun 05, 2008 8:15 pm
by Monsteruy
No olisiko kellään jotain yksikertaista tai ei niin yksin kertaista koodi esimerkkiä botista? Ja miten tuota data -kerrosta käytetään? Mä käytän TileGeniä...

Re: Botit

Posted: Fri Jun 06, 2008 12:49 pm
by Eräs cb koodaaja
No koodi voi olla vaikka tällainen(ei toimi suoraan, mutta antaa esimerkkiä ;) ):

Code: Select all

Repeat
    datanumero = Getmap(3,ObjectX(Botti),ObjectY(Botti))
    If datanumero = 1 Then Rotateobject Botti,0
    If datanumero = 2 Then Rotateobject Botti,90
    If datanumero = 3 Then Rotateobject Botti,180
    If datanumero = 4 Then Rotateobject Botti,270
    Drawscreen
Forever 
Tilegenistä en osaa neuvoa.

Re: Botit

Posted: Fri Jun 06, 2008 1:53 pm
by Nemesis
Tässä pieni esimerkki botista, joka kääntyy aina randomilla törmätessään johonkin. Tähän vielä ObjectPickillä joku tarkistus, onko pelaajia edessä ja jos on, ammutaan. Tuossa kääntymisessä on myös kehitettävää.

Code: Select all

FrameLimit 40 

kartta = LoadMap("Media\cdm2.til","Media\tileset.bmp")
botti = LoadObject ("Media\guy.bmp",72)

nopeus = 2	'Botin nopeus

SetupCollision botti, kartta, 1, 4, 2
Repeat
	MoveObject botti, nopeus
	
	'Tarkistetaan, onko törmätty
	If CountCollisions(botti) Then
		TurnObject botti, Rand(360)	'Käännetään bottia random-suuntaan. 
		UpdateGame
	EndIf
	
	CloneCameraPosition botti
	DrawScreen
Forever

Re: Botit

Posted: Sat Jun 07, 2008 1:10 pm
by Nomic
Suosittelen tutkimaan tätä algoritmia: http://fi.wikipedia.org/wiki/Bresenhamin_algoritmi

Eli käyttö:
1. luo satunnaisesti botille tulevat koordinaatit.
2. tarkista onko reitin varrella esteitä
2a. jos on, valitse toinen reitti
2b. jos ei ole, kulje reitti

Liikkumisen voi toteuttaa tehden reitistä yksiuloitteisen listan. Jokaiseen alkioon tallennetaan tulevat koordinaatit x- ja y-koordinaatit erottaen pisteellä.
Tehdään looppi, jonka sisällä botti liikkuu. Listaa pienennetään aina kun botti on samassa kohtaa listan viimeisimmän alkion kanssa.
Listaa pienennetään, jotta voidaan ottaa aina viimeinen alkio, kun olemme samassa kohtaa, kuin mihin meidät on määrätty. Esimerkiksi:
hahmon koordinaatit on 3.14, listan viimeisen alkion sisällä on tietona '3.14', jotenka samassa ollaan: poistetaan/tyhjennetään alkio ja tarkastetaan seuraavaa koordinaattia ja liikutaan sen suuntaan.

Mitä tulee hahmon näkemiseen ja tätä kohti ampumiseen: samalla algoritmilla voidaan toteuttaa tämä: Aina kun hahmo liikkuu (tai tehdään tarkistus vaikkapa sekunnin välein), botit käyttävät tuota viiva-algoritmia jonka kohde on pelaajan koordinaatit. Jos edessä on seinä, hylätään lasku, koska botti ei 'näe.' Mutta jos edessä ei ole esteitä, voi botti ampua, tehdä hälytyksen, juosta kohti tai tehdä mitä ikinä tahtoo.

Suosittelen myös tutustumaan A*-algoritmiin. Sen avulla itse olen tehnyt esteiden kiertämiset, monipuolisemmat bottien liikkumiset ja ties mitä.

En laita valmista koodia, koska siitä oppii minusta huonommin kuin potkimalla tiettyyn suuntaan. Toivottavasti tämä valaisi hieman mahdollisuuksia. :)

Re: Botit

Posted: Sat Jun 07, 2008 1:28 pm
by MikkoK
Ite tarvisin jonku botin joka liikkuu esim pientä neliötä. Esim:Koira tai lehmä tai joku elukka joka laiduntaa siis ei koirat laidunna.

Re: Botit

Posted: Sat Jun 07, 2008 1:54 pm
by Nemesis
MikkoK141 wrote:Ite tarvisin jonku botin joka liikkuu esim pientä neliötä. Esim:Koira tai lehmä tai joku elukka joka laiduntaa siis ei koirat laidunna.
Voisi toteuttaa vaikkapa näin:

Loopin sisällä:
1.Kasvata muuttujaa kaanna.

2.Liikuta_lehmää.
3. Jos kaanna on 50 tai yli:
a)Käännä lehmää 90 astetta.
b)Nollaa kaanna.

Tuo kääntää lehtää joka 50:llä kierroksella 90 astetta, eli se kulkee pientä neliötä.

Re: Botit

Posted: Sat Jun 07, 2008 1:55 pm
by Nemesis
Ohhoh... anteeksi, tuli kaksi kertaa.

Re: Botit

Posted: Sat Jun 07, 2008 2:09 pm
by MikkoK
Nemesis wrote:
MikkoK141 wrote:Ite tarvisin jonku botin joka liikkuu esim pientä neliötä. Esim:Koira tai lehmä tai joku elukka joka laiduntaa siis ei koirat laidunna.
Voisi toteuttaa vaikkapa näin:

Loopin sisällä:
1.Kasvata muuttujaa kaanna.

2.Liikuta_lehmää.
3. Jos kaanna on 50 tai yli:
a)Käännä lehmää 90 astetta.
b)Nollaa kaanna.

Tuo kääntää lehtää joka 50:llä kierroksella 90 astetta, eli se kulkee pientä neliötä.
Ööh. Tuota muuttujaa en osaa tehä mut muute menis vissii näin:

Code: Select all

If kaanna=50 then turnobject lehmä 90
and kaanna=0

Re: Botit

Posted: Sat Jun 07, 2008 2:17 pm
by Koodiapina
MikkoK141 wrote:Ööh. Tuota muuttujaa en osaa tehä mut muute menis vissii näin:

Code: Select all

If kaanna=50 then turnobject lehmä 90
and kaanna=0
Koodisi menisi kääntäjästä läpi tässä muodossa:

Code: Select all

if kaanna=50 then
     turnobject lehmä,90
     kaanna=0
endif
Andia käytetään siis ehdoissa. Esimerkiksi:

Code: Select all

If jotain = 3 and muuta then
     ' tee jotain
endif

Re: Botit

Posted: Sat Jun 07, 2008 2:35 pm
by MikkoK
Ookkei eli suurinpiirtein osaan koodata oikein. :D Mutta tuo muuttuja:

Code: Select all

If kaanna>0 then
moveobject lehmä 1 
kaanna+1
oisko se näin?

Re: Botit

Posted: Sat Jun 07, 2008 2:42 pm
by Harakka
Koodistasi puuttuu EndIf ja se toimisi vähän eri tavalla: jos muuttuja kaanna olisi yli nolla, lehmä liikkuisi eteenpäin (ja muuttuja kasvaisi). Siitä puuttuu kokonaan kääntyminen. Sen saisi tehtyä vaikka näin:

Code: Select all

MoveObject lehmä, 1 'lehmä liikkuu aina (huomaa pilkku)
kaanna = kaanna + 1 'muuttujan arvo kasvaa aina
If kaanna = 50 Then 'jos on kääntymisen aika
    TurnObject lehma, 90 'käännetään lehmää 90 astetta
    kaanna = 0 'palautetaan muuttuja nollaan, josta se jatkaa kasvamista
EndIf 'lopetetaan ehtolauseke (muista tämä)
Nuo siis repeat-loopin sisään. Toivottavasti kommenteista on apua ja tajuat idean.

EDIT: Täältä löytyy aikaisempi esimerkkikoodini täsmälleen samasta aiheesta. Siinä on pehmeä kääntyminen, mutta suosittelen aloittamaan simppelimmästä.

Re: Botit

Posted: Fri Jun 20, 2008 1:21 am
by Jormalaz
Miten saisi botin tulemaan pelaajaan päin ja ampumaan?

Re: Botit

Posted: Fri Jun 20, 2008 11:50 am
by Eräs cb koodaaja
Pointobjectilla käännät botin, liikutat sitä ja koodaat sen ampumaan. Jos taas esimerkkiä tarviit niin kato oppitunneista ammukset2.

Re: Botit

Posted: Mon Jun 23, 2008 10:10 am
by Ilkka
Eräs cb koodaaja wrote:Liikkumiseen voi hyödyntää myös tilekarttojen datoja. Eli kun botin kohdalla on jokin datanumero, se käännetään johonkin asentoon. Tämä vaatii kyllä sen, että reitit ollaan jo valmiiksi määritetty tilekarttaan.
itse käytän tätä Data-juttua. Ja saman asian ajaa ku tekee paintil tai jollain muulla objectin ja ku koskee objectiin ni
botti kääntyy.

Re: Botit

Posted: Mon Jun 23, 2008 4:27 pm
by Jormalaz
Seuraava projektini on kohta valmis, mutta olen jäänyt jumiin... Eli siis haluaisin, että jos luoti koskettaa jotain objektia, niin se poistuu deleteobjectilla, mutta minulla on 2 ongelmaa.

1. Tulee MAV, jos laitan deleteobject, esim bottiin.
2. luotia ei enään pysty käyttämään muissa funktioissa, kun CB valittaa, että se on jo käytetty siinä ammus funktiossa.

Todella sekavaa, mutta toivottavasti tajuatte.

Seuraavan pelini nimi on Zombie Attack.

Re: Botit

Posted: Mon Jun 23, 2008 7:03 pm
by Sami The Great
Jormalaz wrote:Seuraava projektini on kohta valmis, mutta olen jäänyt jumiin... Eli siis haluaisin, että jos luoti koskettaa jotain objektia, niin se poistuu deleteobjectilla, mutta minulla on 2 ongelmaa.

1. Tulee MAV, jos laitan deleteobject, esim bottiin.
2. luotia ei enään pysty käyttämään muissa funktioissa, kun CB valittaa, että se on jo käytetty siinä ammus funktiossa.

Todella sekavaa, mutta toivottavasti tajuatte.

Seuraavan pelini nimi on Zombie Attack.
1. MAV tulee kun yrität käsitellä jo tuhottua objectia myöhemmin.
2. Mitä tarkkaanottaen tarkoitat?

Re: Botit

Posted: Mon Jun 23, 2008 7:13 pm
by Jormalaz
Sami The Great wrote:
Jormalaz wrote:Seuraava projektini on kohta valmis, mutta olen jäänyt jumiin... Eli siis haluaisin, että jos luoti koskettaa jotain objektia, niin se poistuu deleteobjectilla, mutta minulla on 2 ongelmaa.

1. Tulee MAV, jos laitan deleteobject, esim bottiin.
2. luotia ei enään pysty käyttämään muissa funktioissa, kun CB valittaa, että se on jo käytetty siinä ammus funktiossa.

Todella sekavaa, mutta toivottavasti tajuatte.

Seuraavan pelini nimi on Zombie Attack.
1. MAV tulee kun yrität käsitellä jo tuhottua objectia myöhemmin.
2. Mitä tarkkaanottaen tarkoitat?
1.Kerroppa miten tuon MAV:in saisi vittuun ja botin tuhoutumaan? MAV tulee ilmeisesti, kun käytän CountCollisionia. Onko mahdollista mitenkään lopettaa kaikki bottia käskevät funktiot?

2. Tätä: http://www.aijaa.com/v.php?i=2269174.png Ja tuossa 195 linen kohdalla on koodi: luoti.AMMUS = New(AMMUS)