Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Sudoku Programm !? (https://www.delphipraxis.net/65961-sudoku-programm.html)

Christian H. 22. Mär 2006 22:02


Sudoku Programm !?
 
Bin momentan dabei im Informatik unterricht mit Hilfe von Delphi Sudoku zu programmieren allerdings bin ich mir nicht sicher ob der überlegte Ansatz umsetzbar ist !

A1 A2 A3 B1 B2 B3 C1 C2 C3
A4 ......... B4 ......... C4 .........
A7 ......... B7 ......... C7 .........

D1 D2 D3 E1 E2 E3 F1 F2 F3
D4 ......... E4 ......... F4 .........
D7 ......... E7 ......... F7 .........

G1 G2 G3 H1 H2 H3 I1 I2 I3
G4 ......... H4 ......... I4 .........
G7 ......... H7 ......... I7 .........

1. Es soll für jedes Feld (A1 - I9) ein Label erstelt werden !
2. Jedes Label wird einer Variabel zugeordnet ( Oder sollte ich lieber Arrays verwenden ?)
3. Nun soll die Überprüfung stattfinden !
Eigentlich dachte ich mir das ich zuerst in Feld A1 := eine random Zahl von 1-9 erstellen
lasse ! Dann wollte ich eine Repeat schleife benutzen , die solange A2 := random (9)+1 erstelltbis
A2 ungleich A1 ist. Für A3 sollte dann eine Repeat Schleife folgen , die sollange eine Zufallszahl
sucht , bis sie ungleich A2 und A1 ist ! Bis C5 geht dieses verfahren auch gut auch wenn es eine
menge Tipparbeit ist (Wollte es im nachinein durch eine for schleife vereinfachen) Wenn ich jetzt
allerdings bei C6 bin müsste ich solange eine random Zahl ermitteln , bis C6 ungleich C1,2,3,4,5
A4,5,6 B4,5,6 ist ! Das funktoniert allerdings nicht sobald ich den generieren Button drücke muss
ich das programm beenden

Vielleicht kann mir jemand von euch helfen ob ich mit diesen ansatz irgendwie weiterkomme ? Oder ob ich mir etwas anderes überlegen muss ! Bricht das Program an der genannten Stelle ab , weil der Rechenaufwand des Rechners zu groß ist ?? Würde mich über eine schnelle antwort freuen !

mfg

Nikolas 22. Mär 2006 22:18

Re: Sudoku Programm !?
 
Zitat:

2. Jedes Label wird einer Variabel zugeordnet ( Oder sollte ich lieber Arrays verwenden ?)
Auf keinen Fall Variablen! Du willst doch keine 81 Variablen per Hand benutzen. Nimm eher ein Array of Array of Byte.

Was willst du eigentlich erreichen? Wenn die Methode funktioniert, hast du ein komplettes Feld, mit dem man nichts mehr anfangen kann. Später bräuchtest du noch einen Code, der bestimmte Felder wieder löscht, damit der Spieler was zum Einsetzten hat.
Diese Methode wird so gut wie nie funktionieren. Der Rechenaufwand wird nicht zu hoch, sondern das Programm verfällt in eine Endlosschleife in der es versucht für ein Feld eine Zahl zu finden, was aber nicht unbedingt möglich sein muss.

Such hier mal im Forum, in letzter Zeit gabs sehr viele Sudoku-Programm, die auch funktioniert haben, vielleicht bekommst du so einen Ansatz.

Christian H. 22. Mär 2006 22:25

Re: Sudoku Programm !?
 
Ja so hatte ich mir das eigentlich gedacht vorerst ein komplett gelöstest rätsel zu erstellen und dann zahlen wieder herraus zu löschen ! Sollte ich eine Array für die kompletten 81 Felder verwenden oder lieber für ein Feld also je 9 Labels eine Array ? Danke auf jendefall werde mal gucken ob ich ein fertiges programm finde !

mfg

Nikolas 22. Mär 2006 22:35

Re: Sudoku Programm !?
 
Es ist sicher besser ein großes 9*9 array zu nehmen.
Wenn du überprüfen willst, ob in einer Zeile eine 9 vorkommt, kannst du so schreiben:
Delphi-Quellcode:
for i:=1 to 9 do
if feld[x,i]=p then bla;
Bei den kleinen müsstest du erst Identifizieren, in welchen arrays du suchen musst, und dann gleich 3 Schleifen scheiben. Und damit du nicht für jedes Feld einen eigenen COde schreiben musst,müsstest du die 9 arrays eigentlich noch in einem 3*3 Array zusammenfassen.
Also auf jeden Fall ein großes.

Light 22. Mär 2006 22:50

Re: Sudoku Programm !?
 
Hallo Christian,

ICH BIN ZU LANGSAMM GEWESEN --
die anderen waren schneller als ich *G*
ich stells trozdem rein war sonst zu viel aufwand umsonst :duck:

Formuliere doch noch mal dein Zeil was du damit erreichen willst.
- und kontrolliere nochmal dein code - ein abbruch wegen "zu hohem rechenaufwand" gibt es glaube ich so nicht!
es könnte eher sein das er sich irgendwo in einer schleife verfängt oder so -
ich würde diesen ansatz mit verschachtelten schleifen machen:
-irgendwie so ähnlich wie
Delphi-Quellcode:
//ich hab jetzt die zahlen wegen der übersichtlichkeit durch buchstaben ersetzt
VAR
Neu : Boolean;
Z : Integer;
I1, I2, I1b, I2b : Integer; //oder ähnliches
...

for I1:= a to i do
begin
  for I2:= 1 to 9 do
  begin
    //eine random zahl die noch nicht vorkamm.
    repeat
      Z := random(9)+1;
      for I1b:= a to i do
      begin
        for I2b:= 1 to 9 do
        begin
          if (Z <> "Wertearray[I1b,I2b]") then neu := true;
        end;
      end;
    until (Neu);

    "Wertearray[I1,I2]" := Z;
    Neu := false;

  end;
end;
Ich hoffe ich konnte dir weiterhelfen!
Diese methode ist bestimmt nicht leistungsorientiert -
eigentlich müsste es sich allerdings bei 81 feldern nicht so bemerkbar machen.

LG Stefan

PS: der hängt sich bestimmt in der repeat- until schleife auf weil des nie wahr werden kann oda so :gruebel:

Grishnak 23. Mär 2006 00:11

Re: Sudoku Programm !?
 
Wenn das Programm merkt, dass für ein bestimmtes Feld keine Zahl von 1 bis 9 mehr passt, dann muss es "einen Schritt" zurück gehen, im vorletzten Feld eine andere Zahl einsetzen und dann weitermachen.

Christian H. 23. Mär 2006 12:55

Re: Sudoku Programm !?
 
Danke für die vielen Informationen ! Ich poste einfach mal meinen code den ich bisher habe ! Mir ist durchaus klar , das der Code noch relativ umständlich ist ! Zwar sind mir die Grundlagen einigermassen klar (Schleifen , Arrays u.s.w) Allerindgs hatte ich mir vorgenommen das programm erstmal möglichst verständlich zu programmieren auch wenn es mehr schreibarbeit ist und dann im nachinein noch zu vereinfachen !

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

begin

  Label1.caption := IntToStr (A1);
  Label2.caption := IntToStr (A2);
  Label3.caption := IntToStr (A3);
  Label4.caption := IntToStr (A4);
  Label5.caption := IntToStr (A5);
  Label6.caption := IntToStr (A6);
  Label7.caption := IntToStr (A7);
  Label8.caption := IntToStr (A8);
  Label9.caption := IntToStr (A9);

  Label10.caption := IntToStr (B1);
  Label11.caption := IntToStr (B2);
  Label12.caption := IntToStr (B3);
  Label13.caption := IntToStr (B4);
  Label14.caption := IntToStr (B5);
  Label15.caption := IntToStr (B6);
  Label16.caption := IntToStr (B7);
  Label17.caption := IntToStr (B8);
  Label18.caption := IntToStr (B9);

  Label19.caption := IntToStr (C1);
  Label20.caption := IntToStr (C2);
  Label21.caption := IntToStr (C3);
  Label22.caption := IntToStr (C4);
  Label23.caption := IntToStr (C5);
  Label24.caption := IntToStr (C6);
  Label25.caption := IntToStr (C7);
  Label26.caption := IntToStr (C8);
  Label27.caption := IntToStr (C9);

  Label28.caption := IntToStr (D1);
  Label29.caption := IntToStr (D2);
  Label30.caption := IntToStr (D3);
  Label31.caption := IntToStr (D4);
  Label32.caption := IntToStr (D5);
  Label33.caption := IntToStr (D6);
  Label34.caption := IntToStr (D7);
  Label35.caption := IntToStr (D8);
  Label36.caption := IntToStr (D9);

  Label55.caption := IntToStr (G1);
  Label56.caption := IntToStr (G2);
  Label57.caption := IntToStr (G3);
  Label58.caption := IntToStr (G4);
  Label59.caption := IntToStr (G5);
  Label60.caption := IntToStr (G6);
  Label61.caption := IntToStr (G7);
  Label62.caption := IntToStr (G8);
  Label63.caption := IntToStr (G9);

  A1 := random (9)+1;
  begin;
  Repeat
  A2 := random (9)+1;
  Until
  A2 <> A1
  end;

  begin
  Repeat
  A3 := random (9)+1;
  Until
  (A3 <> A1) and (A3 <> A2)
  end;

  begin
  Repeat
  B1 := random (9)+1;
  Until
  (B1 <> A1) and (B1 <> A2) and (B1 <> A3)
  end;

  begin
  Repeat
  B2 := random (9)+1;
  Until
  (B2 <> A1) and (B2 <> A2) and (B2 <> A3) and (B2 <> B1)
  end;

  begin
  Repeat
  B3 := random (9)+1;
  Until
  (B3 <> A1) and (B3 <> A2) and (B3 <> A3) and (B3 <> B1) and (B3 <> B2)
  end;

  begin
  Repeat
  C1 := random (9)+1;
  Until
  (C1 <> A1) and (C1 <> A2) and (C1 <> A3) and (C1 <> B1) and (C1 <> B2) and (C1 <> B3)
  end;

  begin
  Repeat
  C2 := random (9)+1;
  Until
  (C2 <> A1) and (C2 <> A2) and (C2 <> A3) and (C2 <> B1) and (C2 <> B2) and (C2 <> B3) and (C2 <> C1)
  end;

  begin
  Repeat
  C3 := random (9)+1;
  Until
  (C3 <> A1) and (C3 <> A2) and (C3 <> A3) and (C3 <> B1) and (C3 <> B2) and (C3 <> B3) and (C3 <> C1) and (C3 <> C2)
  end;


  begin
  Repeat
  A4 := random (9)+1;
  Until
  (A4 <> A1) and (A4 <> A2) and (A4 <> A3)
  end;

  begin
  Repeat
  A5 := random (9)+1;
  Until
  (A5 <> A1) and (A5 <> A2) and (A5 <> A3) and (A5 <> A4)
  end;

  begin
  Repeat
  A6 := random (9)+1;
  Until
  (A6 <> A1) and (A6 <> A2) and (A6 <> A3) and (A6 <> A4) and (A6 <> A5)
  end;

  begin
  Repeat
  B4 := random (9)+1;
  Until
  (B4 <> A4) and (B4 <> A5) and (B4 <> A6) and (B4 <> B1) and (B4 <> B2) and (B4 <> B3)
  end;

  begin
  Repeat
  B5 := random (9)+1;
  Until
  (B5 <> A4) and (B5 <> A5) and (B5 <> A6) and (B5 <> B1) and (B5 <> B2) and (B5 <> B3) and (B5 <> B4)
  end;

  begin
  Repeat
  B6 := random (9)+1;
  Until
  (B6 <> A4) and (B6 <> A5) and (B6 <> A6) and (B6 <> B1) and (B6 <> B2) and (B6 <> B3) and (B6 <> B4) and (B6 <> B5)
  end;

  begin
  Repeat
  C4 := random (9)+1;
  Until
  (C4 <> A4) and (C4 <> A5) and (C4 <> A6) and (C4 <> B4) and (C4 <> B5) and (C4 <> B6) and (C4 <> C1) and (C4 <> C2) and (C4 <> C3)
  end;

  begin
  Repeat
  C5 := random (9)+1;
  Until
  (C5 <> A4) and (C5 <> A5) and (C5 <> A6) and (C5 <> B4) and (C5 <> B5) and (C5 <> B6) and (C5 <> C1) and (C5 <> C2) and (C5 <> C3) and (C5 <> C4)
  end;

  {begin
  Repeat
  C6 := random (9)+1;
  Until
  (C6 <> A4) and (C6 <> A5) and (C6 <> A6) and (C6 <> B4) and (C6 <> B5) and (C6 <> B6) and (C6 <> C1) and (C6 <> C2) and (C6 <> C3) and (C6 <> C4) and (C6 <> C5)
  end;}

  end;

end.
So wie es momentan ist klapt das Programm einbandfrei ! Sobald ich aber die letzte Zeile die als Kommentatr gesetzt ist ausklammert stürzt das programm ab !

mfg

Grishnak 23. Mär 2006 13:07

Re: Sudoku Programm !?
 
...und das erst bei C6! :mrgreen:

Ich denke, das Programm stürzt nicht ab, sondern hängt in einer Endlosschleife fest (d.h. es gibt keine Zahl zwischen 0 und 9, die in C6 passt)! :coder2:

Da ich schon einen Sudoku-Solver + -Generator geschrieben habe: Glaub' mir, so geht das nicht! :warn:

Christian H. 23. Mär 2006 13:12

Re: Sudoku Programm !?
 
mhhh ... ja glaub dir ja schon ;) Allerindgs verstehe ich den unterschied zu dem code den Light gepostet hat nicht ganz also vom Prinzip her ! Sicher ist es leichter wenn man for schleife und arrays benutzt aber von prinzip her ist das doch eg das gleiche oder ??

mfg

Grishnak 23. Mär 2006 13:18

Re: Sudoku Programm !?
 
Zitat:

Zitat von Christian H.
aber von prinzip her ist das doch eg das gleiche oder ??

Ja, deshalb wird mMn der Code von Light auch nicht funktionieren! :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:47 Uhr.
Seite 1 von 2  1 2      

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