Tyhmät kysymykset (I/2009)
Re: Tyhmät kysymykset
Huoh tätä Olwia.
Keksii vastaukset omiin kysymyksiinsä aina heti kun on ensin yrittänyt kysyä niitä muilta...
Keksii vastaukset omiin kysymyksiinsä aina heti kun on ensin yrittänyt kysyä niitä muilta...
Huuda mun ip:tä!
Re: Tyhmät kysymykset
Datakerroksesta: Sillä teen waypointit jos keksin jonkun systeemin.koodaaja wrote:Haha, ei oikeassa tekoälyssä datakerroksella tehdä muuta kuin waypointteja.
Bresenhamin algoritmi? Sitähän käytetään viivojen rasterointiin D: Vai viittaatko nyt siihen, että sillä tarkistettaisiin mistä voi kulkea?
A* on loppujen lopuksi aivan ymmärrettävä. Eli kokeillaan aina jatkaa helpoimmasta tilestä, helppous lasketaan kaavalla F = G + H, jossa G on matka kyseiseen tileen ja H on arvio etäisyydestä maaliin. Koska en osaa asiaa selittää, niin google on jälleen ystävä. Hakusanalla "A* tutorial" ensimmäinen osuma: http://www.policyalmanac.org/games/aStarTutorial.htm Itse käsitin A*in toimintatavan jotenkuten tuon luettuani.
Ja Wikipedia ei ole kovin hyvä ohjelmointiresurssi, siellä asiat tupataan selittämään vähän.. monimutkaisesti.
Bresenhamin algoritmista: Kyllä.
A*-sta: Kaivoit esiin juuri sen tutoriaalin jota en ymmärtänyt. Aika hauska juttu sinänsä. Kokeillaan nyt vielä sisäistää se...
Re: Tyhmät kysymykset
A* algotrimin toteuttamsesta puhetta ? Eikös mahtava Zero kerran tehnyt valmiiksi kyseisen systeemin ? ... Onko sitä enää tallessa kenelläkään ? pysyvää linkkiä jos joku löytää. Tietenkin on eriasia jos haluaa itse toteuttaa algotrimin...
-On selkeästi impulsiivinen koodaaja joka...
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Tyhmät kysymykset
Jäi vaivaamaan, kun en aikanaan saanut A*ia CB:lle, ja nyt kun sitä vielä joku kysyi niin en saanut unta ennen kuin kirjoitin sen. Eli epäselvää purkkaa, olkaa hyvät. (mutta se toimii, mwohoo)
Pitänee kirjoittaa jossain vaiheessa selkeämpi ja nopeampi versio.
Toimii siis seuraavasti:
1. Ota nykyinen piste. (alussa vihreä starttiruutu)
2. Merkitse kaikki sen ympärillä olevat (en jaksanut vääntää diagonaalisia liikkeitä tähän, joten neljä suuntaa) "auki oleviksi". Laske matka niihin alkupisteestä (nykyisen matka + 1 ruutu, siis.). Laske vaakasuora matka niistä maaliin, pystysuora matka maaliin ja ynnää. Tämä on niin sanottu heuric-arvo, eli arvio jäljellä olevasta matkasta. Tämän voisi toki laskea hienomminkin, mutta tämäkin on ihan ok. Sitten asetetaan näiden pisteiden "äidiksi" nykyinen piste. Mikäli joku oli jo valmiiksi auki, tarkistetaan onko uusi reitti lyhyempi kuin vanha. Jos on, äitiä vaihdetaan.
3. Nyt menee jännäksi: verrataan kaikkien avoimien pisteiden F-arvoa (F=H+G, eli heuric + jo kuljettu) keskenään, ja asetetaan pieniarvoisin nykyiseksi pisteeksi.
4. Jos nykyinen piste on maali, ollaan perillä. Seuraamalla kaikkien solujen äidit maalista starttiin, saadaan kuljettu reitti.
Ja taas venyi projektini koodaamisen aloitus :p
Pitänee kirjoittaa jossain vaiheessa selkeämpi ja nopeampi versio.
Code: Select all
Dim map(39, 29, 5)
//constants for easier array handling
Const OPEN = 0'unused = 0, open = 1, closed = 2
Const G = 1
Const H = 2
Const MX = 3
Const MY = 4
Const STYLE = 5 //0=empty, 1=wall, 2=start, 3=goal, 4 = inroute
ClsColor 255, 255, 255
Cls
Color 0, 0, 0
While True
//reset
For i = 0 To 39
For j = 0 To 29
For p = 0 To 5
map(i,j,p)=0
Next p
Next j
Next i
//"editor"
While KeyHit(28) = 0
If MouseHit(1) Then
map(Int(MouseX()/10), Int(MouseY()/10), STYLE) = map(Int(MouseX()/10), Int(MouseY()/10), STYLE)+1
If map(Int(MouseX()/10), Int(MouseY()/10), STYLE) = 4 Then map(Int(MouseX()/10), Int(MouseY()/10), STYLE) = 0
EndIf
draw()
DrawScreen
Wend
//check that we find a start and a goal
startfound = 0:goalfound = 0
For i = 0 To 39
For j = 0 To 29
If map(i,j,STYLE) = 2 Then
startx = i
starty = j
If startfound = 1 Then MakeError "invalid map!"
startfound = 1
EndIf
If map(i,j,STYLE) = 3
goalx = i
goaly = j
If goalfound = 1 Then MakeError "invalid map!"
goalfound = 1
EndIf
Next j
Next i
If startfound = 0 Or goalfound = 0 Then MakeError "invalid map!"
curx = startx
cury = starty
map(curx, cury, MX) = curx
map(curx, cury, MY) = cury
found = 0
While found = 0
If curx<39 Then
If map(curx+1,cury,STYLE) <> 1 And map(curx+1, cury,OPEN) = 0 Then
map(curx+1, cury, OPEN) = 1
map(curx+1, cury, G) = map(curx, cury, G)+1
map(curx+1, cury, H) = Abs(curx+1-goalx)+Abs(goaly-cury)
map(curx+1, cury, MX) = curx
map(curx+1, cury, MY) = cury
Else
If map(curx+1, cury, OPEN) >0 Then
xm = map(curx+1, cury, MX)
ym = map(curx+1, cury, MY)
If (map(xm, ym, H)+map(xm, ym, G))>(map(curx, cury, H)+map(curx, cury, G)) Then
map(curx+1, cury, G) = map(curx, cury, G)+1
map(curx+1, cury, MX) = curx
map(curx+1, cury, MY) = cury
EndIf
EndIf
EndIf
EndIf
If cury<29 Then
If map(curx,cury+1,STYLE) <> 1 And map(curx, cury+1,OPEN) = 0 Then
map(curx, cury+1, OPEN) = 1
map(curx, cury+1, G) = map(curx, cury, G)+1
map(curx, cury+1, H) = Abs(curx-goalx)+Abs(cury+1-goaly)
map(curx, cury+1, MX) = curx
map(curx, cury+1, MY) = cury
Else
If map(curx, cury+1, OPEN) >0 Then
xm = map(curx, cury+1, MX)
ym = map(curx, cury+1, MY)
If (map(xm, ym, H)+map(xm, ym, G))>(map(curx, cury, H)+map(curx, cury, G)) Then
map(curx, cury+1, G) = map(curx, cury, G)+1
map(curx, cury+1, MX) = curx
map(curx, cury+1, MY) = cury
EndIf
EndIf
EndIf
EndIf
If cury>0 Then
If map(curx,cury-1,STYLE) <> 1 And map(curx, cury-1,OPEN) = 0 Then
map(curx, cury-1, OPEN) = 1
map(curx, cury-1, G) = map(curx, cury, G)+1
map(curx, cury-1, H) = Abs(curx-goalx)+Abs(cury-1-goaly)
map(curx, cury-1, MX) = curx
map(curx, cury-1, MY) = cury
Else
If map(curx, cury-1, OPEN) >0 Then
xm = map(curx, cury-1, MX)
ym = map(curx, cury-1, MY)
If (map(xm, ym, H)+map(xm, ym, G))>(map(curx, cury, H)+map(curx, cury, G)) Then
map(curx, cury-1, G) = map(curx, cury, G)+1
map(curx, cury-1, MX) = curx
map(curx, cury-1, MY) = cury
EndIf
EndIf
EndIf
EndIf
If curx>0 Then
If map(curx-1,cury,STYLE) <> 1 And map(curx-1, cury,OPEN) = 0 Then
map(curx-1, cury, OPEN) = 1
map(curx-1, cury, G) = map(curx, cury, G)+1
map(curx-1, cury, H) = (Abs((curx-1)-goalx)+Abs(cury-goaly))
map(curx-1, cury, MX) = curx
map(curx-1, cury, MY) = cury
Else
If map(curx-1, cury, OPEN) >0 Then
xm = map(curx-1, cury, MX)
ym = map(curx-1, cury, MY)
If (map(xm, ym, H)+map(xm, ym, G))>(map(curx, cury, H)+map(curx, cury, G)) Then
map(curx-1, cury, G) = map(curx, cury, G)+1
map(curx-1, cury, MX) = curx
map(curx-1, cury, MY) = cury
EndIf
EndIf
EndIf
EndIf
If ((curx = goalx) And (cury = goaly)) Then found = 1
map(curx, cury, OPEN) = 2
first_ = 1
For i = 0 To 39
For j = 0 To 29
If map(i,j,OPEN) = 1 And ((map(i, j, G) + map(i, j, H)<tempf) Or (first_=1))
tempf = map(i, j, G) + map(i, j, H)
curx = i
cury = j
first_ = 0
EndIf
Next j
Next i
Wend
curx = map(goalx, goaly, MX)
cury = map(goalx, goaly, MY)
While Not ( curx = startx And cury = starty )
map(curx, cury, STYLE) = 4
curx2 = map(curx, cury, MX)
cury2 = map(curx, cury, MY)
curx = curx2
cury = cury2
Wend
draw()
DrawScreen
WaitKey
ClearKeys
Wend
Function draw()
For x = 0 To 39
For y = 0 To 29
If map(x,y,STYLE) = 2 Then Color 0, 255, 0
If map(x,y,STYLE) = 3 Then Color 255, 0, 0
If map(x,y,STYLE) = 4 Then Color 0, 0, 255
If map(x,y,STYLE) Then Box x*10+1, y*10+1, 9, 9
Color 0, 0, 0
Line 0, y*10, 400, y*10
Next y
Line x*10, 0, x*10, 300
Next x
EndFunction
1. Ota nykyinen piste. (alussa vihreä starttiruutu)
2. Merkitse kaikki sen ympärillä olevat (en jaksanut vääntää diagonaalisia liikkeitä tähän, joten neljä suuntaa) "auki oleviksi". Laske matka niihin alkupisteestä (nykyisen matka + 1 ruutu, siis.). Laske vaakasuora matka niistä maaliin, pystysuora matka maaliin ja ynnää. Tämä on niin sanottu heuric-arvo, eli arvio jäljellä olevasta matkasta. Tämän voisi toki laskea hienomminkin, mutta tämäkin on ihan ok. Sitten asetetaan näiden pisteiden "äidiksi" nykyinen piste. Mikäli joku oli jo valmiiksi auki, tarkistetaan onko uusi reitti lyhyempi kuin vanha. Jos on, äitiä vaihdetaan.
3. Nyt menee jännäksi: verrataan kaikkien avoimien pisteiden F-arvoa (F=H+G, eli heuric + jo kuljettu) keskenään, ja asetetaan pieniarvoisin nykyiseksi pisteeksi.
4. Jos nykyinen piste on maali, ollaan perillä. Seuraamalla kaikkien solujen äidit maalista starttiin, saadaan kuljettu reitti.
Ja taas venyi projektini koodaamisen aloitus :p
Re: Tyhmät kysymykset
Pitäisi saada tehtyä joku systeemi, joka pitäisi tietyn joukon pelihahmoja koossa, niin ettei kukaan lähde vaeltamaan liian kauas muista. Hahmojen pitää silti pystyä kuljeskelemaan sattumanvaraisesti, mutta joutuessaan liian kauaksi muista, palata lähemmäksi. En kuitenkaan keksi mitään järkevää tapaa toteuttaa tätä. Ehdotuksia?
Re: Tyhmät kysymykset
Tarkoitatko joitain aavesoturin formation based combat studyn tapaista ? jos tarkoitat niin löydät sen tuolta viewtopic.php?f=12&t=784Vieras wrote:Pitäisi saada tehtyä joku systeemi, joka pitäisi tietyn joukon pelihahmoja koossa, niin ettei kukaan lähde vaeltamaan liian kauas muista. Hahmojen pitää silti pystyä kuljeskelemaan sattumanvaraisesti, mutta joutuessaan liian kauaksi muista, palata lähemmäksi. En kuitenkaan keksi mitään järkevää tapaa toteuttaa tätä. Ehdotuksia?
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Tyhmät kysymykset
Tee joukolle joku keskipiste, vaikka näkymätön objekti. Sitten, jos ne ovat liian kaukana (If distance(hahmo, keskipiste)>range), käännät ne keskipisteeseen päin (pointobjec hahmo, keskipiste) ja liikutat sinne päin randomisuunnan sijaan.
Re: Tyhmät kysymykset
Batlorder, en tarkoittanut ihan tuon tapaista, koska hahmojen pitäisi liikkua satunnaisessa rykelmässä, eikä muodostelmassa.
Jotain tuon tapaista ajattelinkin, mutta miten saan määritettyä joukon keskipisteen?Tee joukolle joku keskipiste, vaikka näkymätön objekti. Sitten, jos ne ovat liian kaukana (If distance(hahmo, keskipiste)>range), käännät ne keskipisteeseen päin (pointobjec hahmo, keskipiste) ja liikutat sinne päin randomisuunnan sijaan.
Re: Tyhmät kysymykset
Keksikää minulle jotain koodattavaa (helppoa.) Itse en keksi mtn...
-
- Forum Veteran
- Posts: 2396
- Joined: Tue Aug 28, 2007 4:20 pm
Re: Tyhmät kysymykset
Roguelike engine, jossa sattumanvaraiset luolastot, veitsenterävä tekoäly vihollisilla ja line of sight. Ei vaadi mahdottomia taitoja, mutta tekemisessä menee kauan. Niin ja Google / Wikipedia yhdistelmään "Roguelike", "Rogue" (Rogueliket perustuvat tähän) ja "NetHack" (Ehkä kuuluisin Roguelike) niin löytyy tietoa genrestä ja muusta asiaan liittyvästä.
EDIT: Tästä voi olla apua.
EDIT: Tästä voi olla apua.
Last edited by Koodiapina on Wed Jun 25, 2008 7:31 pm, edited 1 time in total.
Re: Tyhmät kysymykset
Vaikutti liian vaikealta.Grandi wrote:Roguelike engine, jossa sattumanvaraiset luolastot, veitsenterävä tekoäly vihollisilla ja line of sight. Ei vaadi mahdottomia taitoja, mutta tekemisessä menee kauan. Niin ja Google / Wikipedia yhdistelmään "Roguelike", "Rogue" ja "NetHack" niin löytyy tietoa genrestä ja muusta asiaan liittyvästä.
EDIT: Tästä voi olla apua.
Re: Tyhmät kysymykset
Tommosen luola-rpg:n tekeminen on alottelijalle erittäin vaikeeta. Älä edes yritä semmosta. Tee mieluummin vaikkapa ylhäältäpäin kuvattu räiskintäpeli. Se on yksi helpoimpia pelityyppejä mitä voit luoda.
Sen sijaan että räiskinnässä olisi pelaajana klassinen guy cb:n mediakansiosta, pistä pelaaja vaikkapa ohjailemaan tankkia tai helikopteria.
Sen sijaan että räiskinnässä olisi pelaajana klassinen guy cb:n mediakansiosta, pistä pelaaja vaikkapa ohjailemaan tankkia tai helikopteria.
Re: Tyhmät kysymykset
Olen tässä suunnitellut seuraavaa projektia. Siinä ajetaan veneellä.Jonez wrote:Tommosen luola-rpg:n tekeminen on alottelijalle erittäin vaikeeta. Älä edes yritä semmosta. Tee mieluummin vaikkapa ylhäältäpäin kuvattu räiskintäpeli. Se on yksi helpoimpia pelityyppejä mitä voit luoda.
Sen sijaan että räiskinnässä olisi pelaajana klassinen guy cb:n mediakansiosta, pistä pelaaja vaikkapa ohjailemaan tankkia tai helikopteria.
-
- Moderator
- Posts: 1583
- Joined: Mon Aug 27, 2007 11:24 pm
- Location: Otaniemi - Mikkeli -pendelöinti
Re: Tyhmät kysymykset
Kuten sanoin, objektilla. Esimerkkiä seuraa, siihen tosin jätin keskipisteen näkyville.Guest wrote:Jotain tuon tapaista ajattelinkin, mutta miten saan määritettyä joukon keskipisteen?
Code: Select all
//luodaan hyvin yksinkertainen tyyppi
Type guy
Field obj
Field nextmove
EndType
//ladataan mediat
master = LoadObject("Media\guy.bmp", 72)
keskipiste = LoadObject("Media\bullet.bmp")
ShowObject master, OFF
amount = 20
//tehdään kymmenen ukkoa, kloonataan masterista
For i = 1 To amount
g.guy = New(guy)
g\obj = CloneObject(master)
//siirretään randomikohtaan
RotateObject g\obj, Rand(0, 360)
MoveObject g\obj, Rand(0, 100)
RotateObject g\obj, Rand(0, 360)
g\nextmove = Timer()+Rand(100, 4000)
Next i
Repeat
//keskipiste liikkuu nuolista
TranslateObject keskipiste, RightKey()-LeftKey(), UpKey()-DownKey()
//joka ukkoa liikutetaan
For g.guy = Each guy
MoveObject g\obj, 2
//jos kääntymisaika on kulunut, arvo uusi suunta ja aika
If Timer()>g\nextmove Then
RotateObject g\obj, Rand(0, 360)
g\nextmove = Timer()+Rand(500, 2000)
EndIf
//jos taas ollaan liian kaukana keskipisteestä, liikutaan siihen päin satunnainen aika
If Distance2(g\obj, keskipiste)>100 Then
PointObject g\obj, keskipiste
g\nextmove = Timer()+Rand(500, 1000)
EndIf
Next g
DrawScreen
Forever
Re: Tyhmät kysymykset
[quote=Komennon Decrypt ohje]Sinun ei esimerkiksi tarvitse dekryptata (purkaa salausta) kovalevylle ennen lukemista, vaan senkin saa suoraan muistiin.[/quote]
Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.
Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.
Re: Tyhmät kysymykset
laittamalla muistimuuttuja polun sijastaEräs Vieras wrote:Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.Komennon Decrypt ohje wrote:Sinun ei esimerkiksi tarvitse dekryptata (purkaa salausta) kovalevylle ennen lukemista, vaan senkin saa suoraan muistiin.
ja oma kysymykseni:
miten saa tilekartan läpinäkyvän värin vaihdetuksi? olen ymmärtänyt että tilesetin maskaus riittäisi mutta ei näytä toimivan.
ja toinen:
miten saa piirrettyä kuvan tilekartan päälle?
Koodarina kohtalainen, henkilönä vittumainen
Re: Tyhmät kysymykset
Eli siis esimerkiksi:nevssons wrote:laittamalla muistimuuttuja polun sijastaEräs Vieras wrote:Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.Komennon Decrypt ohje wrote:Sinun ei esimerkiksi tarvitse dekryptata (purkaa salausta) kovalevylle ennen lukemista, vaan senkin saa suoraan muistiin.
Code: Select all
Decrypt "save.blah",savedata$,"SALASANA"
Minulla tuo ei toiminut. Savedata$ ei sisältänyt kuin nollan.
Re: Tyhmät kysymykset
sinun täytyy varata siihen muistia komennolla MAKEMEMBLOCKEräs Vieras wrote: Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu
nevssons wrote:laittamalla muistimuuttuja polun sijasta.
Eli siis esimerkiksi:
vai?Code: Select all
Decrypt "save.blah",savedata$,"SALASANA"
Minulla tuo ei toiminut. Savedata$ ei sisältänyt kuin nollan.
laitan vielä uudestaan omat kysymykseni
ja oma kysymykseni:
miten saa tilekartan läpinäkyvän värin vaihdetuksi? olen ymmärtänyt että tilesetin maskaus riittäisi mutta ei näytä toimivan.
ja toinen:
miten saa piirrettyä kuvan tilekartan päälle?
Koodarina kohtalainen, henkilönä vittumainen
Re: Tyhmät kysymykset
nevssons: Ainakin itselläni tilekartan maskaus toimii täydellisesti. Käy tarkistamassa, maskaatko sen oikealla värillä? Esim. Paintin paletissa on magenta, mutta siinä on myös magentaa muistuttava väri. Usein sekoitan nuo itse.
Re: Tyhmät kysymykset
Kuvan saa tilekartan päälle laittamalla joko updategamen tai drawgamen (en muista kumman) kartan ja kuvan piirtämisen väliin (kartta tietenkin piirretään ensin).
CoolBasic henkilökuntaa
Kehittäjä
Kehittäjä