AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Springerproblem

Ein Thema von Nina1310 · begonnen am 2. Jan 2006 · letzter Beitrag vom 3. Jan 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Springerproblem

  Alt 2. Jan 2006, 10:57
nach ein paar Stunden Schlaf hab ich mir das mit der Verwendung des Strings mal überlegt und verworfen. Und dafür wie in der Aufgabe beschrieben ("wenn ein Feld nicht mehr zu erreichen ist soll der letzten Schritt abgebrochen werden") wird der letzte Schritt rückgängig gemacht wenn die folgeschritte nicht möglich sind.

Hier nun der neue Quelltext:
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TSchachFeld = Array[1..5,1..5] of Byte;

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    function FSetPosTo(ACurPos: TPoint; var AFields: TSchachFeld; ADirection: Byte; AStep: Byte): Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function TForm1.FSetPosTo(ACurPos: TPoint; var AFields: TSchachFeld; ADirection: Byte; AStep: Byte): Boolean;
var LNewPos: TPoint;
    LCount: Integer;
begin
  //ADirection ist die Variante/Richtung in die wir den Springer setzen
  //Anhand der aktuellen Position und der Richtung(ADirection) berechnen wir wo der Springer nach dem Zug dann ist
  case ADirection of
   //2 hoch und 1 links
   0: LNewPos := Point(ACurPos.X - 1, ACurPos.Y - 2);
   //2 hoch und 1 rechts
   1: LNewPos := Point(ACurPos.X + 1, ACurPos.Y - 2);
   //2 rechts und 1 hoch
   2: LNewPos := Point(ACurPos.X + 2, ACurPos.Y - 1);
   //2 rechts und 1 runter
   3: LNewPos := Point(ACurPos.X + 2, ACurPos.Y + 1);
   //2 runter und 1 rechts
   4: LNewPos := Point(ACurPos.X + 1, ACurPos.Y + 2);
   //2 runter und 1 links
   5: LNewPos := Point(ACurPos.X - 1, ACurPos.Y + 2);
   //2 links und 1 runter
   6: LNewPos := Point(ACurPos.X - 2, ACurPos.Y + 1);
   //2 links und 1 hoch
   7: LNewPos := Point(ACurPos.X - 2, ACurPos.Y - 1);
  end;

  //In LNewPos ist jetzt die Position wo der Springer sein würde wenn wir den Zug durchführen
  //Wenn die neue Position innerhalb des Spielfeldes ist und wir auf diesem Spielfeld noch nicht waren dann gehts weiter
  if (LNewPos.X > 0) and (LNewPos.Y > 0) and (LNewPos.X < 6) and (LNewPos.Y < 6) and (AFields[LNewPos.X, LNewPos.Y] = 0) then
  begin
    AFields[LNewPos.X, LNewPos.Y] := AStep;
    //Wenn dies der letzte zug war (25te) und somit kein weiteres Feld mehr unbenutzt ist geben wir "Erfolg" zurück
    if AStep = 5 * 5 then
      result := True
    else begin
      //der aktuelle Spielzug war erfolgreich, jetzt kommt die Rekursion ins Spiel
      LCount := 0;
      repeat
        //Wir probieren von dem Feld aus wo sich der Springer jetzt befindet wieder alle möglichen Spielzüge aus bis ein Spielzug erfolgreich war (und somit auch die folgenden (reskursion)) oder bis es keinen alternativen Spielzug mehr gibt
        result := FSetPosTo(LNewPos, AFields, LCount, AStep + 1);
        //Spielzugvariante incrementieren
        inc(LCount);
      until (LCount = 8) or result;
      //Wenn kein weiterer Zug erfolgreich war machen wir den Zug rückgängig
      if not(Result) then
        AFields[LNewPos.X, LNewPos.Y] := 0;
    end;
  end else //Wenn die berechnete neue Position außerhalb des Spielfeldes liegt oder schon mal besucht wurde gehts nicht weiter
    result := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var LCountX, LCountY: Integer; //Count-Zählvariblen für Schleifen
    LAusgabe: String;
    LStartPos: TPoint; //Startposition wo Springer sich am Anfang befindet
    LFields: TSchachFeld;
    LRes: Boolean;
begin
  //Alle Felder des Spielfeldes mit 0 beschreiben (0 = unbetreten)
  FillChar(LFields, 5 * 5, 0);
  //Hier legen wir fest wo der Springer am Anfang steht
  LStartPos := Point(1, 1);
  //Und jetzt tragen wir das noch auf dem Spielfeld ein. Feld X=1 Y=1 bekommt also den Wert 1 was bedeutet das dieses Feld im ersten Schritt betreten wurde
  LFields[LStartPos.X, LStartPos.Y] := 1;

  //LCount steht für die verschiedenen Spielzüge (man könnte auch ein enumerationtyp nutzen)
  //0 = 2 hoch und 1 links
  //1 = 2 hoch und 1 rechts
  //2 = 2 rechts und 1 hoch
  //3 = 2 rechts und 1 runter
  //4 = 2 runter und 1 rechts
  //5 = 2 runter und 1 links
  //6 = 2 links und 1 runter
  //7 = 2 links und 1 hoch
  LCountX := 0;
  repeat
    //Versuchen den Springer in die Richtung zu setzen, anschließend steht in LRes obs geklappt hat
    LRes := FSetPosTo(LStartPos, LFields, LCountX, 2);
    //nächste Richtung in die wir den Spielzug probieren wollen
    inc(LCountX)
  //die Schleife wird solange ausgeführt bis der Spielzug erfolgreich war oder keine Spielzugvariante weiter vorhanden ist die wir probieren könnten
  until (LCountX = 8) or LRes;

  if LRes then
  begin
    LAusgabe := '----------------'#13#10;
    //Y
    for LCountY := 1 to 5 do
    begin
      //X
      LAusgabe := LAusgabe + '|';
      for LCountX := 1 to 5 do
        LAusgabe := LAusgabe + FormatFloat('00', LFields[LCountX, LCountY]) + '|';
      LAusgabe := LAusgabe + #13#10 + '----------------' + #13#10;
    end;
    Label1.WordWrap := True;
    Label1.Font.Name := 'Courier New';
    Label1.Caption := LAusgabe;
  end else
    ShowMessage('Mit dieser Startposition war es nicht möglich mit nur einem Bereten je Feld alle Felder zu betreten.');
end;

end.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Nina1310
(Gast)

n/a Beiträge
 
#12

Re: Springerproblem

  Alt 2. Jan 2006, 21:46
Hab jetzt ein StringGrid ein Label und einen Button auf das Form gestellt und deinen Quellcode kopiert.Wenn ich es laufen lassen will, kommt folgende Meldung: Im Projekt Project1.exe ist eine Exception der Klasse EClassNotFound aufgetreten. Meldung: 'Klasse TSringGrid nicht gefunden' , Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.

Was genau will mir das jetzt sagen und was muss ich ändern?
Lieber Gruß
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#13

Re: Springerproblem

  Alt 2. Jan 2006, 21:54
Was genau hast du gemacht? Ich habe eine Vermutung, behalte sie aber vorerst für mich, da das bei mir einwandfrei läuft.

Anbei SirThornberrys Code als Projekt, damit du nicht ganz auf dem Trockenen sitzt.
Angehängte Dateien
Dateityp: zip springer_177.zip (3,1 KB, 40x aufgerufen)
  Mit Zitat antworten Zitat
Nina1310
(Gast)

n/a Beiträge
 
#14

Re: Springerproblem

  Alt 3. Jan 2006, 01:23
Schonmal gut,dass es läuft und dass die Lösungen angezeigt werden. Aber ich glauibe da muss noch etwas optisches getan werden. ich hänge als Bsp. mal das von meinem Informatiklehrer dran. Unsere Arbeit soll natürlich nicht so perfekt werden.
Lieber Gruß Yanina
Angehängte Dateien
Dateityp: exe sp_499.exe (524,5 KB, 46x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Springerproblem

  Alt 3. Jan 2006, 01:31
Also so langsam hört es aber auf. Hier wurden dir schon deine kompletten Hausaufgaben gemacht. Es dürfte nicht zu viel verlangt sein, wenn du wemfalls etwas selber machst, nämlich den einfachen Teil mit der Darstellung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Nina1310
(Gast)

n/a Beiträge
 
#16

Re: Springerproblem

  Alt 3. Jan 2006, 02:13
du hast ja recht, aber wie gesagt bin ich Anfänger und kriege ne bessere Darstellung alleine nicht hin!woher soll ich das können,wenn ich es noch nie beigebracht bekommen habe? wir kriegen ein programm in 5minuten vorgetippt und sollen es dann können,da ist nix mit erklärungen!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Springerproblem

  Alt 3. Jan 2006, 09:54
Dann wendet euch an euren Lehrer, dass da wohl was falsch läuft im Unterricht. Sei froh, dass du einen weiblichen nick hast, sonst wären die hier bestimmt nicht so hilfsbereit gewesen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#18

Re: Springerproblem

  Alt 3. Jan 2006, 10:37
Die eine EXE funzt nicht ganz: E6 (8x8) -> Endlosschleife
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#19

Re: Springerproblem

  Alt 3. Jan 2006, 13:04
Zitat von Luckie:
Sei froh, dass du einen weiblichen nick hast, sonst wären die hier bestimmt nicht so hilfsbereit gewesen.
Hör' ich da einen leisen Vorwurf?
  Mit Zitat antworten Zitat
Nina1310
(Gast)

n/a Beiträge
 
#20

Re: Springerproblem

  Alt 3. Jan 2006, 13:27
Dieses Programm ist leider mehr als nur eine Hausaufgabe,es ist eine Hausarbeit, die mir 50% meiner Zeugnisnote ausmachen!
Ansonsten würde ich mir da auch nicht so einen Stress machen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 12:13 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