![]() |
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 :) . |
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:
Man kann das noch verfeinern, wenn man zusätzlich zur Zufallsrichtung noch zufällig die Anzahl der max. Schritte (zwischen 2 und 10) festlegt.
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; Jeder Geist zählt dann die Schritte runter bis auf 0 (falls er nicht vorher auf Hindernis drauf) und bekommt dann eine neue Richtung. |
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).
|
Re: Pacman
Ist es jetzt schon zu spät??
Egal, wir haben das letztens im Unterricht mit Java folgendermaßen gelöst:
Delphi-Quellcode:
So hast du jedenfalls schonmal eine Überprüfung, ob eine Wand an der Position ist, bevor der Geist da hin läuft
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; ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz