Probleme mit Zufallszahlen im Array?

jackie05

Erfahrenes Mitglied
Hallo,
ich bin gerade dabei ein Kakuro Spiel zu schreiben und irgendwie funktioniert meine Funktion nicht so richtig.
In einer Sume dürfen keine doppelte Zufallszahlen sein.
Hier mal mein Code:
PHP:
var
  x,y: integer;
  ZaehlerX,ZaehlerY,Zaehler: integer;
  Zahl: integer;
  Doppelt: integer;
begin
  ZaehlerX:=0;
  ZaehlerY:=0;
  Doppelt:=0;
  Zahl:=0;
  Zaehler:=0;
  for y:=0 to 11 do begin
    for x:=0 to 11 do begin
      Doppelt := 0;
      Zaehler := 0;
      Zahl := 0;
      if (Spielfeld[x][y].Feld = 'N') then
      begin
        repeat
          Form1.Canvas.Draw(x*36-x,y*36-y,Image1.Picture.Bitmap);
          if (Doppelt = 1) then
          begin
            Spielfeld[x][y].Wert := Zahl;
            Doppelt := 0;
          end
          else begin
            Zahl := random(9)+1;
            Spielfeld[x][y].Wert := Zahl;
            Doppelt := 0;
          end;
          ZaehlerX := x;
          ZaehlerY := y;
          while (ZaehlerX > 0) do begin
            ZaehlerX := ZaehlerX - 1;
            if ((Spielfeld[ZaehlerX][y].Feld = 'M') or (Spielfeld[ZaehlerX][y].Feld = 'S')) then
            begin
              break;
            end;
            if (Spielfeld[ZaehlerX][y].Wert = Zahl) then
            begin
              Doppelt := 1;
              break;
            end;
          end;
          while (ZaehlerY > 0) do begin
            ZaehlerY := ZaehlerY - 1;
            if ((Spielfeld[x][ZaehlerY].Feld = 'M') or (Spielfeld[x][ZaehlerY].Feld = 'S')) then
            begin
              break;
            end;
            if (Spielfeld[x][ZaehlerY].Wert = Zahl) then
            begin
              Doppelt := 1;
              break;
            end;
          end;
          if (Doppelt = 1) then
          begin
            Spielfeld[x][y].Wert := 0;
            Zahl := Zahl + 1;
            Zaehler := Zaehler + 1;
            if (Zaehler > 9) then
            begin
              break;
            end;
            if (Zahl > 9) then Zahl := 1;
          end;
        until Doppelt = 0;
      end;
    end;
  end;

PHP:
Spielfeld[x][y].Feld = 'N' //=Felder, in denen die Zufallszahlen rein sollen
Spielfeld[x][y].Feld = 'M' //=Normaler Block
Spielfeld[x][y].Feld = 'S' // =Sume Block

Mein Code funktioniert manchmal, die Schleife hängt sich aber manchmal auf, deshalb habe ich einen weiteren Zähler eingebaut, der die Schleife abbricht, wenn Zaehler > 9 ist.

Kann mir da vll jemand weiterhelfen?

MfG
 

CSANecromancer

Erfahrenes Mitglied
Kann mir da vll jemand weiterhelfen?
Möglicherweise. Aber ich habe keine Ahnung, was "Kakuro" ist.
Bevor ist mich an eine Lösung wagen kann, hätte ich ein paar Fragen:
- Wie sieht das "Spielfeld" größentechnisch aus?
- Was sollen die ganzen "M", "N" und "S"?
- Was für Werte willst du wo reinschreiben?
- Was meinst du mit "doppelten Zufallszahlen"?
 

jackie05

Erfahrenes Mitglied
Erstmal Danke für die antwort.

Also, S sind die Sume Felder, M sind die einfache Blöcke und N für die Zahlen.

Hier mal ein Bild von mir:
http://www.qpic.ws/viewimage.php?file=/images/G5N77793.png

Da wo S steht, dürfen keine Doppelte Zahlen vorhanden sein, bis ein weiterer Block kommt oder ein S Feld, also in einer Sume dürfen keine Doppelte Zahlen vorkommen.

Mein Code funktioniert nicht immer, manchmal hängt sich mein Programm dabei auf.

Hier mal eine anleitung zu Kakuro:
http://www.knobelfieber.de/html/kakuro_anleitung.html

