Du bist nicht angemeldet.

Werbeanzeige

11

16.08.2008, 15:57

Zitat

"Pong - X11 Debug" does not support the current platform. Skipping...
Nothing to be done.

Bekam den Fehler unter Linux, weil für X11 Windows als Plattform eingetragen war.

[EDIT]
Darf man statische Variablen verwenden?

12

16.08.2008, 16:16

Ich seh es schon kommen, dass am Ende die Referenzki alle besiegt :)

Atlan123

1x Contest-Sieger!

  • Private Nachricht senden

13

16.08.2008, 16:47

Zitat von »"knivil"«

Hat "Typ: Kuerze des Codes" eine Bedeutung hier oder zaehlt einfach die bessere KI?


IMHO copy&paste-fehler
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." (Bjarne Stroustrup)

14

16.08.2008, 17:07

Wäre es nicht sinnvoller, den Ball während dem Spiel schneller werden zu lassen und nicht bei einem Punkt?
Sonst gibt es denk ich mal zu viele Unentschieden.

[EDIT]
Ich hab im Moment ein Problem, wenn der Ball genau in die Ecke fliegt.
Mein Paddel ist ganz in der Ecke (gs.player_y = 0.500000007), gesetzt durch folgenden Code aus do_game:

Quellcode

1
if(gs.player_y[i] - 0.5f * PADDLE_SIZE < 0.0f) gs.player_y[i] = 0.5f * PADDLE_SIZE, gs.player_vy[i] = 0.0f;


Trotzdem fliegt der Ball über mein Paddel.

Helmut

5x Contest-Sieger

Beiträge: 691

Wohnort: Bielefeld

  • Private Nachricht senden

15

16.08.2008, 17:22

Würde ich auch sagen.
Außerdem wärs sinnvoll, wenn der Ball, je nach dem, wo er auf dem Paddel auftrifft, anders zurückgeworfen wird. (wie bei anderen Pongs)
Sonst gibts bei der Aufgabe nämlich nur zwei Schwierigkeiten, die linare Gleichung des Balls zu lösen und mit der verzögerten Bewegung des Paddels zurecht zu kommen. Das dürften wohl mehrere schaffen.

Noch zwei Fragen: Sind in der Funktion statische Variablen erlaubt und darf die Funktion so lange rechnen, wie sie Lust hat?

Ciao

EDIT: OK, hab grad bekerkt, dass sich die Geschwindigkeit des Paddels auf den Ball auswirkt:) Damit ist das Problem natürlich gelöst.
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

16

16.08.2008, 17:30

Erstmal ein Lob für die Aufgabe ! Ich hoffe wirklich, dass sich für solche Aufgabenstellungen ein größeres Teilnehmerfeld wird begeistern können. Ich jedenfalls werde mir wohl mal wieder die Zeit nehmen ;)

Mir sind jedoch zwei Fehler im Framework aufgefallen.
Zum einen reflektierst du zwar den Geschwindigkeitsvektor des Balls an der Bande, wenn dieser das Spielfeld verlässt, der Ball selbst verbleibt aber außerhalb (bewegt sich in der Folge natürlich wieder hinein).

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
// Ball bewegen

gs.ball_x += gs.ball_vx;
gs.ball_y += gs.ball_vy;
//if(gs.ball_y < 0.0f || gs.ball_y > FIELD_HEIGHT) gs.ball_vy = -gs.ball_vy;

if (gs.ball_y < 0.0f)
{
    gs.ball_y  = -gs.ball_y;
    gs.ball_vy = -gs.ball_vy;
} else if (gs.ball_y > FIELD_HEIGHT) {
    gs.ball_y  = 2.0f*FIELD_HEIGHT - gs.ball_y;
    gs.ball_vy = -gs.ball_vy;
}


Der andere Fehler ist in der Initialisierung der X11 Visualisierung. Dort überschreibst du die von pthread_create() in message_thread abgelegte ThreadID mit dem Rückgabewert der Methode (was - zumindest bei pthread-Implementierungen, die pthread_t als Zeiger definieren - bei pthread_join() zu einem segfault führt).

