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.
  56 16092
Da jeg fikk litt tid mellom hendene og fikk ferdig koden tenkte jeg at man bare kunne starte konkurransen litt tidlig og heller gi folk temmelig god tid.

Innleveringsfrist: 18.08.2014 (altså 18. august)
Mulige språk/plattformer: JVM(Java, scala...), .NET (VB, C#), Python, NodeJS, Ruby. C++ og C godkjennes også om koden lett kan kompileres på windows.
Kode + dokumentasjon: https://github.com/etse/AI-compo-strategic-war
Inleveringsmetode: Lever kun kildekode. (ikke noen kompilerte filer). Send meg en link til der jeg kan laste ned koden. F.eks. en ZIP-fil du deler med meg på Google-drive/dropbox, eller en URL til GittHub repository.
Premie: 1 års VPS Premium fra host1.no - verdi 4800,- sponsa av Host1.no

Regler:
1: Bruk sunn fornuft. Tror du noe er utenfor reglene så spør om lov.
2: Koden kan ikke bruke biblioteker utenom standardbiblioteke som fulgte med språket.
3: AIen får ikke lov til å kommunisere over internett med annet enn spill-serveren

Turneringsformatet:
Dette spørs på antall deltakere. Om det er få deltakere blir jeg å kjøre en "alle mot alle" i flere ulike maps og kåre den som vinner på flest av de til vinneren av hele konkurransen. Blir det er større antall deltagere kjører jeg et enkelt turneringsformat, der vinnerne går videre og møter andre vinnere i en finale.

Jeg blir å spille inn selve turneringen og kåringen av en vinner og legge det ut som video på youtube slik at alle kan se.

Hva ønsker jeg i denne tråden?
Alt mulig av diskusjoner og spørsmål relatert til konkurransen. Er det ting du ikke forstår, eller sitter du fast en plass? Still et spørsmål her. Finner du noe feil i koden eller i dokumentasjonen, skriv det her eller gi meg en pull-request på GitHub om du fikset det selv.

Egentlig er alt lov å poste i denne tråden, så lenge det er i det minste litt vagt relevant til selve konkurransen.

Litt opp spillet:
Det hele er et turbasert strategispill som er bygget på mange av konseptene til en lignende konkuranse som heter Ants AI Challange. Målet i spillet er å bruke dine styrker i spillet til å drepe mostanderene - mens du hele tiden må vurdere om du vil fokusere på å angripe eller å skaffe deg flere styrker gjennom å samle mat.

Spillet har en enkel, men morsom, kamp mekanikk som åpner opp for at man kan leke seg med å implementere forskjellige strategier inn i spillet.
Sist endret av m0b; 3. juli 2014 kl. 18:14. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Morpho menelaus
AXiMe's Avatar
Virker som om PyGame-vinduet er litt dårlig posisjonert, jeg kan i alle fall ikke se hele mappet, eller scrolle for å se resten. Sitter på Ubuntu 14.04, og kan ikke så mye om PyGame, men vil anta at det er noe som må progges om fra din side for å fikse det.

Er bare nederste delen av mappet jeg ikke får sett, bør det nevnes.
Sist endret av AXiMe; 29. mai 2014 kl. 04:23. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Bare et innlegg for å vise at det er folk som følger med, og som synes dette høres gøyalt ut. Skulle ønske jeg hadde nok "skillz" til å være med; skal gi det et lite forsøk hvis tida strekker til. Men brukte "evigheter" på å snekre sammen en en svært så lite suksesfull robot i Robocode...så har ikke store forhåpninger om at jeg kan bidra.
Ukjent
Trådstarter Donor
Sitat av AXiMe Vis innlegg
Virker som om PyGame-vinduet er litt dårlig posisjonert, jeg kan i alle fall ikke se hele mappet, eller scrolle for å se resten. Sitter på Ubuntu 14.04, og kan ikke så mye om PyGame, men vil anta at det er noe som må progges om fra din side for å fikse det.

Er bare nederste delen av mappet jeg ikke får sett, bør det nevnes.
Vis hele sitatet...
har ikke fått testet det på ubuntu selv enda. Men vinduet skal være flyttbart. Posisjonen blir bestemt av window-manageren i OSet ikke programmet selv.Skal teste det i ubuntu i løpset av dagen.

Om er på en liten maskin hvor du ikke har plass til 800 pixler i høyden har jeg nå lagt til ett ekstra kommandolinje argument for å bestemme størrelsen på pygame-vinduet.

Testet på ubuntu nå, alt så ut til å fungere helt fint der.
Sist endret av etse; 29. mai 2014 kl. 13:27. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Morpho menelaus
AXiMe's Avatar
Lurer på om det kanskje var problemet, har bare 768 i høyden.
Ukjent
Trådstarter Donor
Bare bruk -r 600,600 så går det nok bra.

Har forresten gjort en oppdatering i protokollen for å spare på mengden data som sendes over nettverket, samt hvor mye JSON som må parses. Dette burde gjøre at klienter ikke burde kaste bort for mye av sin "betenkningstid" på uvesentlige ting.

Enkle måling viser at oppdateringen kuttet lengden på JSON-strengene med cirka 80-90% i de fleste scenarioer.

Vennligst last ned oppdatert versjon av serveren og se over delen om protokollen i readme-filen.
Sist endret av etse; 30. mai 2014 kl. 12:13. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
m0b
m0b's Avatar
DonorAdministrator
Nå som konkurransen har blitt publisert, er det noen som har begynt å se på koden og premissene for konkurransen enda? Noen som opplever problemer eller noe som er uklart?
Jeg har lest igjennom og testa serveren med testclienten, funket fint. Har et spørsmål til spillet: Slik jeg forstår det vinner man spillet ved å være den eneste med spawner igjen. Hvis vi spiller på maps med flere enn 2 spillere, vil den optimale taktikken da være å unngå all form for slossing og la motstanderene svekke hverandre. Men hvis alle tenker slik, når vi fort et nash equalibrium der alle bare samler mat. Er det noe jeg har misforstått?
Sitat av Wannabe Provo Vis innlegg
Jeg har lest igjennom og testa serveren med testclienten, funket fint. Har et spørsmål til spillet: Slik jeg forstår det vinner man spillet ved å være den eneste med spawner igjen. Hvis vi spiller på maps med flere enn 2 spillere, vil den optimale taktikken da være å unngå all form for slossing og la motstanderene svekke hverandre. Men hvis alle tenker slik, når vi fort et nash equalibrium der alle bare samler mat. Er det noe jeg har misforstått?
Vis hele sitatet...
Du kan bare unngå slossing en viss periode, etterhvert vil jo motstandere komme på jakt.
Ukjent
Trådstarter Donor
Nøkkelen i spillet er mapcontrol. Har du kontroll på størst del av mapet vil du kunne samle mest mat og spawne flere units.
Ukjent
Trådstarter Donor
Host1.no har akkurat fortalt meg at de vil sponse konkurransen med en førstepremie: 1 år VPS-Premium (verdi ca 4800). Håper dette er en liten gulrot som kan få et par ekstra til å delta.

Husk at du ikke trenger å være noen ekspert i programmering for å delta. Du trenger ikke en gang ha laget AI før. Å kunne lage en simpel implementasjon som sørger for at 2 av dine egne units ikke koliderer og er litt smartere enn random når det kommer til å samle inn mat vil kunne gjøre det relativt bra. Utvider du den med at de går i flokk vil det være en relativt god implementasjon.
Jeg er nå godt i gang og har fått på plass det grunnlegende. Var litt vanskelig skjønne hvordan alt funket i starten, men veldig morsomt og lærerikt når man får det til. Jeg har foreløpig implementert en A* algoritme for å finne mat og et (mislykket) brute-force system for slosskamper når fiender er nærme. Hvis noen andre også har kommet så langt og har lyst til å ta en treningskamp, så er jeg med (hvis det er lov). Det er nok litt lettere å identifisere svakheter og finne forbedringer i AI'en sin når man spiller mot en bot som bruker ordentlig strategi, i motsetning til testClient som bare gjør random moves.

Et par ting:
- Navnet på spillerne og deres farge bør vises i displayet.
- Det bør komme klarere fram i dokumentasjonen at unitsene har et begrenset syn. Jeg trodde i starten at det var en bug når jeg ikke mottok informasjon om alle cellene.
Ukjent
Trådstarter Donor
Sitat av Wannabe Provo Vis innlegg
Hvis noen andre også har kommet så langt og har lyst til å ta en treningskamp, så er jeg med (hvis det er lov).
Vis hele sitatet...
Ikke bare er det lov, jeg oppfordrer til det Men kult at du har kommet godt i gang.

Sitat av Wannabe Provo Vis innlegg
Et par ting:
- Navnet på spillerne og deres farge bør vises i displayet.
Vis hele sitatet...
Dette kommer etterhvert. Burde egentlig ikke være så vanskelig å implementere.
Sitat av Wannabe Provo Vis innlegg
- Det bør komme klarere fram i dokumentasjonen at unitsene har et begrenset syn. Jeg trodde i starten at det var en bug når jeg ikke mottok informasjon om alle cellene.
Vis hele sitatet...
Dette nevner jeg flere plasser i teksten, og referer til det med "vision-range" og lignende. men skal kanskje prøve å få gjort det litt klarere i teksten.

Men husk også det som står der om at jeg ikke sender informasjon om celler du kan se, hvis cellen er tom. Dette var for å spare masse nettverksressurser og dermed også mindre json å parse for klientene.
Sitat av etse Vis innlegg
Men husk også det som står der om at jeg ikke sender informasjon om celler du kan se, hvis cellen er tom. Dette var for å spare masse nettverksressurser og dermed også mindre json å parse for klientene.
Vis hele sitatet...
Jeg mottar informasjon om celler som er tomme også tror jeg.
Her er et lite utdrag fra loggen:

Kode

"is_wall": false, "position": [45, 81], "spawner": null, "has_food": false, "unit": null
"is_wall": false, "position": [28, 22], "spawner": null, "has_food": false, "unit": null
"is_wall": false, "position": [45, 82], "spawner": null, "has_food": false, "unit": null
"is_wall": false, "position": [45, 83], "spawner": null, "has_food": false, "unit": null
"is_wall": true, "position":  [45, 84], "spawner": null, "has_food": false, "unit": null
"is_wall": false, "position": [54, 77], "spawner": null, "has_food": false, "unit": null
Har jeg en gammel versjon av serveren kanskje?
Ukjent
Trådstarter Donor
det kan være. du kan jo prøve å laste ned den nye versjonen og se om du får det samme.
Sitat av etse Vis innlegg
det kan være. du kan jo prøve å laste ned den nye versjonen og se om du får det samme.
Vis hele sitatet...
Ja, det var tilfellet. Da får jeg omprogrammere litt og bytte til den nye versjonen
Ukjent
Trådstarter Donor
Oppdaterte serveren, denne er kun visuell og vil ikke påvirke klientene på noen måte:
- Displayet viser nå aktive spillere oppe i venstre hjørne, sammen med deres farge. Dette vil gjøre det lettere å identifisere hvilken spiller som er din.
Sist endret av etse; 7. juni 2014 kl. 15:01.
Sitat av etse Vis innlegg
Mulige språk/plattformer: JVM(Java, scala...), .NET (VB, C#), Python, NodeJS, Ruby. C++ og C godkjennes også om koden lett kan kompileres på windows.
Vis hele sitatet...
Jeg går ut fra at du også kan akseptere en klient kodet i F# ?
Ukjent
Trådstarter Donor
Ja. Så lenge du holder deg til standard .Net bibilotekene ser jeg ikke noe problem med det.
Kan det gjøres ett unntak slik at man kan bruke f.eks gson i java?

Man kunne jo skrevet sin egen parser fra bunnen av, men det virker litt dumt å finne opp hjulet på nytt.

Så vidt jeg kan se har ikke Java-SE støtte for JSON out-of-the-box med standard APIet, uten at jeg skriver nye parsere..
Ukjent
Trådstarter Donor
Det unntaket går jeg med på Vennligst sørg for at gson følger med kildekoden slik at jeg ikke trenger å gjøre noe ekstra når jeg kompilerer koden.

For .NET folk tillater jeg også JSON.net under samme forutsetning, om man heller vil bruke den fremfor standard serializer.

Ekstra informasjon:
Enkelte har spurt meg om hva rundetiden vil være, dette har jeg glemt å opplyse om. I turneringen vil serveren kjøre med 4 runder per sekunder. Dette betyr at klientene har 25ms på å gjøre beregningene sine og sende inn informasjon om hva de ønsker å gjøre denne runden.

Liten oppdatering på serveren: Om du laster ned den nye versjonen kan du nå endre på antall runder per sekund med argumentet -f [tall].
Sist endret av etse; 10. juni 2014 kl. 17:43. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
▼ ... over en uke senere ... ▼
Ukjent
Trådstarter Donor
Oppdatering: Last ned serveren på nytt (dere som var smarte og klonet repository kan bare pulle ned oppdateringen).

Enkelte på diskusjon.no gjorde meg obs på at spawn-mode gjorde ingenting i spillet - hvilket viste seg å være sant. Liten bug gjorde at serveren alltid spawnet en standardunit. Dette er nå fikset.
m0b
m0b's Avatar
DonorAdministrator
Ikke så veldig mye aktivitet i denne tråden, så tenkte jeg skulle lodde stemningen litt og kanskje sette i gang litt mat for diskusjon:

Er det mange som har startet og kommet i gang med dette? Selv er jeg så små startet med det grunnleggende. Holder på å skrive et bibliotek i C# som skal håndtere socket og json, og i tillegg eventuelt AIen, om ikke dette blir noe separat. Har også opprettet en fork av etse sitt prosjekt på bitbucket, kan sikkert dele adressen senere om jeg har noe interessant å komme med.

Ettersom standardbibliotekene som man har tilgjengelig er rimelig begrenset, og jeg har lyst til å arbeide på et litt "høyere nivå", så lager jeg noen ai-klienter som ikke blir en del av mitt bidrag i konkurransen. Tanken her var at hvis jeg lager en litt mer avansert klient, så kan jeg bruke den som et verktøy til å lage en bedre AI som jobber i 2d-miljøet som er i konkurransen. Med høyere nivå, så mener jeg f.eks en GUI-klient hvor jeg kan manipulere dronene for hånd og ikke med kode. Mye mulig jeg også gjør noen endringer i server-applikasjonen og/eller protokollen- når jeg blir bedre kjent med python, det er totalt nytt for meg.

Det kunne også ha vært interessant om man kunne ha rendret kampene mellom AI-ene i ... tja, 3D, som avi? Jeg har noen tanker om hvordan man kan implementere det, men avventer litt ettersom jeg enda jobber med det grunnleggende. Men å kunne hoppe rundt i et 3d-miljø og observere en kamp, det hadde jo vært relativt moro.

Noen andre som går rundt med tanker?
Sist endret av m0b; 18. juni 2014 kl. 15:48.
Ukjent
Trådstarter Donor
Om folk kommer i gang med prosjektet er det nå et lite problem med at alt av rendring skjer på serveren. Det vil si at om 2 deltakere ønsker å spille mot hverandre så blir kun den ene å faktisk se alt som skjer. Dette kan jo løses med at klientene selv rendrer det de ser - men det får være litt opp til hver enkelt om de gidder.

Noe jeg har tenkt på som mulighet er å lage en enkel replay-player. La serveren ta snapshot av hver runde som lagres i en film som kan spillet av med et enkelt program. Dette burde være relativt enkelt å implementere om jeg bare bruker displayet som serveren har allerede. Dette vil jo gjøre det mulig for 2 spillere å spille mot hverandre - for så at begge kan se over replayet og se alt som skjedde. Så hvis folk etterhvert begynner å få til litt halveis fungerende AI-er som er i stand til å spille litt - så kan det være jeg setter meg ned å lager dette om det er ønskelig.

-------

Har noen av dere begynt å tenke litt på enkle strategier for hvordan dere ønsker at faktisk AIen skal fungere? Sett litt på enkelte ting som kan være mulig å implementere på en grei måte?

Det første som bør implementeres er en løsning slik at 2 units ikke kolliderer med hverandre - for det er jo rett og slett selvmord. Dette kan jo gjøres ved at du f.eks. flytter 1 unit om gangen og hele tiden passer på at ingen units flytter inn på en rute hvor en annen unit har flyttet denne turen.

Det neste er jo at det er lurt å samle mat. En naiv implementasjon her er f.eks:

Kode

for each cell_with_food:
    unit = find_my_closest_unit(cell_with_food)
    unit.move_towards(cell_with_food)
Her kunne man implementert søkingen ved bruk at f.eks. et enkelt bredde-først-søk. Dette er en algoritme som ikke er for vanskelig å lære, selv om du aldri har hørt om den før.

Det neste kan jo være at det er lurt å søke sammen i grupper:

Kode

for each unit in myunits:
    if unit.hasNotMoved():
        other_unit = find_my_closest_unit(unit)
        unit.move_towards(other_unit)
Her kan man gjenbruke de 2 samme funksjonene til å gjøre en helt annen oppgave - og man kan bruke samme type approach til å søke mot fienden om man f.eks. ser at man er i flertall og burde klare å vinne "kampen".
Sist endret av etse; 18. juni 2014 kl. 16:03.
Dette ser veldig spennende ut, men forstår jeg det rett om at python kun trengs for å kjøre spillet? Så bruker man det språket man vil for å skrive en bot?

Og for å følge reglene kan man kanskje ikke bruke node modules fra npm eller da om man bruke node.js?
Ukjent
Trådstarter Donor
Sitat av Yochi Vis innlegg
Dette ser veldig spennende ut, men forstår jeg det rett om at python kun trengs for å kjøre spillet? Så bruker man det språket man vil for å skrive en bot?
Vis hele sitatet...
akkurat

Sitat av Yochi Vis innlegg
Og for å følge reglene kan man kanskje ikke bruke node modules fra npm eller da om man bruke node.js?
Vis hele sitatet...
Ja, men poenget er at man skal kode tingene selv - og på samme måte som man har Maven i Java og Gems i Ruby - så skal man prøve å unngå det mest mulig.

Alt du trenger for å løse oppgaven er sockets (eller websockets i NodeJS) og JSON (som er støtter per default i JS). Så å bruke ekstra packages må i så fall godkjennes. Har du en god grunn vil jeg nok godkjenne det - men jeg ønsker ikke at jeg må laste ned 30 forskjellige packages for hver klient jeg skal kjøre.

Men om du bare bruker npm til å kjøre nodejs-programmet, så er det helt greit

Moduker som implementerer ting som f.eks. trær, grafer og søkealgoritmer vil ikke godkjennes. Essensen er litt å implementere slike ting selv
Sist endret av etse; 25. juni 2014 kl. 10:36. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Var det jeg tenkte meg ja

Så nå må jeg bare få satt opp python.
Jeg har lagd en vagrantbox som setter opp python + pygame og cloner game-serveren på en ubuntu: https://github.com/andeersg/Vagrant-for-ai-compo

Deler det her i tilfelle noen har interesse av det Så slipper man å styre med oppsett av python om man ikke kan det.
Ukjent
Trådstarter Donor
Da jeg er opptatt første 2 ukene i august velger jeg å utsette innleveringsfristen til 18. august. Så litt ekstra tid for dere som har begynt på oppgaven

Om noen mods vil endre datoen i førstepost blir jeg veldig glad
Sist endret av etse; 27. juni 2014 kl. 16:19.
Kan noen forklare kort hvordan/når nye units spawner?

Spawner det nye units NÅR du "spiser" maten? Spawner nye units i basen din?

Hvordan får man styrke? Kan man miste styrke, eller kan man lage seg en "uber unit" med å bare feed'e den?

Får man vite styrken til andre units?



Edit:
Hvorfor er noen runde mens andre er "to trekanter"?

Kan en spiller har flere spawnere? Når jeg kobler til 2 test klienter ser det ut til at de får 2 spawnere hver?

Av og til "forsvinner" units? Og av å til kommer det units -- uten at jeg helt ser logikken?
Sist endret av hayer; 27. juni 2014 kl. 17:34.
Ukjent
Trådstarter Donor
Styrken til en unit er definert ut i fra type - den kan aldri bli sterkere eller svakere. Dette er definert ut i fra hvilken type du valgta når du spawnet den.

Units spawner etter units har blitt flyttet, på en av "basene" (eller spawnere som de heter i spillet) om følgende er sant:
- Du har mat tilgjengelig
- Spawneren er ikke ødelagt
- Ingen units blokkerer spawneren.

Husk at rekkefølgen ting skjer i spillet er følgende:
1: Harvest any nearby food
2: Move units
3: Spawn new units
4: Resolve battles
5: Destroy spawners
6: Spawn new food

Sitat av hayer Vis innlegg
:
Hvorfor er noen runde mens andre er "to trekanter"?

Kan en spiller har flere spawnere? Når jeg kobler til 2 test klienter ser det ut til at de får 2 spawnere hver?

Av og til "forsvinner" units? Og av å til kommer det units -- uten at jeg helt ser logikken?
Vis hele sitatet...
Fra siden:

There are three different types of units that can be spawned, chosen by the player.

Standard: This is the most basic unit. This unit can collect food and has an attack-strength of 3. Identified by a a circle on the map.

Harvester: This unit will get double value for each food collected, but has weaker attack with a strength of 2. This unit has a vertical line through it

Soldier: This unit is a pure fighting unit with an attack-strength of 5, but he is incapable of collecting any food. This unit has a horizontal line through its body.

Units forsvinner hvis de dør. Dette skjer hvis de denne turen forsøkte å gå til same rute. Hvis det kommer nye units er det fordi det spawnet noen i basen din. Dette skjer når scenarioet jeg forklarte over skjedde.
Sist endret av etse; 27. juni 2014 kl. 17:44. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
m0b
m0b's Avatar
DonorAdministrator
Jeg er egentlig litt reservert for å slenge ut videoer slik. Etter min erfaring så kan det skje alt mulig rart i utviklingsprosessen så det ikke blir noe av prosjektet i det hele tatt.

Men, jeg fikk veldig lyst til å vise fram litt, så jeg tok en liten videosnutt av hva jeg har laget så langt. Jeg nevnte tidligere at det hadde vært kult å hatt dette i 3D. Som sagt så gjort, så har jeg forsøkt å lage en 3D-renderer av hva som foregår på et map. Jeg har laget et lite map og en bot som mer eller mindre tilfeldig navigerer seg fram i miljøet. Det er selvfølgelig enkelt å skape flere miljø også. Andre animasjoner, tull og fanteri vil også være moro å implementere i dette.

Dersom alt går som det skal, så vil det være mulig å lage en video av f.eks finalekampen, eller eventuelt en live-stream av den.

Det ser forøvrig ut som at programvaren, camstudio, som jeg brukte til å ta ta opp videoen roter litt med frameraten og følgelig tøver litt med rotasjonen til boten som "vandrer" rundt. Jeg er ingen film director eller lignende av noe slag, så jeg gjorde kun det første og beste som falt meg inn.

Nok prat, her er en 30 sekunders video av hva jeg har så langt: https://www.youtube.com/watch?v=CN8wJVJYvSg
Sist endret av m0b; 3. juli 2014 kl. 14:15.
Ukjent
Trådstarter Donor
Utrolig kult initiativ Å fått til en ordentlig rendering av kampene gjør jo hele opplegget desto mer awsome. Så får håpe på at du får det ferdig nok til at man kan se hva som skjer mer tydelig enn i det top-down 2D-kartet som brukes i spillet i dag.

Edit: Hvordan fungerer dette? Er det en implementasjon rett på serveren hvor du kun endret rendringen eller er dette implementert på en helt annen måte?
Sist endret av etse; 3. juli 2014 kl. 16:47. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Dette ser veldig gøy ut! Jeg blir med
Ukjent
Trådstarter Donor
Kult, desto fler som bli med desto bedre.

Jeg tenkte å gjøre det litt lettere for folk å komme i gang, og har derfor forbedret testklienten en del. Den testklienten som ligger på GitHub nå implementerer disse tingene for deg:
- Kommunikasjon med serveren
- Parsing av kartet
- Tegning av det som er synlig for spilleren

For å komme i gang er alt du trenger å gjøre å implementere din AI-logikk i metoden "resolve_round", som er i klassen GameAI. Den beste måten å gjøre dette på å er å bare lage en ny klasse som arver fra GameAI-klassen, og så bruke polymorfisme til skrive inn din egen logikk. Da slipper du at alt de andre "rotet" forstyrrer deg mens du skriver logikken. Om du synes arv og klasser er litt vanskelig kan du bare skrive koden rett inn i den eksiterende filen.

Slik den fungerer nå er slik:
Hver runde vil klassen kalle på "resolve round", for å la deg gjøre det du ønsker. Staten på spillet vil være parset for deg og ligger lagret i self.board, som er et objekt som representerer selve kartet. Det er viktig at du husker å sende en kommando til serveren før du returnerer fra denne funksjonen. Dette kan gjøres via å enten sende json direkte med self.sendline (som vil legge på en newline på slutten for deg automatisk) - eller du kan sende kommandoene dom en dictionary til self.sendcommand som vil gjøre den om til json og sende den for deg.

Jeg håper dette forenkler ting litt for de av dere som synes det er vanskelig å komme i gang

Tillegg: Ekmspel-implementasjon på en AI som ikke vil kollidere med egne units (og dermed ta selvmord)

Kode

from testClient import GameAI
import random

class SmartAI(GameAI):
    def resolve_round(self):
        command = {"mode": random.choice(["standard", "harvester", "soldier"]), "moves": []}
        for unit in filter(lambda u: u.owner == self.my_id, self.board.units):
            x, y = unit.position
            legal_directions = []
            for nx, ny, direction in [(x, y-1, "north"), (x, y+1, "south"), (x-1, y, "west"), (x+1, y, "east")]:
                rx, ry = self.board.get_real_position(nx, ny)
                if not self.board.any_units_on_position((rx, ry)) and not self.board[rx][ry].isWall:
                    legal_directions.append(direction)

            if legal_directions:
                direction = random.choice(legal_directions)
                command["moves"].append([x, y, direction])
                self.board.move_unit(x, y, direction)
        self.send_command(command)
Sist endret av etse; 3. juli 2014 kl. 20:26. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
m0b
m0b's Avatar
DonorAdministrator
Sitat av etse Vis innlegg
Edit: Hvordan fungerer dette? Er det en implementasjon rett på serveren hvor du kun endret rendringen eller er dette implementert på en helt annen måte?
Vis hele sitatet...
Dette er rett og slett en egen implementasjon av klienten din. Tenk på klienten som en "Observer" av noe slag. Du kan gjerne dra en analogi til starcraft kommentatorene. De har en klient som har mulighet til å kunne rendre en kamp mellom to eller flere motstandere. For å kunne gjøre dette må de ha mest mulig informasjon, de må altså motta informasjon fra serveren som inneholder alt som skjer på mappet, inkludert hva motstanderne gjør til enhver tid.

Så, hvis denne Observer-klienten skal ha mulighet til å rendre en kamp, så må den motta kommandoene til hver enkelt klient og en mapstate. I tillegg hvis serveren din skal kunne mate Observeren med informasjon om hva som foregår må serveren din ha støtte for n+1 klienter, hvor n=antall klienter. Er dette noe som eventuelt kan implementeres?

Det jeg tenker er at man gjerne har en server som kjører etse sin kode og deltakerne kobles til denne. I tillegg til dette kan det være en egen server - eller i alle fall en egen prosess - som kobler til etse sin server og rendrer kampen. Renderingen kan foregå i fullscreen på den aktuelle serveren, og kampen kan lagres enten til disk, streames til twitch eller whatever.

Now, er det noen som har tips til hvordan jeg kan få tatt opp det som skjer på skjermen min med litt høyere antall bildeoppdateringer i sekunder enn det jeg har på YouTube-videoen min? Dette er foreløpig utenfor mitt kunnskapsområde :/

Er det noen som vet av noe bra bibliotek for JSON som er ment for C++?
Mulig dette er et dumt spørsmål, men om man kjører python fra command line kan man da se spillvinduet?
Ukjent
Trådstarter Donor
ja, det burde ikke være noe problem. Om det ikke funker vil jeg gjette på du er på en server hvor SDL ikke blir startet på riktig display dette kan fikses med å sette miljøvariabelen "DISPLAY", i hvertfall på de linux-distroene jeg har testet.
Men ja, egentlig burde det bare funke. Starter via terminal hele tiden selv.
▼ ... noen uker senere ... ▼
Ukjent
Trådstarter Donor
Nå er det bare en måned igjen - er det noen som har kommet godt i gang og begynt å få til noe morsomt? Noen som er på et punkt hvor de ønsker å teste den ut mot andre sine algoritmer før de prøver å forbedre den?

Har forresten lagt til en observer-funksjon, som gjør det mulig å koble til som spectator og observere hele kampen i typisk spill-stil. Hvor observeren kan se alt. Jeg har også laget et python script som tegner ting på samme måte som serveren. Dette gjør at om du tester klienten din mot andre motspillere og ønsker å følge med på hva som skjer så kan også den personen som ikke kjører serveren få se dette ved å ta i bruk denne.
▼ ... over en uke senere ... ▼
Ukjent
Trådstarter Donor
Trippelpost, så litt uforskammelig bumping. Men nå er det kort tid igjen av konkuransen. Fikk beskjed om fra brukeren Java om at det var en bug med kollisjoner - slik at hvis 2 units stod ved siden av hverandre og byttet plass ville begge unitene dø, i stede for at begge overlevde (slik intensjonen var). Dette er nå fikset. Så anbefaler å laste den nyeste versjon av serveren.

I tillegg har jeg lagt til et kort delay på første tur hvor folk får litt ekstra betenkningstid. Dette er for at klientene skal få lov til å gjøre start-oppsett uten å miste flere turer. F.eks. kan det å sette opp et display og generere et kart ta litt lengre tid enn man har tilgjengelig de første turene - så for å hjelpe til her får man litt ekstra tid før spillet er ordentlig i gang. (Husk at den beste måten å vite at det er en ny tur på er å sjekke om du har motatt en melding fra serveren med ny state, som gjøres hver gang det er en ny runde).
Sist endret av etse; 1. august 2014 kl. 15:10.
Jeg vil anbefale flere å prøve seg på dette. Spesielt folk som vil lære seg programmering. Jeg har jobbet med programmering i mange år nå, men dette er ett helt nytt konsept for meg og jeg støter på problemer over alt som jeg aldri har trengt å tenke på tidligere. Ikke se på dette som en konkurranse (hvis ikke du er en dyktig programerer da), men se heller på det som en glitrende måte å lære seg programmering.

Jeg vil vel forsåvidt også oppfordre folk til å skrive spørsmål rundt det hele her i tråden - det kan være nyttig for mange!
Ukjent
Trådstarter Donor
Som alltid med utvikling: når man fikser et problem så lager man et nytt et. Jeg introduserte derfor en ny bug. Denne er nå fikset, så om noen har lastet ned i mellomtiden må dere oppdatere på nytt. (Minner igjen om at det letteste bare er å klone repository og bare pulle ned oppdateringer hver gang før du fortsetter utviklingen)

Jeg har også bestemt meg for å kjøre 2 runder per sekund i stede for 4 for å gjøre det litt enklere for folk - og fordi jeg fant ut at det ble en del overhead ved parsing av JSON hos klientene. Dette vil gi 500ms per runde, noe som skal være masser av tid i et spill-scenario. Men husk at spillbrettet er ganske stort, og du vil få en del units etterhvert. Så du må fortsatt ha det i hode at du ikke alltid bare kan leite etter det beste trekker - om du betyr å søke ganske langt for gode stier.
Er det noen som kunne tenke seg å kjøre en test battle?
Lagde en liten map maker som automatisk generer ASCII koden fra et GUI: http://www.fastswf.com/BbNS4UE
Ctrl + klikk for å slette ting. Kopier teksten i notepad og lagre i "maps" mappen.


Sitat av Java Vis innlegg
Er det noen som kunne tenke seg å kjøre en test battle?
Vis hele sitatet...
Jeg er med, men må fikse litt bugs og oppdatere versjonen først. Det er en stund siden jeg lagde den. Kan sende deg en pm om noen dager når jeg er klar

Synes forresten det gikk litt treigt med bare 2 runder i sekundet, men det er kanskje bare min mening.
Sist endret av Wannabe Provo; 8. august 2014 kl. 15:24.
▼ ... over en uke senere ... ▼
Ukjent
Trådstarter Donor
Vært bortreist en periode nå - så har ikke hatt mulighet til å følge opp tråden. Innleveringsfristen er altså i løpet av mandag - kjører finalen og legger den ut her så fort jeg får tid. (trolig på onsdag).

At ting blir litt tregt ser jeg ikke på som et stort problem. 2 runder i sekundet gir litt rom for algoritmer som kan tenke litt - men begrenser deg fortsatt slik at du ikke kan sjekke alle muligheter når det begynner å bli en del units. Selve filmen jeg legger ut vil jeg uansett speede opp litt i redigeringen - så da vil det ikke føles like tregt
Sist endret av etse; 16. august 2014 kl. 10:51.
Ukjent
Trådstarter Donor
Vil minne om at innleveringen er i dag. Har kun motatt et bidrag, noe som er litt skuffende. Håper det kommet et par i siste liten så det i hvertfall kan kjøres en ordentlig deathmatch-runde for å kåre en vinner.
Ukjent
Trådstarter Donor
Finalen er nå over. Beklageligvis fikk jeg ikke filmet det slik jeg annonserte jeg skulle grunnet tekniske problemer. (maskinen som fungerte som server nektet å spille inn filmene ordentlig og jeg orket ikke knote mer enn en times tid - derfor må dere klare dere med screenshots). Håper oppgaven var en gøy utfordring for dere som deltok.

Jeg gikk inn 3 bidrag til konkuransen, og lot de kjempe mot smartAI som jeg har skrevet selv. (den er så smart at den ikke tar selvmord, men gjør ingenting utover det).

Første kamp
Den første kampen var på et lite brett laget for å teste ut pathfinding-egenskapene til AIen, samt deres egenskap til å prøve å gjøre et angrep. Det hele begynte relativt greit, hvor folk klarte å komme seg ut den lille labyrinten de var fanget i når de startet - for å kjempe i arenaer i midten.

http://gyazo.com/e0599ebffe04ba88ad08b1f5052b159b

BlackBot fikk raskt overtaket i midten av skjermen - og dominerte de andre som sleit med å samle mat. Noe man ser på neste screenshot.

http://gyazo.com/6afcf11b1eef762d33b8611033170194

Dette endte med at han over litt tid fikk et enormt overtall of en stor ledelse.

http://gyazo.com/8f9214428accafc04582a773b6779d31

Problemet var at den aldri klarte å organisere noe angrep - og det virket mer som den var i modus hvor den prøvde å ha litt map-controll men ikke ville prøve for mye å gå inn i nye områder. (når den gjorde det virket det mer eller mindre tilfeldig, og med så få styrker at det ikke kom noen vei).

Så på tross av at han tydelig hadde overtaket, og nok styrker til å fint kunne ta seieren klarte den altså ikke dette. Jeg kan derfor ikke kåre noen direkte vinner av denne kampen - men siden det var tydelig at 1 bot dominerte blir han premiert med et halvt poeng.

Altså et halvt poeng til BlackBot.


Andre kamp
Den andre kampen foregikk på kartet som ble levert ut som testing. Dette ble gjort for å sjekke hvordan botene fungerte på litt større og åpne kart. Her er det viktig at boten faktisk tar hensyn til at søkerommet fort blir stort, og om man skal gjøre fullt A* søk for alle units kan det fort bli meget problematisk etterhvert som man har undersøkt større deler av kartet, samt får en god del units.

I tillegg fungerte kastet ypperlig for å teste hvor flinke botene var til å forsvare seg. Spawneren stod veldig utsatt til her, så det kunne fort ende med at en eller annen kunne snike seg forbi og ødelegge den om de ikke hadde noen form for deffansiv.

Her var alle botene raske med å spre seg ut å søke etter mat flere steder på kartet - og spesielt millibot var rask til å komme seg langt vekk fra sin egen spawner.

http://gyazo.com/78683c67bbe7a9a66db0533484756cc0

En enkel unit fra millibot klarte å lure seg mellom forsvaret til wannabeprobo og ødelegger spawneren hans mens han enda har flere units i område. Han blir fort satt ut av spill.

http://gyazo.com/605b39063103ee6a525fb3298525fd1e

BlackBot får samlet en del mat og klarer å holde seg unna an del kamper og får derfor en god del flere styrker enn de andre og er nå en stor trussel. Dette kommer nok av at millibot har gått mye i angrep på sine naboer.

http://gyazo.com/3a08e23e0254e8ba4e42511afc6f6c7d

BaclBot har fått mange units og klarer å presse seg inn og ta knekken på smart AI samtidig som han setter millibot i stort press. SmartAI sin spawner er ødelagt.

http://gyazo.com/40ae2610b9ada0bf6b29a89798bcc055

BlackBot presser seg inn og man ser tydelig at han vil gå av med seieren. Men soldatene, som ikke kan samle mat, ser ut til å ha mer fokus på å forsøke å samle mat enn å ødelage spawneren rett ved siden av. Men etter en liten stund klarer en av soldatene å ødelegge den, trolig noe tilfeldig.

http://gyazo.com/aabbfdf0bfbf67484811a0c3fc08b57c

Vinneren er blackbot, som nå har 1.5 poeng totalt.


Runde 3

Det neste brettet var enda et lite map for å teste hvor godt AIen forstår konseptet at brettet "wrapper" i kantene. Dette er da de eneste angrepsvinklene.

http://gyazo.com/9a985aa8e37d1f9fae8a6dd6af612257

millibot år fort til angrep på blackbot, mens wannabeprovo holder seg rolig. Dette føret til en del tap hos blackbot og millibot, mens wannabiprovo får bygget seg opp i styrke.

http://gyazo.com/dc23c4f4abc870ec376b6c86712eee1e

Millibot ender opp med å miste alle sine units og slaget står mellom wannabeprobo og blackbot som begge har en del units. De står samlet i sitt eget område og er veldig forsiktige med å angripe hverandre.

http://gyazo.com/9b62b612824f10c980b1629e4aca9a0d

Blackbot viser seg flinkere og mer effektiv til å bruke det ledige område til å skaffe seg mat og får derfor fort overtaket som gjør at han kommer i stor ledelse og senere vinner.

http://gyazo.com/73a3e6eae43424a1da2a4898df4de3f5

Vinneren er her BlackBot - som nå leder med 2.5 poeng, mot 0 hos sine motstandere. Da det hele skulle være en best av 5 er han derfor en vinner - selv om det er 2 brett igjen.

Så gratulerer til Blastings for seieren min sin Bot. Jeg ville satt pris på om jeg fikk lov til å dele kildekoden til botene deres ved å laste de opp på GitHub, sammen med serveren. (da i en egen mappe) - slik at andre som er interesert i oppgaven kan se forsøk som er gjort og kanskje utvide på disse.
Gratulerer blackbot! Det var både morsomt og lærerikt å være med, så takk til etse for arrangeringen. Min bot vil bli lastet opp på GitHub, selv om den ikke er så mye å skryte av
Gratulerer med seieren Blastings !

Som Wannabe, så syntes jeg dette var en veldig artig konkurranse. Tusen takk for innsatsen etse! Jeg lærte mye og det gav mersmak! Jeg var langt utenfor komfortzonen min med denne typen programmeringen. Utfra screenshots er det ganske tydelig at jeg fortsatt har tonnevis igjen å lære (les; Blastings dominerte fullstendig).

Var forresten skuffet over at milibot ikke gjorde det bedre på det lukkede kartet. Hadde håpet A* algoritmen skulle gjøre det litt bedre.

Hvordan klarte Blackbot seg når han hadde så hinnsides mange units, ref screenshot http://gyazo.com/aabbfdf0bfbf67484811a0c3fc08b57c ? Ble det timing problemer eller gikk kalkuleringer greit? Hvilket språk er blackbot skrevet i?

Boten min er rimelig crap også, men etse har tillatelse til å legge den på github slik at andre kan se hva den gjør.
Ukjent
Trådstarter Donor
Han skrev i C++ og ut i fra statistikker den selv ga ut brukte den under 100ms selv med mange units. Så jeg tror han har begrenset søkerommet en del. Om jeg får tid skal jeg lage en egen implementasjon og ta for meg mulige forbedringer :-)