A Alpha II Medlem sedan maj 2000 2 993 inlägg Frågan 28 apr. 2002 17:24 #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
P PeW Medlem sedan juni 2000 10 432 inlägg 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 ;)
A Alpha II Medlem sedan maj 2000 2 993 inlägg Fattar ändå inte hur jag ska göra... det här var ju krångligt...
P PeW Medlem sedan juni 2000 10 432 inlägg 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.
A Alpha II Medlem sedan maj 2000 2 993 inlägg Har du lust att förklara vad en algoritm är ;)
A Alpha II Medlem sedan maj 2000 2 993 inlägg 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;
P PeW Medlem sedan juni 2000 10 432 inlägg
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. :)
A Alpha II Medlem sedan maj 2000 2 993 inlägg Varför fungerar inte det här?
moves := round( ( clientWidth - 80 ) - ( TBallSprite(Ball).X - 40 ) div TBallSprite(Ball).velX);
A Alpha II Medlem sedan maj 2000 2 993 inlägg Kom på att div använbdes för integer och / för real
A Alpha II Medlem sedan maj 2000 2 993 inlägg 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