Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: JavaScript: Pathfinding, kulkureitin löytäminen kartalla ?

Sivun loppuun

HannuTapio [13.12.2019 17:05:47]

#

Hei,

Minulla on keskeneräisenä "heidän kunniansa päivät" lautapelini, minulla on tilanne, että, olen jäänyt hieman jumiin koodaus kohtaan, tämä jumiuttamisen aiheuttaa yksiköitten liikuttaminen kartalla.

Minun ongelmana on kun yksiköt törmäilevät toisiinsa, toisten ollessa paikallaansa, ja toisten kulkiessa kohti valittua määränpäätä.


Tässä on kuvasnap - https://bittipankki001.com/kuvat/tempsnap_035.png


Siinä näkyy nuo saksalaiset menossa alaville maille ja ranskaan, jos minä sen takimmaisen määrään liikkumaan vaakarivillä, niin, se törmää omiinsa, monta kertaa matkan aikana, kun kulkee x akselilla, kuinka tämä törmäily tulisi käsitellä, minulla ei ole aiempaa vastaavaa koodia, vain kevyt roolipeli kulkureitti 90 luvulta.

Tuollainen yksi yksikkö on aina 3x3 ruutua, ja samassa 1x1 keski ruudussa ei voi olla kuin yksi yksikkö, eli yksikön koordinaatti on sen 3x3 ruudukon keski sijainnin mukaan, siinä koordinaatissa voi olla vain yksi yksikkö kerrallaansa.

Kiitos ohjelmointi avusta, olen lukio tason lautapelisuunnittelija, en ole ohjelmoija.

:) :) :)

--

The Alchemist [14.12.2019 06:03:30]

#

Josset ole ohjelmoija, niin tuo se pelisi ohjelmoiva tekijä tähän ketjuun, niin voimme jutella suoraan hänen kanssaan.

HannuTapio [14.12.2019 07:13:43]

#

Hmmh,

Olen kyllä ohjelmoinut pelin, mutta, en ihan ole virallinen koulutuksen vastaanottanut ohjelmoija.

Minä mietin tuon kulkureitin seuraavasti, mutta, en tiedä onko tämä ihan kelpo, en keksi parempaa, näin ensimmäiseen sota lautaan, jossa kulkureitti on.

Minä laitan seuraavasti - >

1) Minä vedän viivan omasta liikkuvasta yksiköstä määränpää kohteeseen.
2) Ja jos viivan alle jää oma yksikkö tai maasto plokki meri tai vuoristo, niin, laitan tämän ruudun ympärille 7x7 ruudukon.
3) Ja tämän 7x7 ruudukon minä käytän näin, minä laitan numeron 1 sen ruudun kohdalle, johonka voi vielä liikkua, ja sitten numeron 2 tämän ruudun viereen, jos siihen voi liikkua, ja näin jatkan kunnes päädyn sellaiseen ruutuun jossa liikkuminen jatkuu esteen jälkeen.
4) Jos en löydä sellaista ruutua esteen jälkeen johonka liikkua, niin, julistan, että, kyseessä on liikenne ruuhka ja pelaaja joutuu selvittämään ruuhkan.

Tämä 7x7 ruudukko on varmaankin sopiva, se voisi olla ehkä paremmin 5x5 ruudukko, jotta, yksikkö ei lähde liian kauaksi harhailemaan jos ruuhkaa aiheuttaa jotkin liikkuvat yksiköt, tosin tuossa tarkistus vaiheessa, kun ne numerot 1 - osuma esteen jälkeen kulkureitille, niin lasketaan sitten vain ne ruudut plokkaavaksi missä on maasto este kuten meri tai vuoristo, taikka sitten paikallaansa oleva yksikkö, eli jos yksikkö liikkuu, niin, se ei sitten plokkaakkaan, laitan vain kevyt ruuhka lipun plokattuun yksikköön, ja odotan että tämä liikkuva plokkaava yksikkö liikkuu, tosin isompi ruuhka voi tällöin rakentua.

:) :) :)

Minä koen että tämä on hyvä ja kiva ja kelpo rutiini, minä laitan näin, mitä te arvioitte ?

--

jalski [14.12.2019 10:05:39]

#

The Alchemist kirjoitti:

Josset ole ohjelmoija, niin tuo se pelisi ohjelmoiva tekijä tähän ketjuun, niin voimme jutella suoraan hänen kanssaan.

Vaihdetaan nyt sitten samalla kertaa sinunlaisesi vetelä keskustelutaidoton looseri pois suuta soittamasta ja muita kiusaamasta tältä foorumilta! Surullistahan se toki kyllä olisi viedä sinulta pois se ainoa paikka missä tuohon olet kykenevä... Surullista!

Lebe80 [15.12.2019 22:53:31]

#

