Sudoku

Status
Niet open voor verdere reacties.

JeroenE

Terugkerende gebruiker
Lid geworden
20 mrt 2005
Berichten
1.950
Ik ben een sudoku in javascript aan het maken, maar stuit op het volgende probleem :
Bij het random invullen van het raster krijg ik soms twee keer hetzelfde cijfer in 1 kolom of op 1 rij terwijl het script weldegelijk werkt en zegt dat je al een cijfer in die rij, kolom of blok hebt als dat zo is.
Wie kan mij helpen?
Hier vind je het voorbeeld.

Greetz : Jer:cool:en.
 
Je vraag beantwoorden kan ik niet .....
maar ik zie nu wel dat ik met firefox je site niet kan bekijken......
 
Klopt, puppie, en ik heb er geen idee van hoe dat, met de huidige scripts te verwezenlijken.
Kijk maar even in deze topic.

Greetz : Jer:cool:en.
 
Als je een aantal vakjes willekeurig invuld (met rij-, kolom- en blokcontrole) genereer je meestal nog steeds een foute opgave, denk ik. Bijvoorbeeld:

sudoku.gif


In het middelste vakje kan alleen nog een 5 of een 7, maar dat geld ook voor de vakjes links en rechts van het middelste vakje. :(

Misschien probeert je script een getal te vinden voor een leeg vakje waar geen enkel getal meer geldig in kan. Ik kreeg een memory overflow error.


Een manier om het aan te pakken zou kunnen zijn;
- alle vakjes invullen van linksboven naar rechtsonder,
- overnieuw beginnen als je bij een leeg vakje komt dat geen mogelijkheden meer heeft,
- bij de oplossing willekeurige getallen verwijderen (bv 5 per blok).

Maar of je zo vaak genoeg bij stap 3 komt? :)


Vr.Gr. Egel.
 
Ik ben herbegonnen op de manier die je aanraad, Egel. :thumb:

Greetz : Jer:cool:en.
 
PHP:
<html>
 <head>
  <title>.: Sudoku :: Egeltje 070401 ;) :.</title>
  <style type="text/css">
   table { background: #000;}
   td {  background: #fff; width: 32px; height: 32px; font: bold 24px/24px 'Times New Roman'; color: #000; vertical-align: middle; text-align: center;}
  </style>
 </head>
 <body>
  <script type="text/javascript">

   // object
   var nr = new Array(), z;
   for (var y = 0; y < 9; y++) {
    for (var x = 0; x < 9; x++) {
     z = 3 * Math.floor(y/3) + Math.floor(x/3);
     nr[nr.length] = {n: 0, x: x, y: y, z: z};
     };
    };

   // oplossing
   var tl = 0, bm, bk;
   for (var i = 0; i < 81; i++) {
    bm = ['',1,2,3,4,5,6,7,8,9];
    for (var j = 0; j < i; j++) if (nr[i].x == nr[j].x || nr[i].y == nr[j].y || nr[i].z == nr[j].z) bm[nr[j].n] = '';
    bm = bm.join('');
    if (bm == '') {
     bk = i - i % 9;
     tl++; if (tl % 16 == 0) bk = 0;
     i = bk - 1;
     } else {
     nr[i].n = bm.charAt(Math.floor(Math.random() * bm.length));
     };
    };

   // wegstrepen
   var db;
   for (var i = 0; i < 45; i++) {
    do db = Math.floor(Math.random() * 81); while (nr[db].n == 0);
    nr[db].n = 0;
    };

   // weergeven
   var sg = new Array('',1,2,3,4,5,6,7,8,9);
   document.writeln('<table>');
   for (var i = 0; i < 81; i++) {
    if(i % 9 == 0) document.writeln('<tr>');
    document.writeln('<td>' + sg[nr[i].n] + '</td>');
    if(i % 9 == 8) document.writeln('</tr>');
    };
   document.writeln('</table>');

  </script>
 </body>
</html>
;) Egel.
 
Je kunt geen getallen ingeven. :) Het is een voorbeeld hoe je een opgave maakt die niet fout is in de zin van dat hij geen oplossing heeft (mogelijk wel meerdere goede oplossingen.)

Eerst wordt een array van objecten (nr[0] t/m nr[80]) gemaakt:
nr[3].n == 0; // getal
nr[3].x == 3; // kolommen 0-8
nr[3].y == 0; // rijen 0-8
nr[3].z == 1; // blokken 0-8

Daarna een volledige oplossing.
Bij elk nieuw vakje wordt gekeken wat de mogelijkheden zijn door de vorige vakjes te controleren op eenzelfde x, y, of z-coördinaat, als één van die coördinaten gelijk is wordt het getal van het vorige vakje uit de lijst met mogelijkheden gehaald.
Als er geen mogelijkheden voor het nieuwe vakje zijn gaat het script terug naar het eerste vakje van een rij tenzij dat al 16 keer gebeurd is, dan begint het helemaal overnieuw.

Van de oplossing worden een aantal weggestreept, zo weet je dat de opgave iig één oplossing heeft. :)

Vervolgens wordt de opgave weergegeven.


Vr.Gr. Egel.
 
Ik zou het invoeren van karakters (dus geen cijfers) nog wel even afvangen ;)
 
Dank je wel, Egel, dat je voor de zoveelste keer de oplossing gegeven hebt.
Ik zie het al voor me, maar ben nu even bezig met een spelletje voor kinderen in de vorm van "get the picture". Het resultaat komt zeker nog op mijn site, van beide zaken : sudoku en foto's raden. :thumb:

Greetz : Jer:cool:en.
 
Ik heb eindelijk tijd gevonden om verder te werken aan deze sudoku, en het lukt prachtig met het script van egel.
Je kan nu al cijfers invullen, maar er ik nog geen voorbeeld online.
Eerst nog even een functie maken voor het controleren van de invoer door de speler.

Thx egel :thumb:

Greetz : Jer:cool:en.
 
Eindelijk staat onze sudoku online, egel, thx. :thumb:
Je kan hem vinden op mijn site in deel twee bij spelletjes.

Greets : Jer:cool:en.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan