Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Labyrinth darstellen (https://www.delphipraxis.net/14410-labyrinth-darstellen.html)

GetCool 8. Jan 2004 17:44


Labyrinth darstellen
 
Hi,
möchte probieren, ein Programm zu erstellen, welches zufällig ein Labyrinth erstellt. Es soll am Rand einen Ausgang geben und in der Mitte soll eine Maus starten und alleine den Weg nach draußen finden. So viel zur Theorie. Mein Info-Lehrer hat mir diese Aufgabe gestellt und gesagt, dass noch nie einer seiner Schüler diese Aufgabe zufriedenstellend gelöst hat. Aber jetzt komm ich :mrgreen:

Falls ihr jetzt denkend solltet dass ich wieder so einer bin, der seine HA gemacht haben möchte, am besten noch mit Code, der irrt. Erstens ist es keine HA und zweitens möchte ich euch nur fragen, wie ihr das Labyrinth darstellen würdet. Es muss ziemlich groß sein und sollte eine 2D-Draufsicht darstellen. Wie würdet ihr das Labyrinth zeichnen lassen? mit Strichen die die Wände zeigen? Oder das Programm in kleine Felder einteilen und die Felder dann mit einem Bitmap füllen? Wie würdet ihr vorgehen? Hoffe ihr habt da mal eine gute Idee. Ich will keinen Designpreis gewinnen, sondern eher ein simples Labyrinth haben, welche leicht in den noch nicht vorhandenen Algorithmus eingefügt werden kann.

Thx! :-D

SleepyMaster 8. Jan 2004 18:43

Re: Labyrinth darstellen
 
OK! Das mit dem zeichnen finde ich einfach: Hier mein Code (/Idee)
Nur das erstellen von dem Labyrith is ned so einfach! (finde ich)
Wenn du also eine Lösung gefunden hast dann poste bitte den Code

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure ReDraw();
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Spielfeld: array[0..50,0..50] of integer;

implementation

{$R *.dfm}

procedure TForm1.ReDraw;
var
  x,y:longint;
  a,b:longint;
begin
for x:=0 to 50 do
  begin
  for y:=0 to 50 do
    begin
    if Spielfeld[x,y]= 1 then
      begin
      for a:=0 to 10 do
        begin
        for b:=0 to 10 do
          begin
          Image1.Canvas.Pixels[x*10+a,y*10+b]:=clred;
          end;
        end;
      end;
    if Spielfeld[x,y]= 2 then
      begin
      for a:=0 to 10 do
        begin
        for b:=0 to 10 do
          begin
          Image1.Canvas.Pixels[x*10+a,y*10+b]:=clblue;
          end;
        end;
      end;
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
randomize;
Spielfeld[random(50),random(50)]:=2;
Spielfeld[random(50),random(50)]:=1;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ReDraw;
end;

end.

GetCool 8. Jan 2004 18:50

Re: Labyrinth darstellen
 
thx, werds gleich mal ausprobieren. Das das zeichnen nicht so schwierig wird, ist mir klar, das schwierige wird der Code nachher*g* Wollte ja mal wissen wie ihr das realisieren würdet. Ich mein man kann das Problem ja sehr verschieden angehen.

Wenn ich das irgendwann fertig hab poste ich das auf jeden Fall mal.

mercanery 8. Jan 2004 18:56

Re: Labyrinth darstellen
 
ich würd die fläche des labyrinths kacheln (zb mit panels(nat. ohne rahmen...muss der User ja net sehen!) und dann an jeder seite n shape zeichnen...dann ne menge verschachtelter if...then bedingungen...FERTIG! :D

shareholder 8. Jan 2004 19:00

Re: Labyrinth darstellen
 
sollte man aus performencegründen zum zeichnen nicht lieber scanlines verwenden ?

SleepyMaster 8. Jan 2004 19:03

Re: Labyrinth darstellen
 
Delphi-Quellcode:
SleepyMaster<>Performence
;)

GetCool 8. Jan 2004 19:31

Re: Labyrinth darstellen
 
Mit den Kacheln hatte ich auch schon vor...finde das ist einfacher zu handhaben. Vor allem für die spätere Wegfindung. Als Problem seh ich hier allerdings die Perfomance. Hatte vor das Spielfeld 50x50 zu machen. Das wären dann 2.500 Panels :wall: Ich schätz einfach mal das das Programm damit nicht so irre glücklich wäre. Eine Einteilung in Kacheln wäre aber schön. Wie könnte ich das sonst noch lösen?

SleepyMaster 8. Jan 2004 19:35

Re: Labyrinth darstellen
 
Ich würds ehrlich gesagt so machen:
Das gleiche wie oben (nur en bissel überarbeitet!)

Das einzige was du machen musst ist in das array Spielfeld deine Integerwerte reinspeichern
(Das array Stellt dein Spielfeld da) und dann die procedure redraw ausführen!

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button2: TButton;
    Button1: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    Spielfeld: array[0..50,0..50] of integer;
    procedure ReDraw();
    procedure Clear();
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Clear;
var
  x,y:longint;
begin
Image1.Canvas.Brush.Color:=clwhite;
Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
for x:=0 to 50 do
  begin
  for y:=0 to 50 do
    begin
    SpielFeld[x,y]:=0;
    end;
  end;
end;

procedure TForm1.ReDraw;
var
  x,y:longint;
  a,b:longint;
begin
for x:=0 to 50 do
  begin
  for y:=0 to 50 do
    begin
    if Spielfeld[x,y]= 1 then
      begin
      Image1.Canvas.Brush.Color:=clred;
      Image1.Canvas.Rectangle(x*10,y*10,x*10+10,y*10+10);
      end;
    if Spielfeld[x,y]= 2 then
      begin
      Image1.Canvas.Brush.Color:=clblue;
      Image1.Canvas.Rectangle(x*10,y*10,x*10+10,y*10+10);
      end;
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  a,b:longint;
begin
Clear;
end;

{function ran:boolean;
begin
if random(2)= 1 then
  result := true
else result:=false;
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  I:longint;
  a,b:integer;
begin
randomize;

a:=Random(50);
b:=Random(50);

for i:=10 to 200 do
  begin
  if ran then
    if ran then
      b:=b+1
    else
      b:=b-1
  else
    if ran then
      a:=a+1
    else
      a:=a-1;
  SpielFeld[a,b]:=1;
  end;
SpielFeld[a,b]:=1;
Redraw;
end;}

end.

mercanery 8. Jan 2004 19:37

Re: Labyrinth darstellen
 
würd mich sowieso ma interessieren...:

Kann man objekte nicht in schleifen ansprechen?

Bsp: ich hab die panels 1-2500 (Panel_1,Panel_2.usw..
Delphi-Quellcode:
for <Panels 1-2500> do
begin
bla;
blubb;
bla;
end;
[edit=r_kerber]Delphi-Tags korrigiert. Mfg, r_kerber[/edit]

XeRo 8. Jan 2004 19:40

Re: Labyrinth darstellen
 
Ich würds vermutlich mit nem Array aus Bitmap im Vormat 50*50 machen und dann später einfach mit for i:= 1 to Anzahl der Felder schauen ob der nächste zug der Maus die wand rammt.

Hab schon mal ein Labyrinth gemacht(opensource), aber ohne KI, das war mir dann doch zu ...zeitaufwendig...Naje wennst das gschaft hast, kannst ja mal den prog posten


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr.
Seite 1 von 4  1 23     Letzte »    

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 by Thomas Breitkreuz