Unvollkommene Pong-KI

19

Ich fange also an, Java und OpenGL zu lernen, während ich LWJGL benutze. Zu Beginn schreibe ich einen Klon des Atari Pong. Ich habe den Spielbildschirm und die Kollisionserkennung korrekt eingerichtet und das ganze Spiel funktioniert größtenteils. Wenn es ein Spiel für 2 Spieler wäre, würde ich es jetzt machen, aber da ich vorhabe, dies als Einzelspielerspiel zu machen Ich muss mir eine einfache KI ausdenken, um den zweiten Spieler zu kontrollieren.

Zu wissen, wo der Ball schlagen wird, scheint ziemlich trivial, und eine KI zu erstellen, die immer auf den Ball trifft, scheint eine einfache Sache zu sein, aber ich möchte, dass das Spiel gewonnen werden kann, daher kann ich die IA nicht immer zum Erfolg führen Ball.

Hier ist meine Frage, wie ich dies codieren soll, um der KI menschenähnliche Unvollkommenheiten hinzuzufügen. Sollte ich nach dem Zufallsprinzip entscheiden, ob die KI an einem bestimmten Punkt versagt? Oder gibt es eine klügere (oder einfach nur offensichtliche) Sache, die mir hier fehlt?

Vielen Dank.

Setzer22
quelle
5
Nun, im Allgemeinen lässt du den KI-Schläger nur eine bestimmte Geschwindigkeit bewegen. Wenn der Ball vom Spieler gut platziert wird, kann die KI ihn nicht erreichen.
4
Ich würde damit beginnen, die Geschwindigkeit zu begrenzen, mit der die KI das Paddel bewegen kann, und / oder eine zufällige (kurze) Verzögerungszeit aufzubauen, bevor die KI auf einen Treffer zu reagieren beginnt.
1
Mögliches Duplikat von Wodurch fühlt sich ein Computergegner lebendig?
MichaelHouse
4
@ byte56 Ich würde es nicht wirklich als Dupe dieser Frage bezeichnen. Es fühlt sich an wie das Beispiel, das hier blog.stackoverflow.com/2011/01/… unter "Wenn Sie die Frage eines Benutzers als Duplikat schließen möchten , muss es sich um ein echtes Duplikat handeln". Diese Frage ist eine gute Ressource (und jemand könnte diese Frage wahrscheinlich verwenden, um selbst eine Antwort abzuleiten, wenn der Inhalt dort gegeben ist), aber sie beantwortet die Einzelheiten dieser Frage nicht wirklich, glaube ich nicht.
Tetrad
1
@Tetrad Ich denke, die Antworten sind sich sehr ähnlich, aber Sie haben Recht, die Fragen sind unterschiedlich. Ich denke, diese Frage ist eine spezifischere Version der verknüpften Frage. Hätte das OP das andere zuerst gesehen, ich bin nicht sicher, ob diese Frage gestellt worden wäre. Als ich abstimmte, war ich unentschlossen, also habe ich sowohl die Frage als auch die Antworten positiv bewertet und als Duplikat abgestimmt. Es könnte für mich in beide Richtungen gehen.
MichaelHouse

Antworten:

20

Meine bevorzugte unvollkommene Pong-KI ist brutal einfach, aber man kann ein paar ziemlich nette KI-Fehler machen.

Unsichtbarer Ball AI

KI-Setup : Wenn der Ball von Ihrem Paddel reflektiert wird, wissen Sie, wo er ist und wie schnell er ist. Bringe an diesem Punkt einen unsichtbaren Ball hervor, aber mit einer höheren Geschwindigkeit. Es wird dort landen, wo der sichtbare Ball hingeht. Lassen Sie die KI in jedem Frame auf die Position des unsichtbaren Balls zugehen. Halten Sie den unsichtbaren Ball an, sobald er die Seite der KI erreicht, und bewegen Sie dort das Paddel.

Ergebnisse : Die KI scheint zu versuchen, den Weg des Balls vorherzusagen. Angenommen, der Spieler hat den Ball in einem steilen Winkel reflektiert, sodass er von einer Wand abprallt. Die KI wird den Ball ein Stück weit verfolgen und dann - langsamer als der Ball - nicht schnell genug zurückfinden. Sie haben die KI ausgetrickst und es sieht aus menschlicher Sicht ziemlich logisch aus. Sie können sehen, wie der Computer versucht, die Richtung des Balls vorherzusagen, und dann - oh, es hat gefehlt, es war zu langsam, und Sie haben einen Punkt gewonnen.

Dies ist deutlich besser als das Einfügen von Zufälligkeiten, da die KI dadurch relativ intelligent aussieht. Ein würdiger Gegner. Außerdem kann die KI nach genau den gleichen Regeln wie der Mensch spielen, was für den Spieler besser aussieht und Ihre Arbeit erleichtert.

Einstellungen : Sie können auch die Geschwindigkeit des unsichtbaren Balls anpassen, da dadurch festgelegt wird, wie weit die KI im Voraus plant. Je schneller der unsichtbare Ball ist, desto länger muss sich das Paddel bewegen, um zu blocken, und desto besser muss der Spieler zielen.

DDR
quelle
Alle Antworten lieferten wirklich gute Informationen, aber da ich eine markieren musste, um die richtige Antwort zu erhalten, habe ich diese ausgewählt, da mir Ihr Ansatz wirklich gefällt. Dies, kombiniert mit einigen anderen Dingen, die in anderen Antworten gesagt wurden (wie das Spielen mit der Reaktionszeit), könnte zu einer wirklich menschenähnlichen KI führen und mit einem leicht einstellbaren Schwierigkeitsgrad
Setzer22,
Dies funktionierte perfekt für mein Setup, da ich variable Winkel, Geschwindigkeit und Beschleunigung basierend auf bestimmten Spezialbewegungen habe, so dass der Ball möglicherweise überall sein kann. Die KI wurde besessen, aber jetzt ist es viel besser. Ich kann sehen, warum diese Methode bei fester Geschwindigkeit und 45-Grad-Winkeln nicht die beste ist, aber das ist überhaupt nicht mein Spiel.
Jackrugile
1
Während ich diesen Ansatz mag, hatte ich Probleme mit meiner Implementierung. Das Problem ist, dass der Tracerball, da er sich schneller bewegt als der Ball, den er darstellt, möglicherweise einige Kollisionen übersieht, die mit dem Ball, den er darstellt, passieren. Grund dafür ist natürlich, dass sich der Tracerball um eine größere Strecke zwischen den Frames bewegt.
Wolfgang Schreurs
Wenn Sie eine höhere Wiedergabetreue wünschen, können Sie die Tracer-Ball-Position zweimal pro Frame neu berechnen und die Geschwindigkeit für jede Berechnung halbieren.
DDR
22

Die Pong-Spiele, die ich gespielt habe, scheinen sich wie folgt zu verhalten: Das KI-gesteuerte Paddel weiß, wo der Ball schlagen wird, aber es ist begrenzt, wie schnell es diese Position erreichen kann. So fehlt es manchmal. Ich denke, das ist der naheliegendste Weg, das zu tun.


quelle
Dies. Hilft der KI nicht zu wissen, wo der Ball schlagen wird, wenn er sich nur etwa 3 Pixel pro Frame bewegen kann und sich von oben nach unten bewegen muss.
KeithS
14

Als ich auf meinem TI83 einen ach so tollen Fast-Pacman-Klon erstellt habe? Rechner, das größte Problem, auf das ich stieß, war, dass die "Geister" viel zu schnell waren. Ich musste sie irgendwie verlangsamen. Also habe ich eine große alte Sünde (cos (tan (x-Koordinate)) hineingelegt. Einfachere Ebenen würden diese Berechnung einige Male durchführen, und schwierigere Ebenen würden nur eine der Operationen ausführen.

Der Punkt ist, REAKTIONSZEIT. Ermitteln Sie, was eine typische menschliche Reaktionszeit ist, und fügen Sie 10 ms hinzu. Verwenden Sie das als Ausgangspunkt. Wenn die Levels härter werden, entfernen Sie die Zeit aus der Reaktionszeit ... was Thread.sleep(time);für die KI einfach sein kann . Warten Sie so lange, bis sich die KI in Bewegung setzt.

Sie können auch steuern, wie schnell sich das Paddel bewegt, oder, wenn Sie WIRKLICH kompliziert werden möchten, bestimmen, wo der Ball auf unterschiedlichen Informationsgraden basiert ... sagen wir nur 2 Pixel statt eines Vektors. Fügen Sie den Wänden Winkelmodifikatoren hinzu, um ein gewisses Maß an Zufälligkeit hinzuzufügen, wodurch die KI gezwungen wird, eine Neuberechnung durchzuführen.

Russell Uhl
quelle
2
Kannst du erklären, warum genau du es benutzt hast sin(cos(tan(x)))?
nullpotent
5
weil ich jung und dumm war und auf einem TI83 sin (cos (tan (x))) eine gute Verzögerungseinheit in der KI erzeugte. Auch, weil der Taschenrechner meines Wissens keinen Wartebefehl hatte, der Millisekunden verbrauchen könnte. Vielleicht ein bisschen Klarheit: Ich habe weder die Assembly noch das Mikroskript oder eine andere Sprache verwendet, die Sie kompilieren können, um diese Dinge auszuführen. Ich habe den Programmiercode in der Firmware verwendet (die Taste prgm). Ich hatte zu jedem Zeitpunkt maximal 8 Codezeilen auf dem Bildschirm. Ich konnte mich über einen längeren Zeitraum an nichts Komplizierteres erinnern.
Russell Uhl
2
Ich habe gelernt, auf den Firmware-Code des TI83 zu programmieren. Dann musste ich das strukturierte Programmieren in C ++ neu lernen. Ich würde sagen, der TI83 hat mir beigebracht, was Spaghetti-String-Code ist und warum er schlecht ist. Ich habe seitdem keine goto-Anweisung mehr verwendet. Gute Zeiten.
ContextSwitch
2
Oh mein Gott, die Gotos. Ich überarbeite den Code immer wieder .... und gebe schnell auf. Ich habe keine Ahnung, wie ich es geschafft habe, dieses Ding über einen Zeitraum von Wochen während meines Mathematikunterrichts zu programmieren.
Russell Uhl
1
Sie müssen sich nicht um Ihre Auslöseverzögerung kümmern. Gleitkomma-Mathematik in einer Schleife war eine übliche Methode, um in Programmen, die vor einigen Jahrzehnten geschrieben wurden, eine Pause einzulegen, und die Leistung / Fähigkeiten Ihres Taschenrechners stimmen mit denen eines Computers aus den frühen 80ern überein.
Dan Neely
6

Wenn Sie einfach das Paddel verlangsamen, verfehlt der Computer fast immer, wenn Sie den Ball in einem spitzen Winkel schlagen (dh wenn Sie sich viel auf und ab bewegen, anstatt direkt auf die andere Seite), da sich der Ball auf und ab bewegt schneller als das Paddel ausgleichen kann.

Stattdessen würde ich mit der Geschwindigkeit des Paddels und dem Punkt, an dem die KI reagiert, spielen. Beispielsweise:

  • wenn der Benutzer den Ball schlägt
    • Die KI kann sofort reagieren und dorthin gehen, wo der Ball sein wird. Wenn es schnell genug ist, wird es rechtzeitig dort ankommen
  • wenn der Ball die Mitte des Feldes überquert
    • Die KI muss warten, bis sie die Mitte des Feldes überquert, bevor sie reagiert

Eine andere Sache zu ändern ist, wie die KI reagiert. Sie haben eine Strategie hervorgehoben, bei der sich das Paddel immer an die Position bewegt, an der sich der Ball befinden wird. Eine Person kann das nicht immer tun. Es ist wahrscheinlicher, dass sie dem Ball auf und ab folgen, ohne zu wissen, wo genau der Ball sein wird, wenn er zu ihnen kommt, aufgrund all der Sprünge.

Eine menschlichere Reaktionsmethode ist es daher, sich immer auf den Ball zuzubewegen. Wenn sich der Ball zum Beispiel nach oben bewegt, bewegt sich das Paddel nach oben. Wenn das Paddel schnell genug ist, kann es auf das Abprallen von oben und unten reagieren. Wenn das Paddel nicht schnell genug ist, wird es überkompensiert, indem es sich nach oben bewegt, wenn sich der Ball nach oben bewegt. Wenn es jedoch springt, kann sich das Paddel möglicherweise nicht schnell genug nach unten bewegen.

Schließlich können Sie auch mit der Paddelgröße spielen, um den Schwierigkeitsgrad zu erhöhen oder zu verringern.

Trenin
quelle
2

Ein zu berücksichtigender Faktor ist die Zufälligkeit. Menschliche Spieler haben immer ein gewisses Maß an Variation in ihrem Spiel. Wenn Ihre KI also menschlich wirken soll, möchten Sie auch Variation in ihrem Spiel haben.

Sie können Bereiche einrichten für:

  • Reaktionszeit (wie schnell sich die KI bewegt)
  • Geschwindigkeit (wie schnell die KI das Paddel bewegt)
  • Genauigkeit (wie nah die KI an die Stelle kommt, an der sie ihr Paddel tatsächlich bewegen möchte, wodurch die Chance besteht, dass sie unterschreitet oder überschreitet, wo sie sein möchte)

Dann kann die KI bei jedem Treffer des Gegners einen Wert innerhalb dieser Bereiche auswählen und darauf basierend ihre Entscheidungen (und Bewegungen) treffen. Für leichtere KI-Gegner können Sie diese Reichweiten alle ziemlich schlecht machen, aber Sie können auch große Reichweiten haben, um der KI ein paar "Glücksschüsse" zu geben. Für schwierigere Gegner können Sie diese Bereiche verschärfen und sie alle in den "guten" Bereich versetzen.

Blobinator
quelle
2

Ich werde eine allgemeinere Lösung vorschlagen, die nicht nur für Pong spezifisch ist. Ich glaube, das kann auf jedes Spiel angewendet werden - nicht nur auf Pong. Du willst ein menschliches Verhalten, oder? Damit ein Mensch das Gefühl hat, ein Mensch zu sein ... und daher im weiteren Sinne auf einen Sieg hoffen kann. Also, was machst du?

Beobachte einen Menschen! Wie kann ein Spieler bei Pong verlieren? Nun, wenn wir zwei Pong-Spieler sehen, ist das ganz offensichtlich. Normalerweise liegt der Verlust daran, dass der Ball einfach zu schnell ist und die Reaktionszeit des Spielers verzögert wurde. Das sind zwei Parameter, von denen einer einstellbar ist. Das andere ist die Fähigkeit des Spielers, die richtige Richtung einzuschlagen. Sie haben also eine Fehlerfrequenz und eine Reaktionsfrequenz - beide können je nach Schwierigkeitsgrad eingestellt werden.

Eine einfache KI hätte eine höhere Eingangsverzögerung und eine größere Tendenz, zufällige Fehler zu machen - wobei eine schwierigere KI so abgestimmt wäre, dass diese Parameter schwierig wären.

Dies kann auf nahezu jedes Spiel angewendet werden - auch auf ein Tic Tac Toe-Spiel oder komplexere Modelle. Dieser Ansatz funktioniert in komplizierteren Szenarien, ist jedoch ausreichend, wenn die Anzahl der Parameter und der Umfang der Spiele gering ist.

Vaughan Hilts
quelle
1

Hier ist eine Liste einiger Optionen, von denen einige bereits behandelt wurden:

  • Bilden Sie intelligentere Computerspieler, die den Ball zielen, damit es für den Spieler schwieriger ist, mit vielen Sprüngen zu erreichen, und machen Sie das Gegenteil für einfache Gegner.
  • Ein schlauer Spieler bewegt sein Paddel in die Mitte, während der Ball auf dem Weg zum Gegner ist, und er weiß nicht, wohin er zurückkehren wird.
  • Vor dem letzten Abprall ist es für einen Menschen schwerer vorherzusagen, wo der Ball landen wird. Stellen Sie sicher, dass die KI eine ähnliche Ungenauigkeit aufweist.
  • Begrenzen Sie die Geschwindigkeit des Paddels so, dass es langsamer als der Ball ist. Es muss weniger als die Hälfte der vertikalen Geschwindigkeit sein, um bei perfektem Spiel zu verfehlen.
  • Erhöhen Sie die Geschwindigkeit des Balls basierend auf Schwierigkeitsgrad, Spieldauer usw.
  • Menschen reagieren nicht sofort. KI-Spieler sollten es auch nicht.
  • Geben Sie der KI eine zufällige Chance, einen Fehler zu machen und den Ball zu verfehlen.
Adam
quelle
0

Ich habe auch einen kleinen Pong-Klon gemacht (in LUA).

Meine KI ist sehr einfach, aber es ist nicht so schlimm, imho.

Ich überprüfe nur die y-Position des Balls und wenn ich niedriger bin, bewege ich das Paddel nach unten, wenn höher, bewege ich das Paddel nach oben.

Zur Feineinstellung des Schwierigkeitsgrades vergrößere oder verkleinere ich dann den Abstand zum Ball, von dem aus sich das Computerpaddel zu bewegen beginnt.

Pitto
quelle