![]() |
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 |
Re: Sudoku Programm !?
Zitat:
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. |
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 |
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:
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.
for i:=1 to 9 do
if feld[x,i]=p then bla; Also auf jeden Fall ein großes. |
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 hoffe ich konnte dir weiterhelfen!
//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; 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: |
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.
|
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:
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 !
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. mfg |
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: |
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 |
Re: Sudoku Programm !?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 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