StartseiteZahlenrätselSudokuSkripteKlasse: sudoku_guessMethode: guess()

Methode: guess()

  1. <?php

  2. function guess() {
  3.   if (12 < time() - $this->chkTime) {
  4.     $this->arrZeilen = $this->arrStart;
  5.     $this->aktualisieren();
  6.     return true;
  7.   }
  8.   // Backup
  9.   if (!is_array($this->arrStart[0]))
  10.     $this->arrStart = $this->arrZeilen;
  11.   $this->arrBackup = $this->arrZeilen;
  12.   // Ein Wert wird geraten
  13.   $tmp = 0;
  14.   $z = $this->count1;
  15.   for($x = 0; $x < 9; $x++) {
  16.     for($y = 0; $y < 9; $y++) {
  17.       if (9 < $this->arrZeilen[$x][$y] && 0 == $tmp) {
  18.         if (0 == $z) {
  19.           $str = substr($this->arrZeilen[$x][$y], 0, 1);
  20.           $this->arrZeilen[$x][$y] = $str;
  21.           $tmp++;
  22.         } else {
  23.           $z--;
  24.         }
  25.       }
  26.     }
  27.     if (0 != $tmp)
  28.       break;
  29.   }
  30.   // Mit dem geratenen Wert wird weiter gerechnet
  31.   $this->solve();
  32.   // Ergebnis wird ueberprueft
  33.   $this->check();
  34.   // Wenn das Ergebnis falsch ist, wird mit dem Backup der naechste
  35.   // Wert geraten
  36.   if ('error' == $this->status) {
  37.     $this->count3++;
  38.     if (10 < $this->count3) {
  39.       $this->arrZeilen = $this->arrStart;
  40.       $this->count1 = $this->count2 + 1;
  41.       $this->count2 = 0;
  42.       $this->count3 = 0;
  43.       $this->guess();
  44.     } else {
  45.       $this->arrZeilen = $this->arrBackup;
  46.       $this->count1++;
  47.       $this->guess();
  48.     }
  49.     // Ist die Loesung noch nicht eindeutig, wird weitergeraten
  50.   } elseif ('unfinished' == $this->status) {
  51.     if (0 == $b) {
  52.       $this->count2 = $this->count1;
  53.       $this->count1 = 0;
  54.       $this->guess();
  55.     } else {
  56.       $this->count1 = 0;
  57.       $this->guess();
  58.     }
  59.   }
  60. }

  61. ?>

sudoku_guess::guess() rät einen oder mehrere Werte für das zu lösende Sudoku-Rätsel.
Sollte durch zu häufiges Raten die Berechnung länger als 12 Sekunden dauern, so wird das Skript abgebrochen.
Beim ersten Durchlauf der Methode sudoku_guess::guess() wird ein Backup von $arrZeilen erstellt.
Außerdem wird bei jedem Durchlauf ein Backup des vorigen Standen von $arrZeilen erstellt.
Dann wird ein Wert geraten. Dieses "Raten" ist aber kein Raten im eigentlichen Sinne, sondern vielmehr ein systematisches Probieren mit Hilfe der Durchlaufzähler.
Mit dem geratenen Wert wird weiter gerechnet. Das Ergebnis der Berechnung wird geprüft.
Sollte das mit dem geratenen Wert errechnete Ergebnis falsch sein ($status = "error"), wird mit veränderten Durchlaufzählern und einem Backup weitergeraten.
Sollte die Lösung noch nicht eindeutig sein ($status = "unfinished"), wird erneut geraten.
Ist das Ergebnis jedoch vollständig und richtig, so wird das Ergebnis im nächsten Schritt ausgegeben.

Links:

Ausblenden