C-/C++-Quelltext

1
2
//message_thread = pthread_create(&message_thread, 0, &thread_proc, 0);

pthread_create(&message_thread, 0, &thread_proc, 0);


EDIT: hab nach Helmuts Edit die Reflektionsberechnung am Paddel nochmal nachgeschaut, verstanden und daher meine voreilige "Anregung" zurückgenommen (soll heißen: gelöscht).

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

17

16.08.2008, 17:57

Jo, diese Reflektionsungenauigkeit an der Bande hat meine KI auch schon entdeckt. :-p Vielleicht ist das aber auch gewollt so, damit das ganze nicht zu statisch wird?

Ich denke allerdings auch, dass dadurch, dass sich die Schlägergeschwindigkeit mit etwas Zufall auf den Fortlauf des Balles auswirkt, schon einige Möglichkeiten offen stehen. Eine Beschleunigung des Balles im Flug halte ich für seltsam - höchstens eine Verlangsamung aufgrund der Luftreibung. ;-)

Statische Variablen würden neue Möglichkeiten eröffnen, würden aber möglicherweise auch einige nette Herausforderungen beseitigen, von daher ist es ohne eigentlich auch ganz schön. :-)
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

18

16.08.2008, 18:08

Ich hab bei mir mal den Code geändert, damit man mit dem Mittelpunkt des Schlägers bis zum oderen und unteren Rand fahren kann und die Fehler meiner KI sind um 80%-90% zurückgegangen.
So hab ich es geändert:

Quellcode

1
2
3
4
5
6
7
8
9
10
// Spieler bewegen
for(uint i = 0; i < 2; ++i)
{
    if(player_action[i] == -1) gs.player_vy[i] -= PLAYER_ACCELERATION;
    else if(player_action[i] == 1) gs.player_vy[i] += PLAYER_ACCELERATION;
    gs.player_vy[i] *= PLAYER_DAMPING;
    gs.player_y[i] += gs.player_vy[i];
    if(gs.player_y[i]/* - 0.5f * PADDLE_SIZE*/ < 0.0f) gs.player_y[i] = /*0.5f * PADDLE_SIZE*/0, gs.player_vy[i] = 0.0f;
    else if(gs.player_y[i]/* + 0.5f * PADDLE_SIZE*/ > FIELD_HEIGHT) gs.player_y[i] = FIELD_HEIGHT/* - 0.5f * PADDLE_SIZE*/, gs.player_vy[i] = 0.0f;
}

drakon

Supermoderator

Beiträge: 6 526

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

19

16.08.2008, 19:48

Die Idee gefällt mir!
Werde mich vlt. nach den Prüfungen auch mal dransetzen. :)

S.Seegel

2x Contest-Sieger

  • Private Nachricht senden

20

16.08.2008, 20:26

Zitat von »"Florianx"«

Ich hab im Moment ein Problem, wenn der Ball genau in die Ecke fliegt.
Mein Paddel ist ganz in der Ecke (gs.player_y = 0.500000007)
...
Trotzdem fliegt der Ball über mein Paddel.

Zitat von »"Florianx"«

Ich hab bei mir mal den Code geändert, damit man mit dem Mittelpunkt des Schlägers bis zum oderen und unteren Rand fahren kann

Diese Änderung sollte nicht nötig sein. Der Fehler, den du da beschreibst, ist eine Folge der unterlassenen Positionskorrektur bei der Reflektion an einer Bande.
Wenn der Ball in eine Ecke läuft kann er in einem Simulationsschritt sich sowohl über eine Bande als auch über eine Torlinie bewegen. Wenn du die von mir oben beschriebene Korrektur der Y-Position des Balls bei der Reflektion an einer Bande übernimmst, wird der Ball wieder in das Spielfeld hinein gerückt, wodurch in diesem Falle die Kollision mit dem Paddel erkannt wird.

Werbeanzeige