Ich bedanke mich schonmal im Voraus.

MfG
 

CSANecromancer

Erfahrenes Mitglied
Nenn mich meinetwegen begriffsstutzig, aber ich kapiere immer noch nicht, was mit "doppelten Zahlen in Summen" gemeint ist und was dein Programm überhaupt machen soll.

Ich habe mal den von dir geposteten Source nachgebaut und das Bild als Spielfeld noch eingetragen, aber logischerweise kann da nichts passieren, da kein einziges Feld ein 'N' beinhaltet.
Und zum kompletten Durcharbeiten dieser Kakuro-Regeln habe ich momentan weder Zeit noch Lust.
 

jackie05

Erfahrenes Mitglied
Die Felder erstelle ich mit einem Klick auf den Button:
PHP:
procedure TForm1.FormCreate(Sender: TObject);
begin
  randomize();
  Spielfeld[0,0].Feld := 'M';
  Spielfeld[1,0].Feld := 'M';
  Spielfeld[2,0].Feld := 'M';
  Spielfeld[3,0].Feld := 'S';
  Spielfeld[4,0].Feld := 'S';
  Spielfeld[5,0].Feld := 'S';
  Spielfeld[6,0].Feld := 'S';
  Spielfeld[7,0].Feld := 'M';
  Spielfeld[8,0].Feld := 'M';
  Spielfeld[9,0].Feld := 'S';
  Spielfeld[10,0].Feld := 'S';
  Spielfeld[11,0].Feld := 'S';
  Spielfeld[0,1].Feld := 'M';
  Spielfeld[1,1].Feld := 'M';
  Spielfeld[2,1].Feld := 'S';
  Spielfeld[3,1].Feld := 'N';
  Spielfeld[4,1].Feld := 'N';
  Spielfeld[5,1].Feld := 'N';
  Spielfeld[6,1].Feld := 'N';
  Spielfeld[7,1].Feld := 'S';
  Spielfeld[8,1].Feld := 'S';
  Spielfeld[9,1].Feld := 'N';
  Spielfeld[10,1].Feld := 'N';
  Spielfeld[11,1].Feld := 'N';
  Spielfeld[0,2].Feld := 'M';
  Spielfeld[1,2].Feld := 'S';
  Spielfeld[2,2].Feld := 'N';
  Spielfeld[3,2].Feld := 'N';
  Spielfeld[4,2].Feld := 'N';
  Spielfeld[5,2].Feld := 'N';
  Spielfeld[6,2].Feld := 'N';
  Spielfeld[7,2].Feld := 'N';
  Spielfeld[8,2].Feld := 'S';
  Spielfeld[9,2].Feld := 'N';
  Spielfeld[10,2].Feld := 'N';
  Spielfeld[11,2].Feld := 'N';
  Spielfeld[0,3].Feld := 'S';
  Spielfeld[1,3].Feld := 'N';
  Spielfeld[2,3].Feld := 'N';
  Spielfeld[3,3].Feld := 'S';
  Spielfeld[4,3].Feld := 'N';
  Spielfeld[5,3].Feld := 'N';
  Spielfeld[6,3].Feld := 'S';
  Spielfeld[7,3].Feld := 'N';
  Spielfeld[8,3].Feld := 'N';
  Spielfeld[9,3].Feld := 'N';
  Spielfeld[10,3].Feld := 'M';
  Spielfeld[11,3].Feld := 'M';
  Spielfeld[0,4].Feld := 'S';
  Spielfeld[1,4].Feld := 'N';
  Spielfeld[2,4].Feld := 'N';
  Spielfeld[3,4].Feld := 'S';
  Spielfeld[4,4].Feld := 'S';
  Spielfeld[5,4].Feld := 'N';
  Spielfeld[6,4].Feld := 'N';
  Spielfeld[7,4].Feld := 'S';
  Spielfeld[8,4].Feld := 'N';
  Spielfeld[9,4].Feld := 'N';
  Spielfeld[10,4].Feld := 'S';
  Spielfeld[11,4].Feld := 'S';
  Spielfeld[0,5].Feld := 'M';
  Spielfeld[1,5].Feld := 'S';
  Spielfeld[2,5].Feld := 'N';
  Spielfeld[3,5].Feld := 'N';
  Spielfeld[4,5].Feld := 'S';
  Spielfeld[5,5].Feld := 'N';
  Spielfeld[6,5].Feld := 'N';
  Spielfeld[7,5].Feld := 'S';
  Spielfeld[8,5].Feld := 'N';
  Spielfeld[9,5].Feld := 'N';
  Spielfeld[10,5].Feld := 'N';
  Spielfeld[11,5].Feld := 'N';
  Spielfeld[0,6].Feld := 'S';
  Spielfeld[1,6].Feld := 'N';
  Spielfeld[2,6].Feld := 'N';
  Spielfeld[3,6].Feld := 'N';
  Spielfeld[4,6].Feld := 'N';
  Spielfeld[5,6].Feld := 'N';
  Spielfeld[6,6].Feld := 'S';
  Spielfeld[7,6].Feld := 'N';
  Spielfeld[8,6].Feld := 'N';
  Spielfeld[9,6].Feld := 'N';
  Spielfeld[10,6].Feld := 'N';
  Spielfeld[11,6].Feld := 'N';
  Spielfeld[0,7].Feld := 'S';
  Spielfeld[1,7].Feld := 'N';
  Spielfeld[2,7].Feld := 'N';
  Spielfeld[3,7].Feld := 'N';
  Spielfeld[4,7].Feld := 'N';
  Spielfeld[5,7].Feld := 'S';
  Spielfeld[6,7].Feld := 'N';
  Spielfeld[7,7].Feld := 'N';
  Spielfeld[8,7].Feld := 'S';
  Spielfeld[9,7].Feld := 'N';
  Spielfeld[10,7].Feld := 'N';
  Spielfeld[11,7].Feld := 'S';
  Spielfeld[0,8].Feld := 'M';
  Spielfeld[1,8].Feld := 'M';
  Spielfeld[2,8].Feld := 'S';
  Spielfeld[3,8].Feld := 'N';
  Spielfeld[4,8].Feld := 'N';
  Spielfeld[5,8].Feld := 'S';
  Spielfeld[6,8].Feld := 'N';
  Spielfeld[7,8].Feld := 'N';
  Spielfeld[8,8].Feld := 'S';
  Spielfeld[9,8].Feld := 'S';
  Spielfeld[10,8].Feld := 'N';
  Spielfeld[11,8].Feld := 'N';
  Spielfeld[0,9].Feld := 'M';
  Spielfeld[1,9].Feld := 'S';
  Spielfeld[2,9].Feld := 'S';
  Spielfeld[3,9].Feld := 'N';
  Spielfeld[4,9].Feld := 'N';
  Spielfeld[5,9].Feld := 'N';
  Spielfeld[6,9].Feld := 'S';
  Spielfeld[7,9].Feld := 'N';
  Spielfeld[8,9].Feld := 'N';
  Spielfeld[9,9].Feld := 'S';
  Spielfeld[10,9].Feld := 'N';
  Spielfeld[11,9].Feld := 'N';
  Spielfeld[0,10].Feld := 'S';
  Spielfeld[1,10].Feld := 'N';
  Spielfeld[2,10].Feld := 'N';
  Spielfeld[3,10].Feld := 'N';
  Spielfeld[4,10].Feld := 'S';
  Spielfeld[5,10].Feld := 'N';
  Spielfeld[6,10].Feld := 'N';
  Spielfeld[7,10].Feld := 'N';
  Spielfeld[8,10].Feld := 'N';
  Spielfeld[9,10].Feld := 'N';
  Spielfeld[10,10].Feld := 'N';
  Spielfeld[11,10].Feld := 'M';
  Spielfeld[0,11].Feld := 'S';
  Spielfeld[1,11].Feld := 'N';
  Spielfeld[2,11].Feld := 'N';
  Spielfeld[3,11].Feld := 'N';
  Spielfeld[4,11].Feld := 'M';
  Spielfeld[5,11].Feld := 'S';
  Spielfeld[6,11].Feld := 'N';
  Spielfeld[7,11].Feld := 'N';
  Spielfeld[8,11].Feld := 'N';
  Spielfeld[9,11].Feld := 'N';
  Spielfeld[10,11].Feld := 'M';
  Spielfeld[11,11].Feld := 'M';
