login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Sudoku

Offline nemesiskoen - 14/07/2005 17:30 (laatste wijziging 14/07/2005 17:31)
Avatar van nemesiskoenGouden medaille

PHP expert
Fun... verveling... noem het wat je wilt.
Het feit is dat achter elk sudoku raadsel een algoritme steekt wat ik probeer te achterhalen. Het algoritme wordt rap achterhaald door het menselijk verstand, maar om een computer de spelregels duidelijk te maken ben je morgen nog niet klaar. Vandaar dat ik der vandaag al mee begon:p.

Waar komt het op neer: ik wilde dus het sudoku systeem laten printen, maar dan random. Zodat ik telkens een nieuwe (echte) sudoku puzzel had. Allemaal goed en wel, maar hoe begin ik hier aan. Zitten denken, en voor de horizontale en verticale ben ik er bijna uit. Hoe ik het vierkant ga oplossen zie ik een andere keer wel... (als iemand een idee heeft, altijd welkom:)).

Maar goed, ik zit nu nog te sukkelen met horizontale en verticale. Terwijl dit eigenlijk niet zo moeilijk hoeft te zijn denk ik.

Ik werk, zoals verwacht, met arrays. Ik maak eerst een 2D array aan, die ik daarna vul. Om het horizontaal te laten kloppen ga ik gewoon met een while om een random getal heen en controleer ik of het al is geweest. Zoja, dan herhalen, zo neen: getal onthouden en opslaan als een element van mijn array.
Nu voor verticaal heb ik zitten denken om een tweede 2D array te maken, en daarin telkens de originele sudoku array in te kopieren en kijken of ik dit gegeven er in MAG steken. Maar bij deze fase loopt het mis. Als ik horizontaal niet controleer, dan werkt deze methode, maar ik de twee combineer loopt het vast.

Dit heb ik nu al:

  1. <?php
  2. do {
  3. $getal = rand(1, 9);
  4. if(!in_array($getal, $geweest1)) {
  5.  
  6. $geweest1[] = $getal;
  7. $doorgaan = true;
  8. }
  9. }while($doorgaan === false);
  10. ?>

voor de horizontale methode.
Dan verticaal controleer ik alsvolgt:
  1. <?php
  2. for($x=0;$x<9;$x++){
  3. if($getal == $geweest2[$j][$x]){
  4. $doorgaan2 = 0;
  5. $x=8;//parsetijd uitsparen
  6. }
  7. }
  8. if($doorgaan2!=0){
  9. $geweest2[$j][] = $getal;
  10. $geweest1[] = $getal;
  11. $doorgaan = true;
  12. }
  13. $doorgaan2 = 1;
  14. ?>

Dit is voor verticaal.
Als ik beide nu combineer krijg ik:
  1. <?php
  2. do {
  3. $getal = rand(1, 9);
  4. if(!in_array($getal, $geweest1)) {
  5.  
  6. for($x=0;$x<9;$x++){
  7. if($getal == $geweest2[$j][$x]){
  8. $doorgaan2 = 0;
  9. $x=8;//parsetijd uitsparen
  10. }
  11. }
  12. if($doorgaan2!=0){
  13. $geweest2[$j][] = $getal;
  14. $geweest1[] = $getal;
  15. $doorgaan = true;
  16. }
  17. $doorgaan2 = 1;
  18. }
  19.  
  20. }while($doorgaan === false);
  21. $doorgaan = false;
  22.  
  23. $sudoku[$i][$j] = $getal;
  24. ?>


