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 [2021/10/07 16:34]
enrique_mieza_sanchez
sudoku_php [2022/10/17 18:41] (actual)
enrique_mieza_sanchez [Iteració 4: solver]
Línia 1: Línia 1:
-~~REVEAL~~ 
- 
 ====== Sudoku en PHP ====== ====== Sudoku en PHP ======
  
-{{tag> #Daw #DawMp07 #DawMp07Uf1 #DawMp07Uf01 sudoku php}}+Guia pràctica per construir un joc de sudoku en PHP. 
 + 
 +{{tag> #FpInfor #Daw #DawMp07 #DawMp07Uf1 #DawMp07Uf01 sudoku php}}
  
  
-<WRAP todo> 
 ===== Iteració 1 : formulari buit jugable ===== ===== Iteració 1 : formulari buit jugable =====
 +<WRAP todo>
 Fer un formulari de Sudoku que ens digui si els números introduïts compleixen les regles del Sudoku. Fer un formulari de Sudoku que ens digui si els números introduïts compleixen les regles del Sudoku.
  
Línia 23: Línia 23:
 \\ \\
  
-<WRAP todo> 
 ===== Iteració 2: crear partida ===== ===== Iteració 2: crear partida =====
-Crear un nombre aleatori de números i distribuïr-los per la quadrícula.+<WRAP todo> 
 +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>
  
 \\ \\
  
-<WRAP todo> 
 ===== Iteració 3: jugar partida ===== ===== Iteració 3: jugar partida =====
-Determinar si hem resolt el Sudoku.+<WRAP todo> 
 +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 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>
 +Implementar el //backtrack// del Sudoku.
 +
 +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>
 +
 +\\
 +
 +===== Iteració 5: check partida resoluble =====
 +<WRAP todo>
 +Quan inicialitzem una partida aleatòriament, encara que els nombres que posem compleixin les regles del Sudoku (no repetir números en files, columnes ni quadrants) això no assegura que aquesta partida sigui resoluble.
 +
 +Per assegurar-nos, quan creem una partida, abans de passar-la a l'usuari, li aplicarem el Solver que hem realitzat a la iteració anterior, el qual ens dirà si té solució o no (i en un temps raonable, pel què ha d'estar optimitzat).
 +
 +A més, les regles del Sudoku inclouen un altre requisit: que la partida no tingui vàries solucions, sinó només una de sola. Per tant, haurem de modificar el nostre solver perquè també ens determini si té més d'una solució. Si ens dona una 2a solució, tornarem a descartar la partida.
 +
 +</WRAP>
 +
 +\\
  
sudoku_php.1633624475.txt.gz · Darrera modificació: 2021/10/07 16:34 per enrique_mieza_sanchez