Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Fehler bei Sudoku Korrektur (https://www.delphipraxis.net/144692-fehler-bei-sudoku-korrektur.html)

Grimsch 14. Dez 2009 18:15


Fehler bei Sudoku Korrektur
 
Hallo liebe Community ich hätte da mal eine Frage.
Und zwar programmiere ich gerade ein Sudoku per Delphi aber komme gerade nicht weiter, da sich irgendwie bei mir ein Fehler eingeschlichen hat. Meine Idee war es die Korrektur bzw die Überprüfung ob das Sudoku richtig ist mit Summen zu lösen, d.h. in jeder spalte, zeile und quadrat muss eine Summe von 45 vorliegen.
Allerdings kommt zum schluss bei mir immer nach der Überprüfung die Meldung dass die lösung falsch sei.
hier der quelltext in dem ich den Fehler vermute:

Delphi-Quellcode:
function testspalte:boolean;  {Namensgebung der Funktion}
var x, y, sum: integer;
begin
 result:= false;             {Ergebnis ist vorerst falsch}
  for x:= 0 to 8 do         {alle spalten werden gezählt}
   begin
   sum:= 0;                  {summe wird auf null gestellt für jede neue spalte}
     for y := 0 to 8 do      {alle reihen durchzählen}
     sum:= sum+ sudoku[x,y,a]; {den wert des jeweiligen Feldes zur Summe hinzuaddiern}
     if sum<>45 then         {wenn summe nicht 45 dann bleibt result:=false}
     exit;
  end;
  result:= true; {nachdem der test bestanden werden sollte wird das ergebnis auf true gesetzt}
end;

function testzeile:boolean;
var x, y, sum: integer;
begin
result:=false;
for y:= 0 to 8 do
begin
sum:=0;
 for x:= 0 to 8 do
 sum:= sum+ sudoku[y,x,a];
 if sum<>45 then
 exit;
 end;
 result:= true;
 end;

function testquadrat:boolean;
var p, q, x, y, sum:integer;
begin
result:= false;
 for p:= 0 to 2 do          {spalten der quadrate durczählen}
  for q:= 0 to 2 do           {reihen der quadrate durchzählen}
  begin
  sum:= 0;
  for x:= 0 to 2 do         {spalten in den quadraten zählen}
   for y:= 0 to 2 do         {reihen in den quadraten zählen}
   sum:= sum + sudoku[p*3+x,q*3+y,a];
   {in diesem fall muss mal 3 genommen werden, da jeweils 9 zeilen und spalten
   vorhanden sind und nicht nur 3.}
    if sum<>45 then
    exit;
   end;
   result:= true;
   end;


procedure TForm1.Button2Click(Sender: TObject);
begin
if testspalte and testzeile and testquadrat then showmessage('Sie haben das Sudoku richtig gelöst!')
{wenn in allen funktionen der test bestanden wurde erscheint diese Nachricht}
else
showmessage('Das Sudoku ist fehlerhaft.'); {ansonsten fehlermeldung}
end;
wäre super wenn ihr mir helfen könntet... muss das spiel morgen im Unterricht vorstellen >.<

Aphton 14. Dez 2009 18:28

Re: Fehler bei Sudoku Korrektur
 
Zitat:

Zitat von Grimsch
Meine Idee war es die Korrektur bzw die Überprüfung ob das Sudoku richtig ist mit Summen zu lösen, d.h. in jeder spalte, zeile und quadrat muss eine Summe von 45 vorliegen.

Ohne mir dein Code angesehen zu haben - du solltest das nochmal überdenken:
Was ist in dem Fall, wenn folgende Zahlen vorkommen:
9, 9, 9, 9, 4, 5, 0, 0, 0

MfG

Grimsch 14. Dez 2009 18:37

Re: Fehler bei Sudoku Korrektur
 
nunja 0 kann schonmal nicht vorkommen da ich das begrenzt habe zwischen 1 und 9.
außerdem wenn sowas vorkommen sollte dann müsste das genauso auch in den darauf folgeneden spalten auch passen sowie mit den quadraten. Also würde das schon funktionieren außer es hat jemand spaß daran das so zu machen dass es anders genau passt. oder halt nur 5 einfügt aber das ist ja nicht der sinn der sache^^

xZise 15. Dez 2009 10:32

Re: Fehler bei Sudoku Korrektur
 
Naja alternativ mit den Bits eines Integers rechnen?
Delphi-Quellcode:
function SpalteTesten(ASpalte : Integer) : Boolean;
const
  CARDINAL_POS : array [1..9] of Cardinal = (1, 2, 4, 8, 16, 32, 64, 128, 256);
  ALL_SET = 511;
var
  i : Integer;
  Werte : Cardinal; // Gibt es eine art UShortInt?
begin
  Werte := 0;
  for i := 0 to 8 do
  begin
    Werte := Werte or CARDINAL_POS[sudoku[<hier den wert :D>]];
  end;
  Result := Werte and ALL_SET = ALL_SET;
end;
Ich hoffe das geht so :P aber meine Idee war, dass du das n-te Bit auf 1 setzt, wenn die Zahl vorhanden ist. Und zum Schluss müsste dann dort irgendwie 0...0111111111 stehen (die 9 niedrigsten Bits stehen auf 1).
Dazu setzten wir in der Schleife das n-te Bit auf 1 indem wir den Wert vorher nehmen (ich betrachte erstmal nur die 9 niedrigsten Bits). Zum Beispiel sieht Werte vorher so aus:
000000000
Wenn dann im aktuellen Feld eine 3 steht, dann wird das 3. Bit auf 1 gesetzt:
000000100
Wenn wir dann wieder auf ein Feld mit einer 3 treffen passiert aber gar nichts mehr.

Und dann ganz zum Schluss überprüft er ob alle auf 1 stehen. Und zwar ist 111111111b = 511d (wenn ich mich irre). das heißt wir müssen nur die unteren 9 Bits betrachten. Dazu können wir and verwenden:
Code:
0..irgendwas..0111111111 and
000000000000000111111111 =
============================
000000000000000111111111
Weil bei add ist das Bit im Ergebnis nur 1, wenn die Bits in den beiden Werten 1 sind. Wenn dann das zweite und Ergebnis gleich sind, dann ist auch das obere mindestens so groß wie das obere. Ich weiß klingt ein bisschen komisch :P

Aber dafür gibt es ein ganz gutes Tutorial hier irgendwo.

MfG
Fabian

PS: Und wenn du Platz sparen willst kannst du satt 32 bit auch 16bit verwenden ;) 9 bit würden reichen, aber sowas gibt es nicht :D

