AGB  ·  Datenschutz  ·  Impressum  







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

Sudoku Programm !?

Ein Thema von Christian H. · begonnen am 22. Mär 2006 · letzter Beitrag vom 23. Mär 2006
Antwort Antwort
Seite 1 von 2  1 2      
Christian H.

Registriert seit: 22. Mär 2006
9 Beiträge
 
#1

Sudoku Programm !?

  Alt 22. Mär 2006, 23:02
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
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#2

Re: Sudoku Programm !?

  Alt 22. Mär 2006, 23:18
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Christian H.

Registriert seit: 22. Mär 2006
9 Beiträge
 
#3

Re: Sudoku Programm !?

  Alt 22. Mär 2006, 23:25
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
  Mit Zitat antworten Zitat
Benutzerbild von Nikolas
Nikolas

Registriert seit: 28. Jul 2003
1.528 Beiträge
 
Delphi 2005 Personal
 
#4

Re: Sudoku Programm !?

  Alt 22. Mär 2006, 23:35
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.
Erwarte das Beste und bereite dich auf das Schlimmste vor.
  Mit Zitat antworten Zitat
Benutzerbild von Light
Light

Registriert seit: 3. Feb 2006
Ort: Paderborn NRW
123 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Sudoku Programm !?

  Alt 22. Mär 2006, 23:50
Hallo Christian,

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

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
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#6

Re: Sudoku Programm !?

  Alt 23. Mär 2006, 01:11
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.
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Christian H.

Registriert seit: 22. Mär 2006
9 Beiträge
 
#7

Re: Sudoku Programm !?

  Alt 23. Mär 2006, 13:55
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
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#8

Re: Sudoku Programm !?

  Alt 23. Mär 2006, 14:07
...und das erst bei C6!

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)!

Da ich schon einen Sudoku-Solver + -Generator geschrieben habe: Glaub' mir, so geht das nicht!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Christian H.

Registriert seit: 22. Mär 2006
9 Beiträge
 
#9

Re: Sudoku Programm !?

  Alt 23. Mär 2006, 14:12
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
  Mit Zitat antworten Zitat
Benutzerbild von Grishnak
Grishnak

Registriert seit: 15. Sep 2005
Ort: Neu-Ulm
111 Beiträge
 
RAD-Studio 2009 Arc
 
#10

Re: Sudoku Programm !?

  Alt 23. Mär 2006, 14:18
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!
Mach' etwas idiotensicher und irgendjemand erfindet einen besseren Idioten!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 08:33 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