end;

Also, Feld S sind die Sume Felder und die Felder N sind die Felder in denen Zahlen von 1-9 rein kommen sollen, man addiert die Zahlen die in einem Sumen Block sind, aber es dürfen in einem Sime Block keine Doppelte Zahlen existieren.

Hier mal ein beispiel:
http://www.qpic.ws/viewimage.php?file=/images/Bue85659.png

Das was ich rot markiert habe, ist ein Sumen Block, in diesem Sumen Block dürfen keine doppelte Zahlen existieren.Das was ich grün markiert habe, ist wieder ein anderer Sumen Block, auch wieder keine Doppelte Zahlen.

Ich möchte einfach alle Felder mit Zahlen versehen, ohne das sich doppelte Zahlen in einem Sumen Block befinden.

Ich hoffe, man kann es jetzt besser verstehen.

Danke schonmal.

MfG
 

jackie05

Erfahrenes Mitglied
Vielen Dank.
Wenn es nicht reichen sollte, dann kann ich ja mal mein Komplette Source Posten, um es zu verdeutlichen.

MfG
 

CSANecromancer

Erfahrenes Mitglied
Ok, ich habe mich jetzt mal ein bißchen mit dem Teil gespielt und nochmal deinen Anfangspost gelesen. Ich poste mal, wie weit ich die Aufgabe verstehe. Falls was falsch ist, korrigiere mich:

