AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Anfängerhilfe Labyrinth
Thema durchsuchen
Ansicht
Themen-Optionen

Anfängerhilfe Labyrinth

Ein Thema von skaot · begonnen am 19. Nov 2008 · letzter Beitrag vom 21. Nov 2008
Antwort Antwort
Seite 1 von 2  1 2      
skaot

Registriert seit: 18. Nov 2008
8 Beiträge
 
#1

Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 14:49
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 = 'sthen
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 = 'dthen
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 = 'athen
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 = 'wthen
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]
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 15:07
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:
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);

Begin
  dicke := 20;

  If key = 'sThen Begin
    form1.Refresh;
    y := y + 5;
  End;

  If key = 'dThen Begin
    form1.Refresh;
    x := x + 5;
  End;

  If key = 'aThen Begin
    form1.Refresh;
    x := x - 5;
  End;

  If key = 'wThen 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;
bei diesem Code ist die Semantik die selbe wie bei deinem, nur ist der Code deutlich kürzer.

und zu guter letzt ein Hinweis auf deine Lösung :

Delphi-Quellcode:
Procedure TForm1.FormKeyPress(Sender: TObject; Var Key: Char);

Begin
  dicke := 20;

  If key = 'sThen Begin
    form1.Refresh;
    y := y + 5;
  End;

  If key = 'dThen Begin
    form1.Refresh;
    x := x + 5;
  End;

  If key = 'aThen Begin
    form1.Refresh;
    x := x - 5;
  End;

  If key = 'wThen 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;
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
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
skaot

Registriert seit: 18. Nov 2008
8 Beiträge
 
#3

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 15:21
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.
  Mit Zitat antworten Zitat
Noedel

Registriert seit: 7. Aug 2008
204 Beiträge
 
Delphi 7 Professional
 
#4

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 15:43
bei corpsman hat sich leider n kleiner fehler eingeschlichen
  If y > width - dicke Then y := height - dicke; (findest du ziemlich weit unten im zweiten sourcecode.)

das muss ersetzt werden durch
  If y > height - dicke Then y := height - dicke; damit läuft die kugel nicht mehr nach unten raus

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

 If (x+imkugel.width) > (width - dicke) Then x := width - dicke;
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 15:51
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.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
skaot

Registriert seit: 18. Nov 2008
8 Beiträge
 
#6

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 16:37
Danke habs jetzt glaube ich .

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 = 'sthen begin // Bewegung nach unten
    form1.Refresh;
    y := y+10;
  end;


  if key = 'dthen begin // Bewegung nach rechts
    form1.Refresh;
  x := x+10;
  end;


  if key = 'athen begin // Bewegung nach links
    form1.Refresh;
    x := x-10;
  end;

  if key = 'wthen 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.
  Mit Zitat antworten Zitat
skaot

Registriert seit: 18. Nov 2008
8 Beiträge
 
#7

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 17:22
Hab noch ne kleine Änderung gemacht aus den canvas.moveto und canvas.lineto hab ich canvas.rectangle gemacht.
Kann man irgendetwie das Flackern verhindern?
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#8

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 17:34
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:
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;
Dann flackert nichts mehr.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 17:36
Noch etws kürzer und übersichtlicher ...
Delphi-Quellcode:
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 = 'sthen Inc( y, Step ); // Bewegung nach unten
  if key = 'dthen Inc( x, Step ); // Bewegung nach rechts
  if key = 'athen Inc( x, -Step ); // Bewegung nach links
  if key = 'wthen Inc( y, -Step ); // Bewegung nach oben

  // der rest bleibt wie gehabt
cu

Oliver

@Corpsman: genau
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
skaot

Registriert seit: 18. Nov 2008
8 Beiträge
 
#10

Re: Anfängerhilfe Labyrinth

  Alt 19. Nov 2008, 17:56
Zitat von Corpsman:


Delphi-Quellcode:
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;
Dann flackert nichts mehr.
Mhh das sagt der mir was vonwegen Zugriffsverletzung.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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