Hardcore Programming Compo Oppgave - "Submerged Temple"

Sammendrag

Oppgaven går ut på å lage en kunstig intelligens som spiller et spill kalt "Submerged Temple", beskrevet her. To spillere kjemper om å raske til seg så mange penger som mulig i et tempel som er helt fylt med vann. Målet er å samle så mange penger som mulig, og samtidig ikke gå tom for luft.

Tempelet inneholder bevegelige kasser som kan brukes for å sperre motstanderen inne eller forhindre motstanderen i å komme til pengene. For å overleve i det undersjøiske tempelet må du finne luftbobler og passe på at du ikke blir sperret inne av motstanderen.

Gå til konkurranseregler

Nedlastinger

Hvordan konkurrere

Lag ditt bidrag med ett av følgende språk:

  • En C++ kildefil (.cpp)
  • En C# kildefil (.cs)
  • En Java kildefil (.java)
  • Et PHP script (.php)
  • Et Python script (.py)

Oppføringer i C++ må kompilere med Visual C++ 2008 på følgende måte:

  • Visual C++: Filen vil bli lagt til et tomt Win32 Console Application prosjekt og bygget der.

Det er ikke nødvendig å inkludere egen prosjektfil når du leverer.

Sørg for at bidraget kompilerer med følgende regler:

  • Kildekoden til programmet skal være i en enkelt fil med ditt valgte språk. (for de språkene som har en ferdig abstract klasse for lesing i kittet vil ikke denne klassen telle med)
  • Når programmet startes, skal det lese data fra standard input (stdin). Disse dataene beskriver spillets tilstand (se detaljer nedenfor).
  • Programmets output må være nøyaktig ett tegn pluss newline til standard output (stdout), en gang per trekk. Dette tegnet representerer den retningen du vil flytte på kartet (se detaljer nedenfor).
  • Ikke skriv til disken eller på noen annen måte forsøke å lagre informasjon persistent bortsett fra interne variabler. Hvis programmet ditt bruker unormalt mye minne til dette formålet kan det bli disket. Ta kontakt hvis du er i tvil.
  • Programmet ditt skal aldri bruke mer enn ett sekund per trekk, uansett hvilket språk du bruker. Hvis kjøretiden overskrider denne grensen, mister du sjansen til å gjøre et trekk, og programmet kan bli  avbrutt. Dette bør være mer enn nok, ikke prøv å presse grensen. Vi har testet ulike AIer, uten problemer.
  • Programmet ditt må ikke avhenge av eksterne biblioteker eller filer unntatt standard biblioteket tilhørende ditt valgte språk.
  • Multi-threading er ikke tillatt, selv om det støttes av standardbiblioteket til språket.

Hvordan spillet fungerer

"Submerged temple" spilles i et rutenett av NxM celler. Dette rutenettet er sendt til ditt program via standard input stream. I det medfølgende kittet finner du eksempelkode som analyserer denne strømmen til en passende datastruktur for noen av språkene. Hvert celle i rutenettet inneholder én av følgende verdier:

  • ' ': En tom celle
  • '1' eller '2': Din posisjon eller motstanderens posisjon
  • '#': En blokkert celle (vegger)
  • 'M': En bevegelig celle som kan flyttes op
  • 'o' : En penge
  • '.' : En luftboble

Et veldig enkelt eksempelbrett kan se slik ut:

# # # # # #
# # o 2 . #
# 1 # # M #
# . o . #
# #
# # # # # #

I kittet finner du mer komplekse eksempelbrett. Brettene som skal brukes i compoen kan være mye større og annerledes. Maksimumsstørelse på brettene er 64x64. Din AI bør ikke forsøke å optimalisere seg kun for de medfølgende brettene, men generelle brett av denne typen.

Du starter med 0 poeng og 15 luftpoeng. Spillet går i runder til du går tom for luftpoeng eller det ikke er flere penger igjen. Poengsummen du har da vil bli din endelige score. Merk at luftpoeng har ingen direkte betydning for din endelige score.

