Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Labyrinth (https://www.delphipraxis.net/111157-labyrinth.html)

Sandro 30. Mär 2008 19:18


Labyrinth
 
Guten Abend.

Ich habe hier ein Delphi Programm das leider nicht genau das macht was es eigl. soll.
Ziel ist es dass die Maus durch ein Labyrith zum Käse läuft.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TSpielfeld = class(TForm)
    Timer1: TTimer;
    Bild: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);

  end;
     type tBall=class x,y,vx,vy,r: Single;
   farbe : tColor;
   procedure Init(fNeu: tColor;
   xNeu,yNeu,vxNeu,vyNeu,rNeu: Single);
   procedure ZeigeDich;
   procedure BewegeDich;
   end;


var
  Spielfeld: TSpielfeld;
  ball1 : tBall;
  ball2 : tBall;
  bild : tImage;


implementation

{$R *.dfm}
 procedure tBall.Init(fNeu: tColor;
xNeu,yNeu,vxNeu,vyNeu,rNeu: Single);
begin
farbe:= fNeu;
r := rNeu;
x := xNeu;
y := yNeu;
vx := vxNeu;
vy := vyNeu;
end;



procedure tBall.ZeigeDich;
begin
with Spielfeld.Bild.Canvas do
begin
Brush.color := Farbe;
ellipse(Round(x-r),Round(y-r),Round(x+r),Round(y+r))
end;
end;

procedure tBall.BewegeDich;
begin
x := x + vx; y := y + vy;
with Spielfeld.Bild do
begin
if (x >Width-r-50) then
begin x := Width-r-50; vx := 0 end;
if x < r + 50 then
begin x := r + 50; vx := 0 end;
if (y >Height-r - 50) then
begin y := Height-r - 50; vy := 0 end;
if y < r + 120 then
begin y := r + 120; vy := 0 end;
end
end;

procedure TSpielfeld.FormCreate(Sender: TObject);
var x,y,vx,vy: single;
begin

with Bild.Canvas do
begin
pen.width := 2;
Brush.Color := clwhite;
Rectangle(0,0,Bild.Width,Bild.Height);
pen.width := 2;
brush.Style := bsSolid;
pen.Mode := pmNOTXOR;
end;

Ball1.init(clred,210,
                30,
                5,0,4);
Ball1.ZeigeDich;
repeat x:= Random(Spielfeld.Bild.width-50)+25;
       y:=Random(Spielfeld.Bild.Height-50)+25;
       until sqrt(sqr(x-Ball1.x)+sqr(y-Ball1.y))>=8;
       Ball2.Init(clyellow,260,270,0,0,4);
       Ball2.ZeigeDich;
end;



procedure nachlinks;
begin
if ball1.vx=0
then begin
if Bild.Canvas.Pixels[Round(ball1.x),Round(ball1.y+ball1.r+1)]=clblack
then begin
if (ball1.vx=0)and (ball1.vy>0)
then begin
ball1.vx:=5;
ball1.vy:=0;
end
else if (ball1.vx=0)and (ball1.vy<0)
then begin
ball1.vx:=-5;
ball1.vy:=0;
end
else if (ball1.vx<0)and (ball1.vy=0)
then begin
ball1.vx:=0;
ball1.vy:=5;
end
else if (ball1.vx>0)and (ball1.vy=0)
then begin
ball1.vx:=0;
ball1.vy:=-5;
end
end
end;
if ball1.vy=0
then begin
if Bild.Canvas.Pixels[Round(ball1.x+ball1.r+1),Round(ball1.y)]=clblack
then begin
if (ball1.vx=0)and (ball1.vy>0)
then begin
ball1.vx:=5;
ball1.vy:=0;
end
else if (ball1.vx=0)and (ball1.vy<0)
then begin
ball1.vx:=-5;
ball1.vy:=0;
end
else if (ball1.vx<0)and (ball1.vy=0)
then begin
ball1.vx:=0;
ball1.vy:=5;
end
else if (ball1.vx>0)and (ball1.vy=0)
then begin
ball1.vx:=0;
ball1.vy:=-5;
end
end
end;
end;

procedure TSpielfeld.Timer1Timer(Sender: TObject);
begin
Ball1.ZeigeDich; Ball2.ZeigeDich;
nachlinks;
Ball1.BewegeDich; Ball2.BewegeDich;
Ball1.ZeigeDich; Ball2.ZeigeDich;
end;
Initialization
Randomize;
Ball1 := tBall.Create;
Ball2 := tBall.Create;
Finalization
Ball1.Destroy;
Ball2.Destroy;



end.
Bin für jede Hilfe dankbar.

Gruß
Alida

Fussball-Robby 30. Mär 2008 19:20

Re: Labyrinth
 
Hey, herzlich Willkommen in der DP :dp:
Was genau läuft denn falsch?

Mfg

Sandro 30. Mär 2008 20:04

Re: Labyrinth
 
Da ist sowas wie eine Entlosschleife drine.
Sobald man dann die EXE öffnet kommen unendlich Fehlermeldungen.

Klaus01 30. Mär 2008 20:05

Re: Labyrinth
 
.. und wie lautet die Fehlermeldung welche da hochpoppen?


[edit] tBall ist bei Dir eine Klasse, was ich dann vermisse
ist irgendwo ein
Delphi-Quellcode:
Ball1:=TBall.create;
[/edit]
Grüße
Klaus

Sandro 30. Mär 2008 20:29

Re: Labyrinth
 
Meldung:
Zitat:

Zugriffsverletzung bei Adresse 004271D0 in Modul 'Project1.exe'. Lesen von Adresse 00000168.

Nuclear-Ping 30. Mär 2008 20:33

Re: Labyrinth
 
@Klaus:
Das steht im "Initialization"

@Sandro:
Was erwartest du bitte von uns? Dass hier irgendwer den Code fehlerfrei zurückpostest?

Lass dir das doch grad mal auf der Zunge zergehen: Du schreibst hier deinen ersten Beitrag und stellst dazu deinen kompletten Code rein - nicht nur relevante Stellen und dazu noch mit dieser "Formatierung", ohne genau zu sagen, was genau das Problem ist, was du probiert hast um es zu lösen und wo es hängt. Bissl viel verlangt für den Anfang, oder? *kopfschüttel*

Ausserdem sieht das Ganze auch so aus, als wüßtest du nicht wirklich, was der Code da macht, den du da produziert hast? :gruebel:

Sandro 30. Mär 2008 20:49

Re: Labyrinth
 
Leider hast du recht Nuclear-Ping.
Ich habe wirklich keine Ahnung von Delphi. :cry:
Der Code wurde von meinem Freud geschrieben und ich sollte hier nachfragen woran es liegen könnte. (Also das mit dem Fehler.)
Er kann im Moment nicht ins Internet. Und ich verstehe ja noch wenigen. :wall:

Bei dem Code handelt es sich um ein Labyrith.
Dort soll eine "Maus" von einem Ende zum "Käse" am anderen Ende "laufen.
Dabei sollte sie möglichst nicht den weißen Weg verlassen.

Evenuell ist ja einer trotzdem so nett und hilft mir/uns.

Geuß
Alida

Klaus01 30. Mär 2008 21:00

Re: Labyrinth
 
Hallo,

die Procedure nachLinks gehört nicht zur TSpielfeld.

Darum kracht es wenn Du in diese Procedure auf Bild.Canvas.Pixels zugreifst.
Die Procedure kennt Bild nicht.
Entweder Du packst die Procedure als Methode zu TSpielfeld oder
Du schreibst anstelle von Bild.Canvas.Picxels -> Spielfeld.Bild.Canvas.Pixels.

Grüße
Klaus

P.S.
Einigerma0en richtig formatiert schaut die Procedure so aus:
Delphi-Quellcode:
procedure nachlinks;
begin
if ball1.vx=0 then
  begin
     if Spielfeld.Bild.Canvas.Pixels[Round(ball1.x),Round(ball1.y+ball1.r+1)]=clblack then
       begin
          if (ball1.vx=0)and (ball1.vy>0) then
            begin
              ball1.vx:=5;
              ball1.vy:=0;
            end

          else
            if (ball1.vx=0)and (ball1.vy<0) then
              begin
                ball1.vx:=-5;
                ball1.vy:=0;
              end
            else
              if (ball1.vx<0)and (ball1.vy=0) then
                begin
                  ball1.vx:=0;
                  ball1.vy:=5;
                end
              else
                if (ball1.vx>0)and (ball1.vy=0) then
                  begin
                    ball1.vx:=0;
                    ball1.vy:=-5;
                  end
       end
  end;
if ball1.vy=0 then
  begin
    if spielfeld.Bild.Canvas.Pixels[(ball1.x+ball1.r+1),(ball1.y)] = clblack then
      begin
        if (ball1.vx=0)and (ball1.vy>0) then
          begin
            ball1.vx:=5;
            ball1.vy:=0;
          end
        else
          if (ball1.vx=0)and (ball1.vy<0) then
            begin
              ball1.vx:=-5;
              ball1.vy:=0;
            end
          else
            if (ball1.vx<0)and (ball1.vy=0) then
              begin
                ball1.vx:=0;
                ball1.vy:=5;
              end
            else
              if (ball1.vx>0)and (ball1.vy=0) then
                begin
                  ball1.vx:=0;
                  ball1.vy:=-5;
                end
      end
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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