Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 1038
Limited edition
Moff's Avatar
Jeg holder på å skrive en stifinner-algoritme til et dataspill. Først litt kort om spillet: Man starter på et flatt område og skal bevege seg fra start til mål. Motstanderne skal plassere hindringer på banen, slik at det er vanskeligst mulig å komme seg til mål; litt som en labyrint.

Det skal ikke være mulig å ødelegge hindringene, og derfor trenger jeg åpenbart en algoritme som kan sjekke at det finnes en gyldig vei fra start til mål, ellers kan jo motstanderen bare mure igjen målområdet, og vinne spillet.

Jeg har lenge lett etter effektive måter å gjøre dette på, uten særlig hell. Det skal skje i realtid, så det kan nesten ikke være en veldig tung algoritme.

Det eneste jeg har klart å komme opp med selv er å sjekke hver celle på brettet, og se om den er ledig eller blokkert (av en hindring). Da får jeg et rutenett med alle de tilgjengelige cellene, og kan starte en kjempelang "loop" for å se start-cellen er i kontakt med mål-cellen. Denne loopen er veldig tung å kjøre, ettersom den må sjekke absolutt alle mulige veier gjennom labyrinten.

Det jeg leter etter er altså bare ren logikk for hvordan dette kan fungere mest effektivt. Det blir ekstra komplisert av at spillet er i 3D, og man kan hoppe opp på hindringer som er lave nok, og deretter klatre over hindringer som er ett hakk høyere enn det igjen.

Er det noen som har noen tips?

Her er et dataspill som har det jeg leter etter; du kan plassere tårn på spillbrettet, og monstrene som kommer finner av seg selv raskeste vei gjennom hindringene - og du kan ikke blokkere målområdet.
A* heter algoritmen du er ute etter
Sjekk ut rekursiv programmering konseptet. En funksjon/metode som kaller seg selv med oppdaterte parametere, terminerer når et eller annet krav er oppfylt.

f(0)
def f(x)
print x
f(x+1) unless x == 10

Skal i teorien printe ut 0,1,2,3...10

Skjønner?

Derimot å finne den raskeste veien gjennom hindringene er ikke så lett, med mindre du kan finne alle mulige veier, for så å velge ut den enkleste. "Reisende handelsmann" problemet er klassisk lesning her. http://en.wikipedia.org/wiki/Travell...lesman_problem

-r-
Dynamic a* aka d* er bedre dersom hindringene lages underveis
Uhm folkens, hva med å ikke foreslå algoritmer som finner ut løsningen når han er kun er ute etter om det finnes én løsning.

Forøvrig, det du er ute etter er veldig enkelt.. gitt at du har alt i 2d ko-ordinater

Kode

start = (4,5)
mål = (100,105)

mulige = array.zeros([500,500])
skal_sjekkes = [(start)] 

while(skal_sjekkes and mulige[mål]==False ):
    celle = skal_sjekkes.pop()
    for (x,y) in get_possible_neighbours(celle):
        if (x,y) not in skal_sjekkes and not mulige[x][y]:
             skal_sjekkes.append((x,y)) 
    mulige[celle]= True
Altså, ha en liste med punkt som du vet det er mulig å komme til, men ikke har sjekket enda.. og en liste med punkt du vet det er mulig å komme til, men har sjekket. Hver eneste gang du sjekker en punkt, legg til naboene det er mulig å komme til (som du ikke har lagt til allerede åpenbart) og si at punktet er sjekket. Da får du en stadig større liste over hvor det er mulig å komme til.

Om spillebrettet er for stort til at den løsningen er for tung, så del opp i større firkanter. Om du ønsker en heuristiskk, implementer den i hvordan du velger ut neste celle som skal sjekkes.

Dette er forøvrig et trivielt problem, så hvis implentasjonen din bruker lang tid på å kjøre gjør du noe feil. Det er heller ikke uvanlig å skille ut problem som dette i en egen tråd.. fordi selv om det kun tar noen hundredeler av et sekund, så vil du ikke at GUI skal vente.. og datamaskiner idag har generelt nok kjerner uansett.