webForumDet fria alternativet

Skapa AI till ett pong spel

Programmering

10 svar · 333 visningar · startad av Alpha II

Medlem sedan maj 20002 993 inlägg
Frågan#1

Kanske inte kallas AI i så simpla spel. men men

Jag har lyckats göra två datorspelare, den ena är totalt omöjlig at vinna över och den andra är lika dålig som en 3 åring...

Hur ska man göra för att den ska tänka ungefär vart bollen kommer att vara när den är framme vid paddeln?

tacksam för svar

Medlem sedan maj 20002 993 inlägg
#2

Ingen som vet?! :(

Medlem sedan juni 200010 432 inlägg
#3

http://www.ai.mit.edu/ :)

Men denna kanske är mer i din smak ->
http://www.gamedev.net/reference/list.asp?categoryid=18

Hur du än gör behöver du ju bygga lite algoritmer och dessa kan du nog hitta i ovan länkar ;)

Medlem sedan maj 20002 993 inlägg
#4

Fattar ändå inte hur jag ska göra... det här var ju krångligt...

Medlem sedan juni 200010 432 inlägg
#5

Om du vill kolla in AI är de länkarna ett gott uppslag att börja rota i. Det är ju trots allt bara algoritmer och du behöver knappast sätta igång med programspråket prolog för att göra en "AI"-funktionalitet i ditt pongspel.

Medlem sedan maj 20002 993 inlägg
#6

Har du lust att förklara vad en algoritm är ;)

Medlem sedan maj 20002 993 inlägg
#7

Lyckades göra en någorlunda bra motspelare nu :) *yippie*

Men om bollen studsar många gånger på väggarna (typ 2 eller mer... ) så missar den... den har alltså kass precision...

Hur får jag den bättre?

procedure TMain.FindPosition;
var
  moves: integer;
  i: integer;
  aiPosY: double;
  aiVelY: double;
begin
    if ( TBallSprite(Ball).velX > 0 ) then begin
      moves := ( ( clientWidth - 80 ) - ( round(TBallSprite(Ball).X) - 40 ) ) div round(TBallSprite(Ball).velX);
      aiPosY := TBallSprite(Ball).Y;
      aiVelY := TBallSprite(Ball).velY;
      for i := 0 to  moves do begin
        if ( aiPosY < 0 ) then aiVelY := ( aiVelY - ( aiVelY * 2 ) );
        if ( aiPosY > clientHeight - TBallSprite(Ball).Height ) then aiVelY := -aiVelY;
        aiPosY := aiPosY + aiVelY;
      end;
      TPaddleSprite(player_2).targetPos := round(aiPosY) - ( TPaddleSprite(player_2).Height div 2 );
    end;

end;
Medlem sedan juni 200010 432 inlägg
#8

Har du lust att förklara vad en algoritm är

Din procedur här ovan är ju en sån ;)

Hur får jag den bättre?

Förmodligen blir det nåt avrundningsfel som växer. Prova att köra med större datatyper (extended?) eller ta fram en exaktare beräkning. :)

Medlem sedan maj 20002 993 inlägg
#9

Varför fungerar inte det här?

      moves := round( ( clientWidth - 80 ) - ( TBallSprite(Ball).X - 40 ) div TBallSprite(Ball).velX);
Medlem sedan maj 20002 993 inlägg
#10

Kom på att div använbdes för integer och / för real

Medlem sedan maj 20002 993 inlägg
#11

Nu står det

      moves := round( ( ( clientWidth - 80 ) - ( TBallSprite(Ball).X - 40 ) ) / TBallSprite(Ball).velX);

Nu har jag lyckats... men den är ju helt omöjlig att vinna över! Körde ett tag och det slutade 20 - 0 till datorn :o

273 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)