Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Pacman (https://www.delphipraxis.net/135663-pacman.html)

TheSodomizer666 15. Jun 2009 17:06


Pacman
 
Hallo erstmal..bin relativ neu hier (wie man sieht...^^") und find gut,dass es dieses Forum gibt.

Ich habe ein Problem bei meinem Pacman Spiel. Die Geister sollen sich automatisch bewegen (klappt,jedoch mit schlechten ergebnissen,weil sie sich fast nur auf einer stelle bewegen, mit random),aber sie sollten erkennen,wenn sie auf eine wand treffen. Ich habe dazu ein 2D-Array benutzt.Wäre gut,wenn ihr mir weiterhelfen könntet.
hier ein Ausschnitt aus dem Code für die Bewegung der Geister:

Code:
 procedure TForm1.Timer3Timer(Sender: TObject);
var gfeld : TPoint;
begin
 case geist1[3] of
  1:
    begin
    gfeld.X:=round((geist1[1]-10+15)/30)-1;    //[1]=x koordinate ;
    gfeld.Y:=round((geist1[2]+15)/30)-1;       //[2]=y koordinate
    if (welt[gfeld.X,gfeld.Y]<>'1') and (welt[gfeld.X,gfeld.Y]<>'4') then
    dec(geist1[1]);
    if (gfeld.X=1) and (gfeld.Y=9) then inc(geist1[1],16*30);
    end;
  2:
    begin
    gfeld.X:=round((geist1[1]+15)/30)-1;
    gfeld.Y:=round((geist1[2]-10+15)/30)-1;
    if (welt[gfeld.X,gfeld.Y]<>'1') and (welt[gfeld.X,gfeld.Y]<>'4') then
    dec(geist1[2]);
    end;
  3:
    begin
    gfeld.X:=round((geist1[1]+10+15)/30)-1;
    gfeld.Y:=round((geist1[2]+15)/30)-1;
    if (welt[gfeld.X,gfeld.Y]<>'1') and (welt[gfeld.X,gfeld.Y]<>'4') then
    inc(geist1[1]);
    if (gfeld.X=19) and (gfeld.Y=9) then dec(geist1[1],16*30);
    end;
  4:
     begin
    gfeld.X:=round((geist1[1]+15)/30)-1;
    gfeld.Y:=round((geist1[2]+10+15)/30)-1;
    if (welt[gfeld.X,gfeld.Y]<>'1') and (welt[gfeld.X,gfeld.Y]<>'4') then
    inc(geist1[2]);
    end;
 end;
 gfeld.X:=round((geist1[1]+15)/30)-1;      // Orientierung
 gfeld.Y:=round((geist1[2]+15)/30)-1;
 geist1[3]:=random(4);



danke schonmal im Vorraus :) .

shmia 15. Jun 2009 17:22

Re: Pacman
 
Deine Geister dürfen nicht bei jedem Schritt eine neue Richtung bekommen,
sondern nur wenn sie auf ein Hindernis getroffen sind.
in Pseudocode:
Delphi-Quellcode:
procedure BewegeGeist(geist);
begin
  repeat
    neuePos := BrechneNeueKoordinaten(geist.aktuellePosition, geist.Richtung);
    Wenn neuePos frei ist dann
      geist.aktuellePosition = neuePos
      ZeicheGeist(geist)
      Bewegt := True
      if neuePos = Spieler dann
         MampfMampf
    else
      geist.Richtung := zufallsrichtung
  until Bewegt;
end;
Man kann das noch verfeinern, wenn man zusätzlich zur Zufallsrichtung noch zufällig die Anzahl der max. Schritte (zwischen 2 und 10) festlegt.
Jeder Geist zählt dann die Schritte runter bis auf 0 (falls er nicht vorher auf Hindernis drauf) und bekommt dann eine neue Richtung.

TheSodomizer666 15. Jun 2009 17:52

Re: Pacman
 
ah..thx..aber wie soll ich die neue Position denn benennen?(Ich bin da ziemlich schwer von Begriff mit alldem...Ist ein Projekt,das ich morgn fertig haben muss,für die Schule).

fui-tak 16. Jun 2009 16:59

Re: Pacman
 
Ist es jetzt schon zu spät??

Egal, wir haben das letztens im Unterricht mit Java folgendermaßen gelöst:

Delphi-Quellcode:
function zugMoeglich(x,y:integer):boolean;
begin
     Result := true;
     if welt[x,y] = zahlDerWand then
           Result := false;
     if (x < 1)or(x > breiteDesSpielfeldes) then
           Result := false;
     if (y < 1)or(y > hoeheDesSpielfeldes) then
           Result := false;
end;



...
if zugMoeglich(x+1,y) then
   nachRechtsBewegen;
...
So hast du jedenfalls schonmal eine Überprüfung, ob eine Wand an der Position ist, bevor der Geist da hin läuft


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz