Tyhmät kysymykset (I/2009)

Voit pyytää apua ohjelmointiongelmiin täältä.
Locked
User avatar
Olwi
Devoted Member
Posts: 557
Joined: Sun Dec 30, 2007 5:15 pm
Location: Muhos

Re: Tyhmät kysymykset

Post by Olwi » Tue Jun 24, 2008 8:56 pm

Huoh tätä Olwia.
Keksii vastaukset omiin kysymyksiinsä aina heti kun on ensin yrittänyt kysyä niitä muilta...
Huuda mun ip:tä!

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset

Post by esa94 » Tue Jun 24, 2008 10:53 pm

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

User avatar
JATothrim
Tech Developer
Tech Developer
Posts: 606
Joined: Tue Aug 28, 2007 6:46 pm
Location: Kuopio

Re: Tyhmät kysymykset

Post by JATothrim » Wed Jun 25, 2008 12:21 am

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...
ohjelmoi C++:lla rekursiivisesti instantioidun templaten, jonka jokainen instantiaatio instantioi sekundäärisen singleton-template-luokan, jonka jokainen instanssi käynistää säikeen tulostakseen 'jea'.

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja » Wed Jun 25, 2008 3:36 am

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

Guest

Re: Tyhmät kysymykset

Post by Guest » Wed Jun 25, 2008 5:00 pm

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?

User avatar
Batlorder
Newcomer
Posts: 10
Joined: Sun Sep 16, 2007 4:26 pm
Contact:

Re: Tyhmät kysymykset

Post by Batlorder » Wed Jun 25, 2008 5:40 pm

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

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja » Wed Jun 25, 2008 5:42 pm

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.

Guest

Re: Tyhmät kysymykset

Post by Guest » Wed Jun 25, 2008 5:47 pm

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?

Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: Tyhmät kysymykset

Post by Jormalaz » Wed Jun 25, 2008 7:17 pm

Keksikää minulle jotain koodattavaa (helppoa.) Itse en keksi mtn...

User avatar
Koodiapina
Forum Veteran
Posts: 2396
Joined: Tue Aug 28, 2007 4:20 pm
Contact:

Re: Tyhmät kysymykset

Post by Koodiapina » Wed Jun 25, 2008 7:24 pm

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.
Last edited by Koodiapina on Wed Jun 25, 2008 7:31 pm, edited 1 time in total.
Olen liian älykäs ollakseni väärässä. Jos olet kanssani eri mieltä, suosittelen sinua pohtimaan omaa elämänkatsomustasi ja sen perusteita.

Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: Tyhmät kysymykset

Post by Jormalaz » Wed Jun 25, 2008 7:30 pm

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

User avatar
Jonez
Devoted Member
Posts: 575
Joined: Mon Aug 27, 2007 8:37 pm

Re: Tyhmät kysymykset

Post by Jonez » Wed Jun 25, 2008 9:48 pm

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.
-Vuoden 2008 aloittelijan ystävä -palkinnon voittaja-
Image <- protestipelikilpailun voittaja.
Space War

Jormalaz
Member
Posts: 77
Joined: Sun Jun 15, 2008 9:22 pm

Re: Tyhmät kysymykset

Post by Jormalaz » Wed Jun 25, 2008 11:42 pm

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

User avatar
koodaaja
Moderator
Moderator
Posts: 1583
Joined: Mon Aug 27, 2007 11:24 pm
Location: Otaniemi - Mikkeli -pendelöinti

Re: Tyhmät kysymykset

Post by koodaaja » Thu Jun 26, 2008 12:26 am

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

Eräs Vieras

Re: Tyhmät kysymykset

Post by Eräs Vieras » Fri Jun 27, 2008 1:11 pm

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

User avatar
nevssons
Devoted Member
Posts: 503
Joined: Sun Jan 13, 2008 6:02 pm

Re: Tyhmät kysymykset

Post by nevssons » Fri Jun 27, 2008 1:42 pm

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?
Koodarina kohtalainen, henkilönä vittumainen
Image

Eräs Vieras

Re: Tyhmät kysymykset

Post by Eräs Vieras » Fri Jun 27, 2008 3:41 pm

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.

User avatar
nevssons
Devoted Member
Posts: 503
Joined: Sun Jan 13, 2008 6:02 pm

Re: Tyhmät kysymykset

Post by nevssons » Fri Jun 27, 2008 5:35 pm

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?
Koodarina kohtalainen, henkilönä vittumainen
Image

User avatar
esa94
Guru
Posts: 1855
Joined: Tue Sep 04, 2007 5:35 pm

Re: Tyhmät kysymykset

Post by esa94 » Fri Jun 27, 2008 6:37 pm

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.

TheFish
Developer
Developer
Posts: 477
Joined: Mon Aug 27, 2007 9:28 pm
Location: Joensuu

Re: Tyhmät kysymykset

Post by TheFish » Fri Jun 27, 2008 6:55 pm

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ä

Locked