Grimsch 15. Dez 2009 17:30

Re: Fehler bei Sudoku Korrektur
 
ok danke für die mühe aber musste das spiel heute schon abgeben bzw präsentieren. ich vermute der lehrer war zufrieden auch wenn zum schluss immer "falsch" stand. naja vllt wirds ja wenigstens noch im 2 stelligen bereich sein also eine 2^^

mimi 15. Dez 2009 18:00

Re: Fehler bei Sudoku Korrektur
 
Auch wenn es vielleicht zu Spät ist: Ich habe mal den Tipp gelesen, erst ein vollständiges Sudoku Retzel generieren und dann einige Stellen löschen. Aber du hast die Lösungen schon in einem 2D Map oder so liegen. Müsste das nicht auch gehen ? Ich habe die Idee noch nicht ausprobiert...

Grimsch 15. Dez 2009 18:09

Re: Fehler bei Sudoku Korrektur
 
hmm stimmt das mit dem erst generieren lassen und die zahlen irgendwo speichern bevor man sie löscht um sie dann zur überprüfung zu verwenden wäre natürlich auch eine gute idee gewesen. naja mist zu spät^^

mimi 15. Dez 2009 18:17

Re: Fehler bei Sudoku Korrektur
 
Kannst du ja immer noch mal umsetzten nur so als Übung. Dir bringt es alle male was und vielleicht zeigst du dann dem Lehrer das Programm *G*.... vielleicht bekommst du dann noch Plus-Punkte....

Grimsch 15. Dez 2009 18:20

Re: Fehler bei Sudoku Korrektur
 
joa dafür müsste ich allerdings erstmal rausfinden wie das mit dem selbst generieren funktioniert usw und das dauert auch erstmal bis ich das alles verstanden habe und das müsste dann bis morgen fertig sein da dann der letzte termin für das eintragen der noten wäre.
naja wird schon schief gehen^^

JasonDX 15. Dez 2009 18:41

Re: Fehler bei Sudoku Korrektur
 
Zitat:

Zitat von Grimsch
hmm stimmt das mit dem erst generieren lassen und die zahlen irgendwo speichern bevor man sie löscht um sie dann zur überprüfung zu verwenden wäre natürlich auch eine gute idee gewesen.

Die Überprüfungsmethode funktioniert aber nur solange das Rätsel eine eindeutige Lösung besitzt ;) Und Rätsel mit einer eindeutigen Lösung zu generieren... das ist dann ne andre Sache ;)

greetz
Mike


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 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