- Dieses Kakuro ist eine Art Kreuzworträtsel für Zahlen
- Die Summen beziehen sich auf Zeilen und Spalten
- In einer Summenzeile oder Summenspalte dürfen nur Ziffern (ist was anderes als Zahlen ;) ) von 1 - 9 vorkommen.
- Jede Ziffer darf pro Summenzeile und -spalte nur einmal vorkommen
- Du willst ein Spielfeld erstellen und keine Lösung

Es wäre noch praktisch, wenn du mir sagen könntest, was in Image1->Picture drin ist.



Nachtrag:
Ok, ich habe mal was zusammengebastelt. Du kannst es dir ja mal bei Gelegenheit anschauen und mir sagen, ob es ungefähr in die Richtung geht, die du meinst. Falls ja, dann kann ich mal weitersuchen.
kakuro.rar
 
Zuletzt bearbeitet:

CSANecromancer

Erfahrenes Mitglied
So. Ich habe mal (nach meinem Verständnis) den Kakuro-Generator gebaut und bin dabei auf ein Problem gestossen, das dem sehr ähnlich schien, wie du es beschrieben hast. Die Lösung war wirklich etwas knifflig zu finden, aber ich bin schließlich dahinter gekommen:

Mein Programm generiert das Spielfeld Feld für Feld, Zeile für Zeile, so wie in deinem Algorithmus. Jetzt kann es aber mit dem von dir geposteten Template für das Spielfeld passieren (ca. zu 10-15%), daß mein Generator die Felder dergestalt mit Ziffern belegt hat, daß er keine passende Ziffer für das Feld findet, das er aktuell bearbeitet. Sprich: Es wäre ein ungültiges Kakuro, das entsteht.

Und mit einer einfachen while-Schleife rechnet sich dann der Computer natürlich tot. Er generiert Zufallszahlen von 1 bis 9 wie ein Wilder, aber keine davon passt in das Feld, ergo: Das Programm hängt sich auf.

Bei mir habe ich es so gelöst, daß ich pro Feld 100 Versuche auf alle Ziffern durchlaufen lasse. Wenn das Feld dann immer noch nicht belegt werden konnte, wird eine entsprechende Hinweismeldung ausgegeben und die Generierung wird abgebrochen.

Wenn du willst, dann kann ich nachher noch den Source meines Kakurogenerators posten. Das Formular dazu ist pieseleinfach. ;)
 

jackie05

Erfahrenes Mitglied
Vielen Dank.

Genau das meine ich, ich brauche nur den richtigen Code um die Spielfelder alle mit Zahlen zu versehen, den rest schaffe ich alleine.
Also, da wo die weise Felder sind, wo die Zahlen addiert wurden und eingetragen wurden, schaffe ich alleine.

Und wie sieht jetzt der Code aus?

Ich bin Dir sehr dankbar für die Hilfe.

MfG
 
Zuletzt bearbeitet: