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

31

17.08.2008, 09:35

Zitat von »"GreyHound"«

Mir fällt ein Fehler in der Punktezählung auf. [...]
Verlasst euch also nicht auf die Consolenausgabe!


Das ist Blödsinn, wenn du das Programm beendest, wird das Spiel einfach bei maximaler Geschwindigkeit zu Ende gespielt, d.h. was du siehst ist der Endstand, der herauskäme, wenn du das Spiel zu Ende angeschaut hättest.

[Edit] Hmpf, Stefan war schneller. ;-)
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

David Scherfgen

Administrator

  • »David Scherfgen« ist der Autor dieses Themas

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

32

17.08.2008, 10:33

OK, ich denke wir müssen die Ballgeschwindigkeit doch nach jedem Schlag erhöhen - sonst wird es zu viele Unentschieden geben. Oder hat jemand eine andere Idee?

33

17.08.2008, 10:52

Zitat von »"S.Seegel"«

Willkommen dabei, GreyHound !
Dann zitiere ich einfach mal aus der Aufgabenstellung:

Zitat von »"David Scherfgen"«

Wird das Fenster geschlossen, wird das Spiel in maximaler Geschwindigkeit zu Ende gespielt, und das Ergebnis wird auf der Konsole ausgegeben.

Folglich sollte die Ausgabe nur dann den von dir erwarteten Stand von 0:0 entsprechend, wenn sich beide KIs über den gesamten Spielverlauf schadlos halten konnten.


Ui, das hab ich wohl übersehen. Nix für ungut

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

34

17.08.2008, 16:19

Ich musste gerade feststellen, dass die Korrektur des Abprallberechnung an den Banden das Problem der fälschlicher weise gewerteten Tore nicht (zumindest nicht vollständig) behoben hat. Da lag ich mit meiner Einschätzung offensichtlich falsch.

Ich habe mir die Tor-Erkennung so modifiziert, dass sie im Falle eines erkannten Tores die Positionen von Paddle und Ball ausgibt, und erhalte solche Ausgaben (exemplarisch):

Quellcode

1
2
Tor gefangen :(        Paddle @0.05, Ball @(2|-0.000293019)
Tor gefangen :(        Paddle @0.95, Ball @(2|1.01086)

Die dt-Korrektur der Berechneten Werte, um die Positionen zum tatsächlichen Kollisionszeitpunkt zu erhalten*, kann unter Unständen die Y-Position des Balls außerhalb des Spielfeldes platzieren.
Da die Paddle-Koordinaten aber auf das Spielfeld beschränkt sind, "tunnelt" sich der Ball durch.

Eine Beschränktung der Ball-Koordinaten nach der dt-Korrektur (für beide Seiten nötig) löst das Problem.

C-/C++-Quelltext

1
2
3
4
if (gs.ball_y < 0.0f)
    gs.ball_y = 0.0f;
else if (gs.ball_y > FIELD_HEIGHT)
    gs.ball_y = FIELD_HEIGHT;


Ich spiele hier ungern den Spielverderber, aber ich sehe leider noch ein grundsätzliches Problem: in wenigen Zeilen lässt sich eine KI schreiben, die gegen jede andere zu 0 spielt. Selbst eine aggressive KI (die die Referenz 0:40 bis 0:50 abzieht) kommt dagegen nicht an.
Leider sehe ich auch keine Lösung für das Problem. Die kontinuierliche Erhöhung der Geschwindigkeit lässt lediglich den Zufall entscheiden, auf welcher Seite das Tor fällt. Hoffentlich lässt sich noch eine Modifikation finden ! Der Contest klang zunächst so spannend :?


* nebenbei bemerkt, die Rückrechnung auf den tatsächlichen Kollisionszeitpunkt funktioniert so nicht für den Sonderfall, dass das Paddle im letzten Simulationsschritt an die Bande getroffen und seine Geschwindigkeit eingebüßt hat. Aber das nur so am Rande ;)

35

17.08.2008, 17:00

Seid wann ist denn Pong so schwer zu schreiben, seufz? Zum einen vermisse ich etwas klareren Code und wuensche mir etwas mehr Kommentare bei den if's. Ich fuer meinen Teil blicke da nur schwer durch (wobei ich auch etwas faul bin, Code sollte selbsterklaerend sein). Wo genau ist dennn das if fuer Ball-Paddel-Kollision und wie verhaelt sich diese. Spielt der Punkt auf dem Paddle eine Rolle, also weiter aussen wird anders reflektiert als in der Mitte oder so, hat Paddlegeschwindigkeit einen Einfluss?

Ansonsten finde ich die Idee super, wobei Pong fuer eine KI etwas ... hmm ... enfach ist. :-)

36

17.08.2008, 17:03

Man könnte den Schläger nach einer Zeit kontinuierlich verkleinern lassen. Dadurch müsste man eine KI programmieren die exakt immer die mitte erwischen muss. Das würde die Häufigkeit von unentschieden vermeiden, und die Programmierung wird anspruchsvoller.

// edit: man könnte auch die Bewegungsgeschwindigkeit der Schläger verringern.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

37

17.08.2008, 17:04

Zitat

Ansonsten finde ich die Idee super, wobei Pong fuer eine KI etwas ... hmm ... enfach ist.


Naja. Das spielt ja aber überhaupt keine Rolle. Es soll ja nicht eine gute KI die Herausforderung sein, sondern eine, die die anderen schlägt.

Laufen ist ja auch nicht schwierig, aber an der Olympiade machen sie es ja trotzdem auch. ;)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

38

17.08.2008, 17:26

@knivil:

Die Ball-Paddle-Kollision findest du in der Funktion do_game() unter dem Kommentar "// auf Tor überprüfen" ;)

Der genaue Punkt der Kollision mit dem Paddle spielt für die Reflektion keine Rolle, wohl aber die Geschwindigkeit des Paddles, logischer Weise im selben Code-Abschnitt zu finden wie der Kollisionstest.
Die Geschwindigkeit entlang der X-Achse wird dabei invertiert, entlang der Y-Achse wird die Geschwindigkeit des Paddles übernommen (mit einer kleine Zufallsabweichung, um statische Situationen zu vermeiden).

@raXor

Ich sehe nicht, wie dein Vorschlag das Problem löst. Der Knackpunkt ist - in meinen Augen (!) - dass es trivial ist den Punkt vorauszuberechnen, an dem der Ball die eigene Seite erreichen wird. Wenn man also anstatt wie die Referenz der aktuellen Y-Position des Balls zu folgen direkt den Punkt ansteuert, kann das Gegenüber absolut nichts tun, um ein Punkt zu erzielen.
Vergleichbar einem Tic-Tac-Toe, bei dem beide Spieler fehlerfrei spielen, wird das Resultat ein Unentschieden sein.
Ein Tor wird erst dann fallen, wenn ein KI auf Grund der Geschwindigkeit des Balls der Verteidiger nicht mehr rechtzeitig zur Stelle sein kann. Wen das trifft, ist imho zufällig.

39

17.08.2008, 17:31

implementier den ball doch mit drall...also wenn man den ball anschnippelt, dass der zum einen ne leichte kurve fliegt, und zum anderen unvorhersehbarer an der wand apprallt.

40

17.08.2008, 17:40

Mit Ort Impuls und Drehimpuls? Zum Glueck haben wir hier nur einen Koerper, auf den sich das auswirkt. Ich denke aber, es verkompliziert die Sache. Vielleicht ist Typ: Kuerze des Codes jetzt doch garnicht so falsch. Wer schafft es die kleinste perfekte KI zu schreiben? :-)

Werbeanzeige