Page 49 of 154

Re: Tyhmät kysymykset

Posted: Tue Jun 24, 2008 8:56 pm
by Olwi
Huoh tätä Olwia.
Keksii vastaukset omiin kysymyksiinsä aina heti kun on ensin yrittänyt kysyä niitä muilta...

Re: Tyhmät kysymykset

Posted: Tue Jun 24, 2008 10:53 pm
by esa94
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.
Datakerroksesta: Sillä teen waypointit jos keksin jonkun systeemin.

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

Posted: Wed Jun 25, 2008 12:21 am
by JATothrim
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...

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 3:36 am
by koodaaja
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.

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
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

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 5:00 pm
by Guest
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

Posted: Wed Jun 25, 2008 5:40 pm
by Batlorder
Vieras 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?
Tarkoitatko joitain aavesoturin formation based combat studyn tapaista ? jos tarkoitat niin löydät sen tuolta :) viewtopic.php?f=12&t=784

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 5:42 pm
by koodaaja
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

Posted: Wed Jun 25, 2008 5:47 pm
by Guest
Batlorder, en tarkoittanut ihan tuon tapaista, koska hahmojen pitäisi liikkua satunnaisessa rykelmässä, eikä muodostelmassa.
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.
Jotain tuon tapaista ajattelinkin, mutta miten saan määritettyä joukon keskipisteen?

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 7:17 pm
by Jormalaz
Keksikää minulle jotain koodattavaa (helppoa.) Itse en keksi mtn...

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 7:24 pm
by Koodiapina
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.

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 7:30 pm
by Jormalaz
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.
Vaikutti liian vaikealta. :D

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 9:48 pm
by Jonez
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.

Re: Tyhmät kysymykset

Posted: Wed Jun 25, 2008 11:42 pm
by Jormalaz
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.
Olen tässä suunnitellut seuraavaa projektia. Siinä ajetaan veneellä.

Re: Tyhmät kysymykset

Posted: Thu Jun 26, 2008 12:26 am
by koodaaja
Guest wrote:Jotain tuon tapaista ajattelinkin, mutta miten saan määritettyä joukon keskipisteen?
Kuten sanoin, objektilla. Esimerkkiä seuraa, siihen tosin jätin keskipisteen näkyville.

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

Posted: Fri Jun 27, 2008 1:11 pm
by Eräs Vieras
[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.

Re: Tyhmät kysymykset

Posted: Fri Jun 27, 2008 1:42 pm
by nevssons
Eräs Vieras wrote:
Komennon Decrypt ohje wrote:Sinun ei esimerkiksi tarvitse dekryptata (purkaa salausta) kovalevylle ennen lukemista, vaan senkin saa suoraan muistiin.
Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.
laittamalla muistimuuttuja polun sijasta

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?

Re: Tyhmät kysymykset

Posted: Fri Jun 27, 2008 3:41 pm
by Eräs Vieras
nevssons wrote:
Eräs Vieras wrote:
Komennon Decrypt ohje wrote:Sinun ei esimerkiksi tarvitse dekryptata (purkaa salausta) kovalevylle ennen lukemista, vaan senkin saa suoraan muistiin.
Miten tämä tehdään? Tätä tarvisi pelin tallennuksen tekemiseen, mutta en tuolta löytänyt miten tuo tapahtuu.
laittamalla muistimuuttuja polun sijasta
Eli siis esimerkiksi:

Code: Select all

Decrypt "save.blah",savedata$,"SALASANA"
vai?
Minulla tuo ei toiminut. Savedata$ ei sisältänyt kuin nollan.

Re: Tyhmät kysymykset

Posted: Fri Jun 27, 2008 5:35 pm
by nevssons
Erä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:

Code: Select all

Decrypt "save.blah",savedata$,"SALASANA"
vai?
Minulla tuo ei toiminut. Savedata$ ei sisältänyt kuin nollan.
sinun täytyy varata siihen muistia komennolla MAKEMEMBLOCK

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?

Re: Tyhmät kysymykset

Posted: Fri Jun 27, 2008 6:37 pm
by esa94
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

Posted: Fri Jun 27, 2008 6:55 pm
by TheFish
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).