![]() |
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 |
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. |
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. |
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
|
Re: Labyrinth darstellen
sollte man aus performencegründen zum zeichnen nicht lieber scanlines verwenden ?
|
Re: Labyrinth darstellen
Delphi-Quellcode:
;)
SleepyMaster<>Performence
|
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?
|
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. |
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:
[edit=r_kerber]Delphi-Tags korrigiert. Mfg, r_kerber[/edit]
for <Panels 1-2500> do
begin bla; blubb; bla; end; |
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. |
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