bytes.cat

La wiki d'FP d'informàtica

Eines de l'usuari

Eines del lloc


sudoku_php

Diferències

Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina.

Enllaç a la visualització de la comparació

Ambdós costats versió prèvia Revisió prèvia
Següent revisió
Revisió prèvia
sudoku_php [2022/02/23 15:07]
enrique_mieza_sanchez [Sudoku en PHP]
sudoku_php [2022/10/17 18:41] (actual)
enrique_mieza_sanchez [Iteració 4: solver]
Línia 3: Línia 3:
 Guia pràctica per construir un joc de sudoku en PHP. Guia pràctica per construir un joc de sudoku en PHP.
  
-{{tag> #Daw #DawMp07 #DawMp07Uf1 #DawMp07Uf01 sudoku php}}+{{tag> #FpInfor #Daw #DawMp07 #DawMp07Uf1 #DawMp07Uf01 sudoku php}}
  
  
Línia 25: Línia 25:
 ===== Iteració 2: crear partida ===== ===== Iteració 2: crear partida =====
 <WRAP todo> <WRAP todo>
-Crear un nombre aleatori de números i distribuïr-los per la quadrícula.+Farem unes passes per generar una partida amb cel·les predefinides. Guia: 
 + 
 +  - Crear un nombre de números aleatoris (de l'1 al 9) distribuir-los per la quadrícula. Inicialment provem amb N=15. 
 +  - Guardar els nombres generats a la variable $_SESSION. Assegura't que si fas F5 (recàrrega de pàgina) els nombres no es tornen a generar (partida activa). 
 +  - A les caselles on hi ha un número fix, no s'ha de posar el SELECT (o //dropdown menu//) i pintarem el número assignat (només lectura). 
 +  - Assegurar-se que els nombres generats compleixen les normes del Sudoku que hem implementat amb les funcions de la iteració 1.
  
-Guardar els nombres generats a la variable $_SESSION. 
 </WRAP> </WRAP>
  
Línia 34: Línia 38:
 ===== Iteració 3: jugar partida ===== ===== Iteració 3: jugar partida =====
 <WRAP todo> <WRAP todo>
-Determinar si hem resolt el Sudoku.+Abans que res caldrà que modifiquis les funcions ''comprova_fila($fila)'', ''comprova_columna($columna)'' i ''comprova_quadrant($quadrant)'', per tal que no només miri les dades enviades per $_POST (formulari) sinó que també tingui en compte les cel·les fixes guardades a la variable $_SESSION. 
 + 
 +Amb el què tenim el jugador pot avançar en jugar una partida, però cal un pas important: **determinar el final de partida**. 
 + 
 +Quan detectis que el taulell del Sudoku està resolt correctament, dóna un missatge de felicitació. 
 + 
 +NOTA: la partida finalitza quan es passa positivament els tests de totes les files, columnes i quadrants, i a més s'han omplert totes les cel·les.
 </WRAP> </WRAP>
  
 \\ \\
  
-===== Iteració 4: solver =====+===== Iteració 4: solver amb backtrack ===== 
 + 
 +<WRAP important> 
 +Secció només per a les més agosarades! 
 +</WRAP> 
 + 
 +{{ https://markfisherfitness.com/wp-content/uploads/2013/08/ninjachallenge_zps4011c7ff.png?200 }} 
 + 
 +Si has resolt fins aquí i ets dels més agosarats, voldràs provar de trobar solució a la partida que has generat de forma automàtica. Això es pot fer amb un clàssic algorisme de //backtracking//. En el fons, aquest el què fa és provar sistemàticament totes les combinacions possibles fins que troba una de vàlida, similarment al que coneixem per un "atac de força bruta"
 + 
 +[[https://cacauet.org/wiki/index.php/Algorisme_de_backtracking|Aquí tens una breu explicació i psuedo-codi de l'algorisme de backtrack recursiu per al Sudoku]]. 
 + 
 +{{ https://helloacm.com/wp-content/uploads/2020/08/sudoku-solver.jpg?400 }} 
 + 
 +<WRAP info> 
 +Hi ha moltes tècniques de resolució de sudokus com joc (X-wing, Y-wing, etc). Aquestes són "fàcils" d'utilitzar per persones, però no son fàcils d'implementar en un programa. 
 + 
 +En canvi, el //backtrack// seria una tècnica molt difícil que segueixi una persona, però més fàcil d'implementar en un programa. No és un algorisme òptim, en el sentit en què triga molt i consumeix CPU i memòria, però funciona. 
 + 
 +Una optimització senzilla del //backtrack// que pot disminuir molt el temps de computació seria disposar d'una matriu extra on posaríem els valors vàlids per a cada cel·la, descartant valors impossibles (els que hi hagi a la fila, columna i quadrant de la cel·la). Llavors el bucle que fem pels possibles valors de la cel·la dins el//backtrack// es redueix i el temps de càlcul es redueix considerablement. 
 +</WRAP> 
 <WRAP todo> <WRAP todo>
-Implementar un [[https://cacauet.org/wiki/index.php/Algorisme_de_backtracking|solver per al Sudoku seguint l'algorisme de backtrack]].+Implementar el //backtrack// del Sudoku.
  
-Optimitzacions.+Fes-ho en una pàgina específica, per exemple ''solver.php'', on pots agafar la partida emmagatzemada a la variable de sessió i resoldre-la.
 </WRAP> </WRAP>
  
sudoku_php.1645628829.txt.gz · Darrera modificació: 2022/02/23 15:07 per enrique_mieza_sanchez