For hver runde, vil følgende skje:

  1. Programmet kjøres, og du får følgende som ASCII tegn til standard input strømmen i programmet.
    1. Den første linjen inneholder hvem av spillerne du er som et tall, 1 eller 2.
    2. Den andre inneholder mengden luft du har igjen, i antall trekk som gjenstår før du drukner (med mindre du finner mer luft innen den tid).
    3. Den tredje linjen inneholder din nåværende score.
    4. Den fjerde inneholder kartets bredde
    5. Den femte inneholder kartets høyde
    6. De neste linjene returnerer det nåværende brettet
    7. Den siste linjen inneholder ';' for å avslutte lesing av denne runden. Når du finner ';' skal du avgjøre hvilket trekk du vil gjøre og skrive dette til standard output. Neste runde går du tilbake til punkt 1 og fortsetter lesing fra standard input.
  2. Programmet ditt returnerer retningen du ønsker å flytte. Dette må være ett av følgende tegn:
    • 'N': Gå nord (oppover)
    • 'S': Gå sørover (nedover)
    • 'W': Gå vestover (venstre)
    • 'E': Gå øst (høyre)
  3. Din posisjon, "X", flyttes deretter i retningen returnert av programmet, til en målcelle. Dette er de mulige utfallene:
    • Hvis målcellen inneholder en vegg, '#', blir trekket blokkert, og spilleren havner tilbake i den cellen han/hun kom fra.
    • Hvis målcellen inneholder en penge "o" øker poengsummen med 1, og cellen blir konvertert til en tom plass når spilleren forlater cellen.
    • Hvis målcellen inneholder en luftboble, ".", øker luftnivået til 15, og cellen blir konvertert til en tom plass når spilleren forlater cellen.
    • Hvis målcellen inneholder en flyttbar blokk, 'M' så flyttes blokken til neste plass hvis den ikke er blokkert av en vegg eller en motspiller. Hvis det er en luftboble eller en penge så bytter blokken plass med denne.
    • Hvis målcellen er tom ' ', skjer det ingenting.
    • Hvis programmet ditt ikke skriver noe til standard output stream innen tidsfristen, blir spilleren stående i cellen.
    Uansett utfall mister du ett luftpoeng per trekk etter at trekket er utført. Dersom du etter dette har 0 luftpoeng, er spillet over for din del, og antall penger du har samlet til da blir din endelige score. Motstanderen kan fortsette å spille til han/hun går tom for luft eller har tatt resten av pengene. Programmet ditt vil bli avsluttet med makt av simulatorapplikasjonen hvis du ikke avslutter selv når dette skjer.
  4. Deretter kjøres motstanderens AI på samme måte. Merk: En spiller tenker og utfører trekket sitt, deretter gjør den neste spilleren det samme. Trekkene utføres ikke "samtidig".

Merknader:

  • Du står fritt til å lagre tilstander i minnet mellom hvert trekk; programmet ditt avsluttes ikke mellom hvert trekk (slik som i fjorårets oppgave).
  • Luftpoengen økes TIL 15, ikke MED 15, når du finner en luftboble. Du kan aldri ha mer enn 15 luftpoeng av gangen. Hvis du tar en luftboble når du allerede har 15 luftpoeng har du fortsatt bare 15 luftpoeng totalt.

Om det medfølgende kittet

Denne pakken inneholder følgende filer og mapper

SubmergedTemple.exe

Dette er simulatorapplikasjonen som inneholder spillogikken og fungerer som tjenerapplikasjon for AI-applikasjonene. Denne er skrevet i Java, så du vil trenge å ha Java installert for å kjøre den. Når du starter den får du opp et brukergrensesnitt hvor du kan sette opp hvilke AIer som skal spille mot hverandre. Det er også mulig å bruke piltastene/wasd for å styre en av spillerne manuelt.

SubmergedTemple.sh

Dette scriptet lar deg kjøre simulatoren på Linux.

AI

Denne mappen inneholder oppsett for de forskjellige språkene som du kan bruke som utgangspunkt for din egen AI.

bin

Denne mappen inneholder diverse programmer som simulatoren er avhengig av for å kjøre bidragene i forskjellige språk

map

Denne mappen inneholder brettene som kan brukes i spillet. Det følger med noen eksempelbrett, men du kan også lage dine egne brett. Det anbefales å lage seg mer kompliserte brett for å teste AIen sin i forskjellige situasjoner.

Hjelp og støtte

Hvis du har spørsmål angående konkurransen kan du:
  • Stille spørsmålet i forumet i Hardcore Programming Compo Support Thread
  • Sende en epost til compo crewet (demo@gathering.org). Hvis spørsmålet er av interesse for allmenheten vil du bli bedt om å stille det på nytt i forumet.

Lykke til! :)

- The Gathering 2010 Creative Crew