2
« skrivet: december 16, 2011, 01:47:22 »
Hej alla flipperfantaster.
Jag har börjat klura på en grej som ingen verkar ha provat tidigare, jag har inte hittat något på Google i allafall.
Jag tänker bygga ett datorstyrt flipperspel (det har jag hittat) som kan lära sig att spela flipper och lista ut reglerna på vilket spel som helst.
Målet är att skapa en AI som kan lista ut det mest optimala sättet att bygga poäng på och att kunna slå en mänsklig spelare
Jag har börjat skissa på hur det ska fungera och jag tänkte ventilera lite av mina idéer här för att se vad ni tycker.
Den hårdvara som jag tänkt använda är: ett flipperspel, en dator, 1 eller 2 webbkameror och någon typ av IO modul för att styra flipprar och uppskjutare.
Webbkamerorna kommer att fungera som datorns ögon. Jag är lite osäker på vad som blir enklast, men en webbkamera kommer i allafall att monteras ovanför flippret för att ”titta” ner på spelplanen och hålla reda på var kulan är. Den andra webbkameran är tänkt att hålla reda på poängen.
Man kan troligen lösa bollkoll & poängräkning med bara en webbkamera genom att ha den vinklad så att kameran ser både poäng och spelplan, eller att rikta med en spegel.
Ett annat alternativ som också bör fungera och tar mindre cpukraft, är att läsa ut poängen digitalt från flippret. Jag har inte kollat upp om det går, men jag gissar att det går. Det enda som skulle kunna vara något negativt med det som jag kommer på är att man då behöver dubbelriktad datakommunikation.
Programmet för att styra flippret har jag tänkt skriva i C++.
Så här har jag tänkt att styrningen/Ai:n ska fungera:
Det första steget är att ta en bild av en neutral spelplan precis som det ser ut efter att man startat ett nytt spel. Den bilden kommer att vara själva grunden som man sedan använder för att kunna spåra både kulans rörelser och förändringar på spelplanen. Förändringar på spelplanen är tex. att en lampa tänds.
Att hålla reda på poäng, styra flipprar och läsa bollposition borde vara rätt ”straight forward” att göra, det ser jag som den enklare delen av problemet.
Sedan till själva inlärningsdelen.
Jag har inte funderat så mycket på detta ännu, och jag hoppas att jag kan få lite tips och idéer om hur man på bästa sätt kan hantera detta.
Det här har jag kommit fram till:
Alla positioner kommer till en början att sparas i en databas. Bollpositionen kommer att läsas av så många gånger per sekund som kameran uppdateras. Jag har tänkt att använda en ps3 eye kamera, den kan köra i 60 fps - 640x480 eller 120 fps – 320x240. Högre fps = snabbare reaktion, men jag vet inte om den låga upplösningen räcker till att kunna spåra bollen tillräckligt bra. Det blir nog lite trail and error.
Genom att jämföra med tidigare postioner av kulan så kan man räkna ut intressanta saker som acceleration, hastighet och förväntad bana.
Efter en viss tid eller tex. när man missat en kula så gör man en operation för att frigöra minne och lära upp AI:n.
Om vi säger att ett spel tagit 37 sekunder och vi sparar i 60 fps så blir det 2220 positioner.
Det första man gör är att minska ner på antalet postioner genom att hitta avvikande punkter som man sedan kan interpolera mellan. Man kanske bör spara hastighet/acceleration i varje kontrollpunkt för att spara tid i eventuella senare beräkningar.
Sen till själva AI delen.
Jag tänker att man gör så att varje gång en flipper skjuter iväg en kula så börjar man en ny poängkurva. En poängkurva börjar med en startposition där kulan lämnar flippern och slutar när kulan träffar en flipper igen eller förloras. Förutom själva kurvan så sparar man också poängskillnanden mellan start och stopp.
På så vis kan man betygsättea varje försök som AI:n gör. Kurvor som resulterar i drain tex. inte intressanta att spara.
Till en början när man inte har några poängkurvor alls så kommer AI:n att göra slumpmässiga försök och helt enkelt testa sig fram.
Efter ett tag när man har börjat få in data så kommer AI:n att börja prova tidigare ”lyckade” försök. Dels för att avgöra vad som går att återskapa gång på gång, och även att kasta bort såna kurvor som leder till slumpat beteende som tex. att skjuta på bumprar.
Ju fler kuvor som sparas destå bättre kommer även AI:n att förstå spelplanen. Genom att gå igenom alla punkter i databasen så kan man bygga en virituell fysisk modell av spelplanen som sedan används till att ännu bättre kunna beräkna förväntad bana. Genom analysering av accelerationer kan man troligen även beräkna höjdskillnader på spelplanen (ramper).
Då och då kan man även på samma sätt som man rensade bort onödiga positioner även rensa bort "dåliga" kurvor.
Om flera kurvor liknar varann och har samma poäng så lägger man ihop dom och skapapar en starkare kurva. På så vis bygger man fram en vinnande stategi.
Sen börjar det bli riktigt klurigt.
När man har tusentals (miljontals?) kurvor sparade så är nästa steg att försöka lista ut serier av vinnande strategier och koppla ihop med förändringar av spelplanen. Jag lite osäker på hur man egentligen löser detta, men kanske man kan koppla kurvorna till en ny uppsättning data som försöker koppla ihop en serie av kurvor i någon sorts följd/tidsbaserad trädstruktur.
Det är här som spelets regler skapas.
Om du läst så här långt så är det nu dags att föja upp med en kommentar om vad du tycker om det hela.
Är det en bra idé?
Ser du några svagheter, brister, fel?
Har du förslag på förbättringar, frågor?
Jag är tacksam för all respons och ser gärna att du kommenterar.
/Björn
Ps. För tillfället äger jag inget flipperspel, men det kommer att införskaffas under nästa år.