Dit resulteert in een, tot mijn spijt, oneindige loop. Als je nu bv. de verticale controle weglaat, dan werkt het horizontaal wel, en als je het horizontaal weglaat werkt het verticaal. Dus afzonderlijk werken ze. Ik heb zitten denken aan zoiets:
  1. if($getal == $geweest2[$x][$i]){

Maar dit levert verticaal niets op.

Als iemand een idee heeft, dan mag je die altijd posten.

Mss vraag je WAAROM ik dit doe... antwoord lees je bovenaan:
Citaat:
Fun... verveling... noem het wat je wilt.




Nog even:
In het grote prentje ziet het er zo uit:
  1. <?php
  2. $sudoku = array();
  3.  
  4. $doorgaan = false;
  5.  
  6. $geweest1 = array();
  7. $geweest2 = array();
  8. $doorgaan2 = 1;
  9. $teller=0;
  10. for($i=0;$i<9;$i++){
  11. for($j=0;$j<9;$j++){
  12. do {
  13. $getal = rand(1, 9);
  14. if(!in_array($getal, $geweest1)) {
  15.  
  16. for($x=0;$x<9;$x++){
  17. if($getal == $geweest2[$j][$x]){
  18. $doorgaan2 = 0;
  19. $x=8;//parsetijd uitsparen
  20. }
  21. }
  22. if($doorgaan2!=0){
  23. $geweest2[$j][] = $getal;
  24. $geweest1[] = $getal;
  25. $doorgaan = true;
  26. }
  27. $doorgaan2 = 1;
  28. //echo var_dump($geweest2);
  29. }
  30.  
  31. }while($doorgaan === false);
  32. $doorgaan = false;
  33.  
  34. $sudoku[$i][$j] = $getal;
  35.  
  36. }
  37. unset($geweest1);
  38. $geweest1 = array();
  39. }
  40.  
  41. ?>

Vervolgens haal ik hieronder de array $sudoku leeg.
Krijg ik bv. als mogelijke oplossing:

  1. 1 3 9 7 2 4 8 6 5
  2. 2 9 3 6 1 7 8 5 4
  3. 8 3 6 5 9 2 7 1 4
  4. 8 5 7 3 2 1 4 6 9
  5. 9 1 7 6 5 3 4 2 8
  6. 5 7 6 9 2 1 3 4 8
  7. 6 2 9 8 3 1 5 4 7
  8. 8 4 6 1 2 9 3 5 7
  9. 6 9 8 7 2 1 5 4 3


Horizontaal klopt het... maar verticaal niet.

11 antwoorden

Gesponsorde links
Offline gamesty - 14/07/2005 17:41
Avatar van gamesty Onbekend Snap het niet echt waar je naar toe wil.
Offline nemesiskoen - 14/07/2005 17:42
Avatar van nemesiskoen Gouden medaille

PHP expert
Citaat:
Waar komt het op neer: ik wilde dus het sudoku systeem laten printen, maar dan random.
Offline Darrow - 14/07/2005 17:47
Avatar van Darrow Onbekend Denk dat 98% van SM niet weet wat sudoku is One of them is me 
Offline nemesiskoen - 14/07/2005 17:49 (laatste wijziging 14/07/2005 17:53)
Avatar van nemesiskoen Gouden medaille

PHP expert
google:
uitleg sudoku

Citaat:
Laat de ingevulde cijfers staan en vul de rest in volgens de drie regels van het spel. Op elke horizontale én elke verticale regel alle cijfers van 1 tot en met 9 invullen en dat tegelijkertijd ook nog eens zodat in elk van de 9 vierkanten van 3x3 vakjes de cijfers van 1 tot en met 9 staan.


een voorbeeld:
  1. 1 7 3 2 9 5 8 6 4
  2. 4 2 6 1 9 8 5 2 7
  3. 8 9 5 7 6 4 2 1 3
  4. 7 6 2 9 1 3 4 8 5
  5. 9 5 8 6 4 2 3 7 1
  6. 3 1 4 5 8 7 9 2 6
  7. 6 4 7 3 2 9 1 5 8
  8. 5 3 9 8 7 1 6 4 2
  9. 2 8 1 4 5 6 7 3 9


zoals je ziet komt elk getal van 1 tot 9 van boven naar onder maar 1 keer voor, van links naar rechts idem. (tot hier probeer ik ,te geraken).
Een extra aan sudoku is dat elke vierkant (bv. linksonder, een vierkant van 3) ook maar 1x de cijfers van 1 tot 9 in voorkomen.
  1. 6 4 7
  2. 5 3 9
  3. 2 8 1
Offline Joel - 14/07/2005 17:55
Avatar van Joel Eigenaar http://www.sitemasters.be/spel/spel.php

Zoiets bedoel je zeker 
Offline nemesiskoen - 14/07/2005 17:57
Avatar van nemesiskoen Gouden medaille

PHP expert
da issem
jij gemaakt?
Offline MothZone - 14/07/2005 18:02
Avatar van MothZone PHP ver gevorderde heb het een tijdje geleden ook geprobeert om te maken.
werkt momenteel nog steeds niet (niet dat ik eraan verderdoe he ) maar het heeft al wel een 1200tal lijnen code.
Ik controleerde alles dmv 81 (9*9) if-loops waarin hij voor elke gevonden waarde moest nazien of het getal al ingevuld was horizontaal, verticaal en in het vierkant.
Heb het met een if-loop gedaan omdat ik geen andere manier vond om het vierkant op te lossen.
Het enige wat ik nog niet had erbij gezet was dat hij voor elke mogelijke oplossing in een vakje alle waardes moest proberen ipv de eerste.
Als je wil kan ik het script doorsturen, maar ik ga het hier niet posten, de pagina zou wat lang worden met alle 1200 regels 
Offline Joel - 14/07/2005 18:22 (laatste wijziging 14/07/2005 18:26)
Avatar van Joel Eigenaar Ja ik gemaakt 200 lijnen ofzo. In't begin deed ik het ook zo door alles te controleren, of er op elke rij en kolom 9 verschillende cijfers zijn en dat elke 3x3 matrice 9 verschillende cijfers bevat. Maar nu werkt hij anders.

Je geeft een puzzel in, ziet er vb zo uit:

  1. $opl[1] = array (5,3,6, 8,2,7, 9,4,1);
  2. $opl[2] = array (1,7,2, 9,6,4, 3,5,8);
  3. $opl[3] = array (8,9,4, 1,5,3, 2,6,7);
  4.  
  5. $opl[4] = array (7,1,5, 3,4,9, 8,2,6);
  6. $opl[5] = array (6,4,3, 7,8,2, 1,9,5);
  7. $opl[6] = array (9,2,8, 5,1,6, 7,3,4);
  8.  
  9. $opl[7] = array (4,8,1, 2,9,5, 6,7,3);
  10. $opl[8] = array (3,6,9, 4,7,1, 5,8,2);
  11. $opl[9] = array (2,5,7, 6,3,8, 4,1,9);
en dan doet PHP er random cijfers uit, dan als men op CHECK drukt dan controleert men of alles correct is. Het enigste probleem nu nog is die puzzels random genereren, maar dat kan je ook handmatig doen. Vb de eerste rij mag je met de tweede en de derde wisselen en ook de tweede met de derde. Zo ook met de kolommen. Misschien dat je dan zo puzzels kunt genereren?

Enja, ik gemaakt, en niet in één uur Mijn bedoeling was om eigelijk een website te maken, met allemaal puzzels. In het begin gemakkelijke puzzels dat je maar enkele cijfers moet invullen, en dan op't einde heel moeilijke puzzels dat er maar één mogelijkheid is om deze op te lossen en je toch nog bijna alle cijfers moet invullen.
Offline Thomas - 14/07/2005 19:09
Avatar van Thomas Moderator Je moet dus iets schrijven dat als eindresultaat (postconditie) een 9x9 matrix oplevert die voldoet aan die 3 eisen. Het beste (?) kun je met een random matrix beginnen, en dan alle cijfers op zijn plaats zetten of deze random vullen... Hierbij kun je misschien gebruik maken van de voorwaarden in het eindresultaat - bijv. dat je van elke plaats twee verzamelingen bijhoudt die aangeeft welke getallen daar / waar nog mogen staan. Ga dus uit van de eisen waaraan het resultaat moet voldoen.
Offline Stijn1 - 18/08/2006 17:29
Avatar van Stijn1 Gouden medaille

PHP ver gevorderde
Mooi dat je hier aan bezig bent, ik ga daar zelf ook eens even naar kijken. Eerst ga ik mijn 'tel' scriptje afmaken (alle cijfers tem 100.000.000...) in het nederlands laten schrijven.

Als ik ermee bezig ben dan wil ik wel eens kijken.
Offline putbruy - 18/08/2006 18:15
Avatar van putbruy HTML beginner hier staat een volledig uitgewerkt voorbeeld (met de code)
http://www.sentinelli.nl/sudoku.html
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.25s