Botit
Botit
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
Ne kävelee tiettyyn suuntaan jos tietyn matkan päässä on seinä vaihdetaan suuntaa. objectin poiminta on hödyllinen "näköä" tehtäessä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...
Koodarina kohtalainen, henkilönä vittumainen
-
- Active Member
- Posts: 126
- Joined: Wed Aug 29, 2007 3:55 pm
Re: Botit
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.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
-
- Active Member
- Posts: 126
- Joined: Wed Aug 29, 2007 3:55 pm
Re: Botit
No koodi voi olla vaikka tällainen(ei toimi suoraan, mutta antaa esimerkkiä ):
Tilegenistä en osaa neuvoa.
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
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Re: Botit
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
Asian tuntian oikein kirjoitus ohjeet:
-Älä tee yhdys sana virheitä.
-Vältä lyhenteitä mahd. muk.
-Yksi sanaiset lauseet? Unohda.
-Älä tee yhdys sana virheitä.
-Vältä lyhenteitä mahd. muk.
-Yksi sanaiset lauseet? Unohda.
Re: Botit
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.
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
Ite tarvisin jonku botin joka liikkuu esim pientä neliötä. Esim:Koira tai lehmä tai joku elukka joka laiduntaa siis ei koirat laidunna.
Code: Select all
#aha. @ IRCNet
<Grandi> Voit laittaa jo valmiiks hailaittiin "Amis-Mikko", koska alan kutsua sua sillä nimellä.
Re: Botit
Voisi toteuttaa vaikkapa näin: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.
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ä.
Last edited by Nemesis on Sat Jun 07, 2008 1:56 pm, edited 2 times in total.
Asian tuntian oikein kirjoitus ohjeet:
-Älä tee yhdys sana virheitä.
-Vältä lyhenteitä mahd. muk.
-Yksi sanaiset lauseet? Unohda.
-Älä tee yhdys sana virheitä.
-Vältä lyhenteitä mahd. muk.
-Yksi sanaiset lauseet? Unohda.
Re: Botit
Ööh. Tuota muuttujaa en osaa tehä mut muute menis vissii näin:Nemesis wrote:Voisi toteuttaa vaikkapa näin: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.
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ä.
Code: Select all
If kaanna=50 then turnobject lehmä 90
and kaanna=0
Code: Select all
#aha. @ IRCNet
<Grandi> Voit laittaa jo valmiiks hailaittiin "Amis-Mikko", koska alan kutsua sua sillä nimellä.
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: Botit
Koodisi menisi kääntäjästä läpi tässä muodossa: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
Code: Select all
if kaanna=50 then
turnobject lehmä,90
kaanna=0
endif
Code: Select all
If jotain = 3 and muuta then
' tee jotain
endif
Re: Botit
Ookkei eli suurinpiirtein osaan koodata oikein. Mutta tuo muuttuja: oisko se näin?
Code: Select all
If kaanna>0 then
moveobject lehmä 1
kaanna+1
Code: Select all
#aha. @ IRCNet
<Grandi> Voit laittaa jo valmiiks hailaittiin "Amis-Mikko", koska alan kutsua sua sillä nimellä.
Re: Botit
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:
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ä.
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ä)
EDIT: Täältä löytyy aikaisempi esimerkkikoodini täsmälleen samasta aiheesta. Siinä on pehmeä kääntyminen, mutta suosittelen aloittamaan simppelimmästä.
Peli piirtokomennoilla - voittaja, Virtuaalilemmikkipeli - voittaja,
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
Sukellusvenepeli - voittaja, Paras tileset - voittaja
Vaihtuva päähenkilö - voittaja, Autopeli - voittaja sekä
Hiirellä ohjattava peli - voittaja B)
-
- Active Member
- Posts: 126
- Joined: Wed Aug 29, 2007 3:55 pm
Re: Botit
Pointobjectilla käännät botin, liikutat sitä ja koodaat sen ampumaan. Jos taas esimerkkiä tarviit niin kato oppitunneista ammukset2.
Tiimit ja tuotokset:
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
RE:Ydintuho
Drahtlose:Infernalisch, Pienet pelit
Re: Botit
itse käytän tätä Data-juttua. Ja saman asian ajaa ku tekee paintil tai jollain muulla objectin ja ku koskee objectiin niErä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.
botti kääntyy.
Re: Botit
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. 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.
- Sami The Great
- Advanced Member
- Posts: 485
- Joined: Tue Aug 28, 2007 4:15 pm
- Contact:
Re: Botit
1. MAV tulee kun yrität käsitellä jo tuhottua objectia myöhemmin.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.
2. Mitä tarkkaanottaen tarkoitat?
http://www.rockodilegames.com
CoolBasickin käyttäjä vuodesta 2004.
CoolBasickin käyttäjä vuodesta 2004.
Re: Botit
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?Sami The Great wrote:1. MAV tulee kun yrität käsitellä jo tuhottua objectia myöhemmin.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.
2. Mitä tarkkaanottaen tarkoitat?
2. Tätä: http://www.aijaa.com/v.php?i=2269174.png Ja tuossa 195 linen kohdalla on koodi: luoti.AMMUS = New(AMMUS)