![]() |
Anfängerhilfe Labyrinth
So als aller erstes bin blutiger Anfänger. Ich würde gerne ein kleines Labyrinth programieren, also das man mit den Tasten wasd eine Kugel bewegt, welche sobald eine Wand im weg ist sich nicht weiter bewegt.
So weit bin ich.
Delphi-Quellcode:
unit Pong;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; procedure FormKeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; dicke, x, y: integer; implementation {$R *.dfm} procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin dicke := 20; if key = 's' then begin form1.Refresh; y := y+5; canvas.brush.color := clnavy; canvas.ellipse (x,y,x+dicke,y+dicke); canvas.MoveTo(50,0); canvas.lineto(50,350); canvas.MoveTo(50,400); canvas.lineto(50,500); label1.Caption := inttostr(x); label2.caption := inttostr(y); end; if key = 'd' then begin form1.Refresh; x := x+5; canvas.brush.color := clnavy; canvas.ellipse (x,y,x+dicke,y+dicke); canvas.MoveTo(50,0); canvas.lineto(50,350); canvas.MoveTo(50,400); canvas.lineto(50,500); label1.Caption := inttostr(x); label2.caption := inttostr(y); if (x > 30) and (x < 50) then end; if key = 'a' then begin form1.Refresh; x := x-5; canvas.brush.color := clnavy; canvas.ellipse (x,y,x+dicke,y+dicke); canvas.MoveTo(50,0); canvas.lineto(50,350); canvas.MoveTo(50,400); canvas.lineto(50,500); label1.Caption := inttostr(x); label2.caption := inttostr(y); end; if key = 'w' then begin form1.Refresh; y := y-5; canvas.brush.color := clnavy; canvas.ellipse (x,y,x+dicke,y+dicke); canvas.MoveTo(50,0); canvas.lineto(50,350); canvas.MoveTo(50,400); canvas.lineto(50,500); label1.Caption := inttostr(x); label2.caption := inttostr(y); end end; end. Könnte sein das noch ein paar unsinnige Sachen drin sind, wie gesagt totaler Anfänger. [edit=Sharky]Delphi-Tags gesetzt. Mfg, Sharky[/edit] |
Re: Anfängerhilfe Labyrinth
Ja man sieht das du neu bist, bitte nutze die Code Tags dann sieht das ganze schon viel Hübscher aus. ( Trotzdem Herzlich willkommen in der DP )
und dein Code könnte etwas Struktur gebrauchen.
Delphi-Quellcode:
bei diesem Code ist die Semantik die selbe wie bei deinem, nur ist der Code deutlich kürzer.
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);
Begin dicke := 20; If key = 's' Then Begin form1.Refresh; y := y + 5; End; If key = 'd' Then Begin form1.Refresh; x := x + 5; End; If key = 'a' Then Begin form1.Refresh; x := x - 5; End; If key = 'w' Then Begin form1.Refresh; y := y - 5; End; canvas.brush.color := clnavy; canvas.ellipse(x, y, x + dicke, y + dicke); canvas.MoveTo(50, 0); canvas.lineto(50, 350); canvas.MoveTo(50, 400); canvas.lineto(50, 500); label1.Caption := inttostr(x); label2.caption := inttostr(y); End; und zu guter letzt ein Hinweis auf deine Lösung :
Delphi-Quellcode:
Dieser Teil beschränkt das Feld deiner "Kugel" auf die Form und man kann nicht mehr raus laufen, evtl hilft dir das schon ein bischen weiter ;)
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);
Begin dicke := 20; If key = 's' Then Begin form1.Refresh; y := y + 5; End; If key = 'd' Then Begin form1.Refresh; x := x + 5; End; If key = 'a' Then Begin form1.Refresh; x := x - 5; End; If key = 'w' Then Begin form1.Refresh; y := y - 5; End; If x < 0 Then x := 0; If x > width - dicke Then x := width - dicke; If y < 0 Then y := 0; If y > width - dicke Then y := height - dicke; canvas.brush.color := clnavy; canvas.ellipse(x, y, x + dicke, y + dicke); canvas.MoveTo(50, 0); canvas.lineto(50, 350); canvas.MoveTo(50, 400); canvas.lineto(50, 500); label1.Caption := inttostr(x); label2.caption := inttostr(y); End; |
Re: Anfängerhilfe Labyrinth
Danke für die schnelle antwort. Ich werde in Zukunft drauf achten.
Deine Hilfe hilft soweit, dass man nichtmehr links oder oben aus dem Bild herausaufen kann. Rechts ann man noch soweit das man noch die hälfte der Kugel sieht und unten kann man soweit herauslaufen wie man will. |
Re: Anfängerhilfe Labyrinth
bei corpsman hat sich leider n kleiner fehler eingeschlichen
Delphi-Quellcode:
(findest du ziemlich weit unten im zweiten sourcecode.)
If y > width - dicke Then y := height - dicke;
das muss ersetzt werden durch
Delphi-Quellcode:
damit läuft die kugel nicht mehr nach unten raus :)
If y > height - dicke Then y := height - dicke;
dass die kugel n stück nach rechts aus dem feld flutscht, leigt daran, dass "x" wohl imkugel.left ist, oder?! dann füg doch hier noch ein
Delphi-Quellcode:
If (x+imkugel.width) > (width - dicke) Then x := width - dicke;
|
Re: Anfängerhilfe Labyrinth
lol die Copy Paste Fehler.
das "Rauslaufen" liegt an was anderem. du darfst nicht Widht und Height nehmen sondern must ClientWidth und ClientHeigt stattdessen nehmen. Dann müste es stimmen. |
Re: Anfängerhilfe Labyrinth
Danke habs jetzt glaube ich :-D .
Hier mein Fertiger Quellcode
Delphi-Quellcode:
unit Pong;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Label3: TLabel; procedure FormKeyPress(Sender: TObject; var Key: Char); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; dicke, x, y: integer; implementation {$R *.dfm} procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char); begin dicke := 20; if key = 's' then begin // Bewegung nach unten form1.Refresh; y := y+10; end; if key = 'd' then begin // Bewegung nach rechts form1.Refresh; x := x+10; end; if key = 'a' then begin // Bewegung nach links form1.Refresh; x := x-10; end; if key = 'w' then begin // Bewegung nach oben form1.Refresh; y := y-10; end; If x < 0 Then x := 0; // Spielfeldbegrenzungen If x > clientwidth - dicke Then x := clientwidth - dicke; If y < 0 Then y := 0; If y > clientheight - dicke Then y := clientheight- dicke; if (x = 40) and ((y < 350) or (y > 380)) then x := 30; // Stoppen des Balles an Barikaden if (x = 90) and ((y < 50) or (y > 80)) then x := 80; if (x = 140) and ((y < 200) or (y > 230)) then x := 130; if (x = 190) and ((y < 400) or (y > 430)) then x := 180; if ((x > 380) and (x < 450)) and ((y > 180) and (y < 250)) then Label3.Caption := 'sieger'; // Betreten des Zielfeldes canvas.MoveTo(50,0); // Barrikaden canvas.lineto(50,350); canvas.MoveTo(50,400); canvas.lineto(50,clientheight); canvas.moveto(100,0); canvas.LineTo(100,50); canvas.moveto(100,100); canvas.Lineto(100,clientheight); canvas.moveto(150,0); canvas.LineTo(150,200); canvas.moveto(150,250); canvas.Lineto(150,clientheight); canvas.moveto(200,0); canvas.LineTo(200,400); canvas.moveto(200,450); canvas.Lineto(200,clientheight); canvas.Brush.Color := clgreen; // Zielfeld canvas.Rectangle(400,200,450,250); label1.Caption := inttostr(x); // Punktkoordinaten label2.caption := inttostr(y); canvas.brush.color := clnavy; // Kugel canvas.ellipse (x,y,x+dicke,y+dicke) end; end. |
Re: Anfängerhilfe Labyrinth
Hab noch ne kleine Änderung gemacht aus den canvas.moveto und canvas.lineto hab ich canvas.rectangle gemacht.
Kann man irgendetwie das Flackern verhindern? |
Re: Anfängerhilfe Labyrinth
Ja kannst du,
in meiner ursprünglichen Verbesserung sollte das Form1.refresh sowieso raus. Wenn du es aber ganz richtig machen willst machst du es Double Buffered. Dazu gehst du her und nimmst ein TBitmap das du immer genau gleich groß hälst wie deine Form. und am Anfang vom OnKey machst du dann was in der Art :
Delphi-Quellcode:
Dann flackert nichts mehr.
var b:Tbitmap;
Procedure Tform1.OnKeyIrgendwas(..); begin b.canvas.rectangle(-1,-1,clientwidth+1,clientheight+1); with b.canvas do begin (* Der Ganze Alte Code *) // Am Schluss form1.canvas.draw(0,0,b); end; |
Re: Anfängerhilfe Labyrinth
Noch etws kürzer und übersichtlicher ...
Delphi-Quellcode:
cu
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
const Step = 10; begin dicke := 20; // Auf dem Form hat sich bis hier nix geändert, also form1.Refresh; // <--- ist das wirklich notwendig? // es geht noch kürzer if key = 's' then Inc( y, Step ); // Bewegung nach unten if key = 'd' then Inc( x, Step ); // Bewegung nach rechts if key = 'a' then Inc( x, -Step ); // Bewegung nach links if key = 'w' then Inc( y, -Step ); // Bewegung nach oben // der rest bleibt wie gehabt Oliver @Corpsman: genau |
Re: Anfängerhilfe Labyrinth
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 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