Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

61

18.08.2008, 16:52

Weil der Ball immer schneller wird? :-p

Ich teste einfach verschiedene Ansätze gegeneinander, die Referenz KI sollten die meisten ja inzwischen mit 100 Vorsprung zurückgelassen haben. Die eigene KI doppelt spielen zu lassen kann allerdings auch hilfreich sein, um zumindest auf die selbst erdachten Angriffe gefasst zu sein. ;-)
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

62

18.08.2008, 16:52

Ich habs zumindest so weit überprüft, dass mein errechneter Aufschlagspunkt und meine errechnete Zeit bis dorthin auf 0,00001 genau ist. Das sollte reichen um es ausreichend genau nennen zu können ;) nur wirds irgendwann einfach zu schnell, da du auch nur die Zeit von der gegenüberliegenden Spielfeldseite bis zu dir hast, da der Gegner sonst den Ball noch in alle Richtungen ablenken kann. Da könnte man höchstens raten.

Und was ich bisher aus meinen Tests erfahren konnte sind Defensive Spieler wesentlich besser gegen Aggressive, aber schafft die Referenzki nicht 100:0. ;)

63

18.08.2008, 17:23

Also Pong ist wirklich schwerer zu programmieren, als erwartet. Erreicht der Ball eine bestimmte Grenzgeschwindigkeit, ist alles verloren.

Quellcode

1
2
3
4
...
Time played: 2127  Ball speed in y: -2.49046
Time played: 2127  Ball speed in y: -2.49046
Time played: 2127  Ball speed in y: ^C

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

64

18.08.2008, 19:54

Ich habe den Vorschlag von S.Seegel jetzt umgesetzt.

65

18.08.2008, 20:50

In den neuen Code hat sich wohl ein Bug eingeschlichen, wodurch das Game in einer Endlosschleife endet, wenn save_dt 0 wird.
save_dt wird 0, wenn gs.ball_x fast 0 ist (1.4e-45) und dann auch durch eine hohe Geschwindigkeit gelteilt wird (gs.ball_vx = -3.9).

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

66

18.08.2008, 21:41

Ist bei mir noch nicht passiert ...
Tritt der Fehler immer noch auf, wenn du folgende Zeile an das Ende der Berechnungen für safe_dt einfügst?

C-/C++-Quelltext

1
safe_dt = std::max(safe_dt, 1.0e-6f);


Ggf. mit der 1.0e-6f ein bisschen herumspielen.
Bitte dann bescheid sagen, ob es was gebracht hat.

67

18.08.2008, 21:52

Jup, das funktionert.
Bei mir tritt das ziemlich häuftig auf. Liegt vielleicht daran, dass sich der Ball dauert auf einer Höhe einpendelt, also vy fast 0 ist.

68

19.08.2008, 06:35

Zitat


// Wann berührt der Ball zum nächsten Mal eine Bande oder die Torlinie?
// Diese Zeit kann "sicher" in einem einzigen Schritt simuliert werden.
// Wir beschränken die Zeit aber auf ein Frame.
float safe_dt = gs.ball_vx < 0.0f ? gs.ball_x / -gs.ball_vx : (FIELD_WIDTH - gs.ball_x) / gs.ball_vx;
safe_dt = std::min(safe_dt, gs.ball_vy < 0.0f ? gs.ball_y / -gs.ball_vy : (FIELD_HEIGHT - gs.ball_y) / gs.ball_vy);
safe_dt = std::min(safe_dt, static_cast<float>(gs.time + 1) - real_time);
safe_dt = std::max(safe_dt, 1.0e-6f);


kann mir jemand sagen, was das bedeuten soll? durch den kommentar werde ich absolut nicht schlau und aus dem code sehe ich dessen funktion auch nicht raus.

wofür steht safe_dt überhaupt?

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

69

19.08.2008, 10:09

safe_dt steht für die Länge des Zeitschritts, der "sicher" im nächsten Durchgang berechnet werden kann, ohne dass der Ball währenddessen gegen eine Wand fliegt oder eine Torlinie überquert.

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

70

19.08.2008, 10:11

Die Simulation wird in Schritten von 1.0 Zeiteinheiten ausgeführt. Dadurch kann eine KI in fest definierten Zeitabständen die Beschleunigung des Paddles ändern (hoch, keine, runter).

In der Regel werden Kollisionen mit der Bande bzw. den Torlinie jedoch nicht zu diesen Zeitpunkten stattfinden, sondern irgendwann dazwischen.
Eine Lösung, um zu verhindern, dass der Ball das Spielfeld verlässt, ist es, die Simulation maximal bis zum nächsten Banden/Torlinie Kontakt durchzuführen. So wird das Abprallen an der korrekten Stelle durchgeführt.
Damit das Prinzip der 1.0 Zeiteinheiten Schritte erhalten bleibt, wird der folgende Simulationsschritt ebenfalls nicht über die vollen 1.0 Zeiteinheiten durchgeführt, sondern nur um die Zeitdifferenz bis zur nächsten vielfachen von 1.0 Zeiteinheiten (also dem Zeitpunkt, an dem die KIs wieder aufgerufen werden sollen).

Und diese Überlegungen finden sich in dem von dir zitierten Codeausschnitt wieder.
Die erste Zeile ermittelt den Zeitabstand bis zur nächsten Kollision mit einer Torlinie.
Die zweite Zeile berechnet den Zeitpunkt bis zum nächsten Bandenkontakt. Durch das min wird dieser Zeitpunkt nur dann übernommen, wenn er vor dem nächsten Torlinie-Kontakt stattfindet.
Da in der Regel der nächste Kontakt mit einer Spielfeldbegrenzung zeitlich weiter entfernt liegt, als die für einen einzelnen Simulationsschritt angestrebten 1.0 Zeiteinheiten, korrigiert die dritte Zeile safe_dt auf maximal den Abstand bis zum nächsten planmäßigen Aufruf der KIs (in der Regel 1.0, es sei denn, der letzte Simulationschritt war verkürzt).
Die letzte Zeile korrigiert noch einen möglichen Grenzfall (sehr nahe an einer Spielfeldbegrenzung und sehr hohe Geschwindigkeit), bei der durch die begrenzte rechengenauigkeit von Gleitkommazahlen die Dauer des nächsten Simulaionsschritts als 0.0 berechnet wird (wodurch das Spiel sich in einer Endlosschleife fängt).

Werbeanzeige