Reitinhaku tehdään kuten millä muullakin ohjelmointikielellä. Kun pelisi selkeästi on ruudukkopohjainen, teet "luupin", jossa käyt kaikki mahdolliset siirrot siirrettävästä pelinappulasta. Sen jälkeen katsot kaikki mahdolliset siirrot näistä ja niiden siirroista kunnes olet kaitsonut halutun määrän siirtoja, tai jos uusia siirtoja ei ole mahdollista tehdä. Nämä siirrot pisteytät tietyllä tavalla (jotta pisteytys periytyy aina sinne ensimmäiseen siirtoon asti) ja lopuksi valitset siirron, joka pisteytyi parhaiten.

Metabolix [15.12.2019 23:15:16]

#

Yksiköiden väliset törmäykset on helpointa hoitaa niin, että yksiköt kulkevat suunniteltua reittiä mutta aina ennen ruutuun siirtymistä tarkastetaan, onko ruutu tyhjä vai pitääkö jonottaa. Jos jonotus kestää kauan, voi hakea uutta reittiä, joka ei kulkisi kyseisestä ruudusta. Paremman ratkaisun laskeminen on suhteellisen vaikeaa, joten kannattaa tehdä ensin tämä ratkaisu ja parannella sitten, jos tulee selviä ongelmia.

Lebe80 [16.12.2019 09:01:15]

#

Ja reittiä ei liene tarpeen jokaisen "tickin" yhteydessä hakea uudelleen, vaan millä tavalla ikinä reitin luotkaan, oleta että se on aina paras reitti t syklin ajan, jossa t on satunnaisluku t1 ja t2 välillä.

Vasta kun Metabolixin tapaan hahmo törmätty esteeseen ja ei olla päästy uudelleen yrittämisen jälkeen t ajan kuluessa, tsekkaa uusi reitti (millä algoritmilla nyt sen luotkaan) uudelleen.

maka78 [16.12.2019 09:37:53]

#

Kyseessä on siis lautapeli? Eli ensinnäkin olisi varmaan hyvä kertoa säännöt, millä yksiköt voivat liikkua. Se määrittää hyvin pitkälti sen, kuinka reitinhaku tehdään.
Kuinka paljon yksikkö voi vuoron aikana liikkua?
Voiko yksikkö lentää? (mennä toisen yksikön yli)
Eli ensin olisi syytä kertoa, miten tuo liikkuminen halutaan tapahtuvaksi :).

Lebe80 [16.12.2019 12:46:27]

#

maka78 kirjoitti:

(16.12.2019 09:37:53): Kyseessä on siis lautapeli? Eli ensin­nä­kin...

Nämä kaikki pystytään tekemään ihan universaalilla reitinhaulla, kun vain siirrot tehdään kyseisen yksikön liikkumissääntöjen mukaan.

Eli itse olen tehnyt näin omiin peleihini:

Tsekataan kaikki mahdolliset ensäiset siirrot siirrettävän yksikön nykyisestä kohdasta. Nämä siirrot pisteytetään (esim. jos käytetään nk. actionpointseja, kuinka paljon käytetty ). Sitten lasketaan kaikki mahdolliset siirrot seuraavista, äsken lasketuista pisteistä, jos jokin siirto menee jo laskettuun kohtaan, verrataan viekö tämä siirto vähemmän actionpointseja. Näin lasketaan, kunnes actionpointseja on käytetty halutun verran yli. Jos actionpointseja on siirrossa tietty määrä vielä jäljellä, voidaan arvata, että yksikkö kerkiää tehdä kaiken tähän asti seuraavalla siirrollaan, mutta actionpointseja voidaan käyttää myös enemmän reitin laskentaan, kuin yhden vuoron aikana on mahdollista, jolloin pelinappula pystyy suunnittelemaan liikkeitään useamman vuoron verran, mutta käyttämään vain yhden vuoron siirrot.

Jos peli ei ole vuoropohjainen, kannattaa käyttää jonkinlaista timeouttia, milloin reitti lasketaan uudelleen, ettei ihan jokaisella framella käytetä laskutehoa siihen.

maka78 [16.12.2019 13:35:57]

#

Kyllä varmasti pystytään tekemään vaikka miten hieno reitinhakualgoritmi, mutta jos haetaan sitä yksinkertaisinta ja nopeinta, niin joku A* tai Dijkstra ei ole aina tarpeen :).
Eli siksi minusta on ihan perusteltua kuulla ensin haluttu toimintamalli, ennen kuin antaa ratkaisun.

HannuTapio [18.12.2019 02:24:29]

#

Kulkureittiä,

Kiitos vinkeistä, minä säädän ekan testin tällä viikolla ja teen valinnat sitten kun näen mitenkä napit liikkuvat rutiinien mukaan eri tilanteissa.

Kiitos,

:) :) :)

--


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta