![]() |
Turm von Hanoi
Guten Tag ich muss ein (nicht perfektes) Spiel namens Turm von Hanoi programmieren, am besten mit Klassen , leider habe ich keine Idee wie ich es machen soll ich würde mal paar Ideen schreiben und würde mich für umsetzungen bzw Verbesserungsvorschläge sehr freuen. Ich würde die Klasse Scheiben erstellen, welche ich mit den funktionen positionen und dem Algorythmus des Programms ausstatte und dann noch die Türme damit. bei den scheiben bräuchte ich ein array, damit ich immer weiß wie viele scheiben darauf liegen . Mehr ideen hab ich leider nicht und momentan wüsste ich nicht wie ich diese Klassen dann in die andere unit implementiere. ps ich bin dankbar für alles Lösungsansätze bzw Ideen/Vörschlage:)
|
AW: Turm von Hanoi
Hallo,
ich zeige dir, wie du Klassen grundsätzlich hinbekommst. Danach ist es an dir, falls du weitere Hilfe brauchst, deinen erarbeiteten Code zu zeigen. Noch ein Tipp: mit dem goldenen Helm Icon kannst du einen Code Block ins Forum einfügen. Nehmen wir mal an, du hast eine Form Unit und willst, weil man das sinnvollerweise so macht die eigentliche Spiellogik (Geschäftslogik) in einer separaten Unit mit 1-N Klassen drin umsetzen. Dann klickst du in der Projektverwaltung dein Projekt mit der rechten Maustaste an und wähst "Neue hinzufügen">"Unit". Das erzeugt eine leere Unit. Diese unter einem sinnvollen Namen abspeichern. Du solltest dann sowas wie das haben:
Delphi-Quellcode:
Alles was du in den Interface Abschnitt schreibst kann von anderen Units,
unit HanoiLogik;
interface implementation end. welche diese Unit einbinden (also z.B. dein Hauptformular) aufgerufen werden. Die eigentliche Umsetzung ist dann zwischen Implementation und end. Nun musst du eine Klasse definieren. Deine Unit dürfte dann ca. so aussehen:
Delphi-Quellcode:
So, in diese Klasse baust du alle Felder und Methoden ein die du brauchst um
unit HanoiLogik;
interface type THanoi = class(TObject) private public end; implementation end. die Spiellogik umzusetzen. Was jemand an der Klasse aufrufen können soll, gehört nach public. Hier mal ein bisschen Testcode drin um dir den Aufruf aus dem Hauptformular zu zeigen:
Delphi-Quellcode:
So, nun wollen wir in der MainForm diese Klasse benutzen:
unit HanoiLogik;
interface type THanoi = class(TObject) private FCounter : Integer; public function GetNextCounterValue:Integer; end; implementation function THanoi.GetNextCounterValue:Integer; begin inc(FCounter); Result := Counter; end; end. 1. Die Unit HanoiLogik im Hauptformular einbinden. 2. Ein Feld von dieser Klasse definieren. 3. Ein OnCreate Event in der Form erzeugen (Form Designer!) und dort eine Objektinstanz erzeugen, die in diesem Feld gespeichert wird. 4. Ein OnClose Event in der Form erzeugen und dort die Objektinstanz freigeben. 5. Ein Label auf der Form platzieren. 6. Einen Button und für diesen einen OnClick Handler erstellen. In diesem GetNextCounterValue aufrufen und das Ergebnis auf dem Label anzeigen. Dein Hauptformular dürfte dann ungefähr so aussehen:
Delphi-Quellcode:
So, das sollte einen Start ermöglichen.
Unit Main;
uses [...was auch immer Delphi da hin gepackt hat], HanoiLogik; interface type TMainForm = class(TForm) Label1: TLabel; // möglichst besser benennen Button1: TButton; // dito. procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject); procedure ButtonClick(Sender : TObject); private FHanoiLogic:THanoi; public end; implementation procedure TMainForm.FormCreate(Sender: TObject); begin FHanoiLogic := THanoi.Create; // erzeugt die Objektinstanz end; procedure TMainForm.FormClose(Sender: TObject); begin FHanoiLogic.Free; // Aufräumen bei Programmende end; procedure TMainForm.ButtonClick(Sender : TObject); begin Label1.Caption := IntToStr(FHanoiLogic.GetNextCounterValue); end; Noch eine Frage: Welche Delphi Version benutzt du? Grüße TurboMagic |
AW: Turm von Hanoi
Also Deine Hausaufgabe macht hier niemand aber über Quelltext und fragen darüber können wir gerne sprechen.
Mein Ansatz wäre wahrscheinlich ein sehr einfacher. Hab ein Record das alles bereitstellt was ein "Stab" haben kann, sprich, was kann es empfangen und halten, in deinen fall maximal 3 verschiedene Elemente, die "Scheiben". Lege von diesen Record ein Array an für die Anzahl aller "Stäbe". Gebe dem ersten Array Element alle "Scheiben" in korrekter Reihenfolge. Mehr Logic ist eigentlich nicht von Nöten, Du musst halt nur auswerten welcher "Stab" was bereitstellt, und zwar immer nur das was "oben" liegt, sprich, das letzte element im "Stab-Record". Eine simple "bewege das letzte Element von Stab X nach Stab Y" Logik und eine simple "ist die Reihenfolge in Stab Z korrekt/erreicht" abfrage, mehr braucht man nicht. (Natürlich sollte die Logik auch eine "Existiert überhaupt eine Scheibe im Stab X" Methode bieten um festzustellen ob der gewünschte Spielzug durchgeführt werden kann) Die von mir beschriebe Vorgehensweise kannst Du natürlich in eine Klasse reinprogrammieren die dann zu jedem Zeitpunkt weiß "wo was ist". Der Klasse spendierst Du dann noch eine "Leg los"-Methode die dann die oben genannte Logik durchführt. Wie Du das ganze graphisch umsetzt ist Dir überlassen. Hier mein Einstieg, mach was draus :-D
Delphi-Quellcode:
Type
TDisks = (dNothing, dLarge, dMedium, dSmall); TRod = record Top: TDisks; Middle: TDisks; Bottom: TDisks; end; TRods = array [0..2] of TRod; |
AW: Turm von Hanoi
unit u_HanoiKlasse;
{$mode ObjFPC}{$H+} interface type TTurm= class Scheiben: array [1..n] TTurm Position : integer; uses Classes, SysUtils, Dialogs; implementation { TScheibe } end. kann ich so anfangen um die Klasse zu deklarieren oder ist hier schon ein Fehler und ich würde gerne dann noch eine Funktion erstellen wo es mir die Türme zeichnet |
AW: Turm von Hanoi
Bitte [DELPHI] ... [/DELPHI] um deinen Code drumrum. (der Knopf mit dem Römerhelm)
Was macht das USES in/unter der Klasse? Warum ist die Klassendeklaration nicht abgeschlossen? (end) Was ist n? Ich bin mir fast sicher, dass selbst im Lazarus/FreePascal beim Array das "of" fehlt. Dann fehlt mindestens noch ein ; ... |
AW: Turm von Hanoi
das ist hier eine neue Unit, und sorry nur ich bin leider nicht so gut, ich probiere mich nochmal dran, vielleicht sieht es dann ja noch besser aus.....:cry:
|
AW: Turm von Hanoi
Zitat:
|
AW: Turm von Hanoi
Hat er (sieht man nur nicht, da der CODE-Block fehlt), aber besser wird es nicht wirklich.
Zitat:
Pascal (Delphi) wurde ja mal ursprünglich als "einfachere" Sprache erfunden, um leichter zu lernen, aber ein paar Grundkenntnisse wären angebracht, sie sich vorher zu verinnerlichen, um wenigstens die Syntax erstmal zu verstehen und anwenden zu können. |
AW: Turm von Hanoi
unit u_Turm;
//Julian Lärz {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls; type { Tfrm_TurmvonHanoi } Tfrm_TurmvonHanoi = class(TForm) btn_starten: TButton; btn_schritt: TButton; btn_schliessen: TButton; Shape1: TShape; procedure btn_schliessenClick(Sender: TObject); procedure btn_startenClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormPaint(Sender: TObject); private public end; var frm_TurmvonHanoi: Tfrm_TurmvonHanoi; vAnzahlscheiben:integer; implementation {$R *.lfm} { Tfrm_TurmvonHanoi } procedure Tfrm_TurmvonHanoi.btn_startenClick(Sender: TObject); var i: Integer; x, y, size: Integer; shape: TShape; begin //zeichnen von Türmen vAnzahlscheiben:= strtoint(Inputbox('Eingabe der Scheiben', 'Gib die Anzahl der Scheiben von Hanoi ein!','')); // Aufruf zum eingeben der zu zeichnenden Scheiben // Setze die Anfangskoordinaten und Größe der Vierecke x := 50; y := 50; size := 30; for i := 1 to vAnzahlscheiben do begin // Erstelle ein neues TShape shape := TShape.Create(Self); shape.Parent := frm_TurmvonHanoi; // Setze die Eigenschaften des TShape shape.Shape := stRectangle; shape.Left := x; shape.Top := y; shape.Width := size; shape.Height := size; shape.Brush.Color := clLime; // Farbe nach Bedarf anpassen // Beschrifte das Viereck mit einem Namen shape.Name := 'Rectangle' + IntToStr(i); shape.Caption := 'Viereck ' + IntToStr(i); // Passe die Koordinaten für das nächste Viereck an x := x + size + 5; end; end; procedure Tfrm_TurmvonHanoi.FormCreate(Sender: TObject); begin end; procedure Tfrm_TurmvonHanoi.FormPaint(Sender: TObject); // in form paint geschrieben, damit keine fehler auftreten und damit ich 2 Ebenen habe und nicht mmeine türme beeinflussen begin Canvas.Brush.Color := clBlue; // Farbe für die Türme Canvas.Pen.Color := clBlack; // Farbe für die Konturen // Erster Turm Canvas.Rectangle(150, 50, 200, 400); // Zweiter Turm Canvas.Rectangle(450, 50, 500, 400); // Dritter Turm Canvas.Rectangle(750, 50, 800, 400); // Erster Turm Canvas.Brush.Color := clWhite; // Farbe für den Text Canvas.TextOut(175, 420, 'A'); // Zweiter Turm Canvas.TextOut(475, 420, 'B'); // Dritter Turm Canvas.TextOut(775, 420, 'C'); end; procedure Tfrm_TurmvonHanoi.btn_schliessenClick(Sender: TObject); begin close; end; end. hier wäre ein neuer quellcode, der erzeugt jetzt immerhin die grafischen sachen, jetzt geht es aber noch um das sortieren und die positionen der shapes, wie könnte ich jetzt hier weiter vorgehen, die andere Variante war mir dann doch leider zu kompliziert |
AW: Turm von Hanoi
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:08 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