Cómo crear un sitio web de juego de Sudoku usando Python

¡Hola!

Supongo que no quieres una interfaz gráfica, pero si lo necesitas, necesitarás el módulo / Framework pyGame y lleva mucho tiempo, considera el código sin Pygame a continuación.

Necesita el módulo numpy aquí

Así que creo que es mejor hacerlo sin interfaz gráfica de usuario, solo mi opinión y dado que no puedo explicar cada línea de código aquí, supongo que entiendes Python

O simplemente copie el código

Fuente: http://code.activestate.com/reci…

Editar: es posible que haya cometido algunos errores al copiar el código o algo así que le sugiero que lo copie directamente desde el enlace

¡Gracias!

#! / usr / bin / env python
# – * – codificación: utf-8 – * –

“” ”
Creador de juegos de sudoku

“” ”

__author__ = ‘Ripley6811’
__contact__ = ‘python at boun.cr’
__copyright__ = ”
__license__ = ”
__date__ = ‘Jue 30 de agosto 10:09:06 2012’
__version__ = ‘0.1’

# ================================================= ==============================
# DECLARACIONES DE IMPORTACIÓN
# ================================================= ==============================
de importación numpy *

# ================================================= ==============================
# MÉTODOS
# ================================================= ==============================

def new_block ():
return random.permutation (arange (1,10)). rehape (3,3)

def test_rowcol (S):
retval = verdadero
para fila en S:
if len (set (row) .difference ([0])) <count_nonzero (row):
retval = falso
descanso
para col en ST:
if len (set (col) .difference ([0] It’s)) <count_nonzero (col):
retval = falso
descanso
retorno retval

def generate_grid (S = Ninguno, detallado = Falso):
# PARTE 1: ESTABLECER PRIMEROS TRES FILAS Y PRIMEROS TRES COLUMNAS
disponible = set (rango (1,10))
si S == Ninguno:
S = new_block ()
si es detallado: escriba S
mientras cierto:
Srow = append (append (S, new_block (), 1), new_block (), 1)
si test_rowcol (Srow):
si es detallado: imprima Srow
descanso
mientras cierto:
Scol = append (append (S, new_block (), 0), new_block (), 0)
si test_rowcol (Scol):
Scol = append (Scol [3:], ceros ((6,6), int), 1)
si es detallado: imprimir Scol
descanso
S = agregar (Srow, Scol, 0)
# PARTE 2: LLENE EL RESTO DE LA RED DE LA PARTE 1. [3:, 3:]
si es detallado: escriba ‘.’,
mientras cierto:
S [3: 6,3: 6] = new_block ()
si test_rowcol (S [: 6,: 6]):
descanso
mientras cierto:
S [6:, 6:] = new_block ()
si test_rowcol (S):
descanso
para i en rango (3,9):
para j en el rango (3,9):
si S [i, j] == 0:
subset = available.difference (set (S [i])) .difference (set (S [:, j]))
si len (subconjunto) == 1:
S [i, j] = subset.pop ()
más:
S [3:, 3:] = 0
return generate_grid (S, detallado)
si es detallado: imprimir ‘\ n’, S
devoluciones

def reduce_options (tablero, Pcube):

fila, col = where (tablero == 0)
playoption = []
para i en rango (9):
para j en el rango (9):
si el tablero [i, j]! = 0:
Pcube [i, j, Pcube [i, j]! = Tablero [i, j]] * = 0

para i, j en zip (fila, col):
excluir = conjunto (tablero [i])
excluir = excluir.unión (tablero [:, j])
exclude = exclude.union (placa [i / 3 * 3: i / 3 * 3 + 3, j / 3 * 3: j / 3 * 3 + 3] .flat)
para cada en excluir:
Pcube [i, j, Pcube [i, j] == cada uno] = 0

para la capa en Pcube.T: # capas probables 1 a 9
para i en rango (9):
rowsfilled = sum (capa [i,: 3])> 0, sum (capa [i, 3: 6])> 0, sum (capa [i, 6:])> 0
si suma (filas rellenas) == 1:
rowsfilled = repetir (rowsfilled, 3)
capa [i / 3 * 3 + (i + 1)% 3, filas rellenas] * = 0
capa [i / 3 * 3 + (i + 2)% 3, filas rellenas] * = 0
capa = capa.T
para i en rango (9):
rowsfilled = sum (capa [i,: 3])> 0, sum (capa [i, 3: 6])> 0, sum (capa [i, 6:])> 0
si suma (filas rellenas) == 1:
rowsfilled = repetir (rowsfilled, 3)
capa [i / 3 * 3 + (i + 1)% 3, filas rellenas] * = 0
capa [i / 3 * 3 + (i + 2)% 3, filas rellenas] * = 0

# print str (Pcube.T) .replace (‘0’, ‘~’)

para i, j en zip (fila, col):
if count_nonzero (Pcube [i, j]) == 1:
playoption.append ((i, j, sum (Pcube [i, j])))
volver playoption

def generate_game (S, detallado = Falso):
gametest = S.copy ()

para cada uno en el rango (200):
i = random.randint (81)
temp = gametest.flat [i]
gametest.flat [i] = 0

si no es Soluble (prueba de juego):
gametest.flat [i] = temp
prueba de juego de regreso

def isSolvable (juego de prueba):
tablero = testgame.copy ()
P = unos ((9,9,9), int)
para i en un rango (9):
P [:,:, i] * = i + 1
print ‘GAME \ n’, str (tablero) .replace (‘0’, ‘_’)
orden de juego = []
laststate = sum (P)
while sum (tablero == 0)> 0:
# REDUCIR LAS OPCIONES PARA CADA AGUJERO
playoptions = reduce_options (tablero, P)
imprimir playoptions
# print str (tablero) .replace (‘0’, ‘_’)
para i, j, v en playoptions:
tablero [i, j] = v
thisstate = sum (P)
si thisstate == laststate:
descanso
más:
laststate = thisstate
devuelve Verdadero si suma (tablero == 0) == 0 más Falso

def main ():
“” “Descripción de main ()” “”
solución = generate_grid (detallado = Verdadero)
sudoku = generate_game (solución, verbose = True)
imprimir ‘Solución \ n’, solución
print ‘Sudoku \ n’, str (sudoku) .replace (‘0’, ‘_’)
print sum (sudoku == 0), ‘espacios en blanco (‘, int (sum (sudoku == 0) /. 81), ‘%)’

if __name__ == ‘__main__’:
principal()

Hagamos la ingeniería.

¿Qué estoy construyendo?
Un juego de sudoku que desafía al usuario y valida la solución correcta.

¿Qué es el sudoku?
Una cuadrícula de 9 × 9 con ciertos números rellenados previamente en algunas de las casillas. La cuadrícula se divide en 9 bloques, cada uno con 3 × 3. El jugador debe llenar los cuadros vacíos de modo que “cada número solo pueda aparecer una vez en una fila / columna / bloque 3 × 3”.

Construyamos un esqueleto:

def check_duplicates (elements_as_an_array):
si elements_as_an_array tiene duplicados:
falso retorno
más:
volver verdadero

def validate_sudoku (cuadrícula):
para fila en cuadrícula:
check_duplicates (elements_as_an_array)
para columna en cuadrícula:
check_duplicates (elements_as_an_array)
para bloque en cuadrícula:
check_duplicates (elements_as_an_array)

def build_a_grid ():
empty_grid = una matriz vacía multidimensional 9 × 9.
prefilled_grid = llenar la cuadrícula con pocos números.
return prefilled_grid

Ahora, tenemos la lógica de construir un tablero de sudoku y validar las respuestas.

Una vez que hayamos construido la funcionalidad principal de nuestra aplicación, profundicemos en el resto.

Quien puede jugar
Solo usuarios que iniciaron sesión. Por lo tanto, necesitamos un sistema de administración de usuarios. Para que sea simple y amigable, integremos Iniciar sesión con cualquier red social.

Python tiene omab / python-social-auth

Lo integraremos para autenticar nuestro sitio web. Recuerde, esto no tiene nada que ver con lo que está haciendo su aplicación. Es puramente autenticación.

Ahora, tenemos usuarios con dirección de correo electrónico registrados. Necesitamos hacer un perfil de ellos en nuestro sitio. Necesitamos almacenar todos sus puntajes, intentos, etc. también.
Entonces, necesitamos una base de datos. Como no conocemos el esquema, vamos con Mongodb.

¿Qué datos puedo almacenar para un usuario?

Creemos una colección llamada usuario, que tiene los siguientes datos. Estos campos pueden crecer, avanzando en nuestra aplicación.

{
‘_id’: ‘some_unique_id’,
’email’: ‘dirección de correo electrónico de los usuarios’,
‘logininwith’: [‘google’, ‘twitter’]
}

Registro para sudoku.

Cada usuario registrado como usuario puede jugar al juego de sudoku. No se requiere registro explícito.

Minutero.

Entonces, necesitamos rastrear user_game_start_time y establecer un temporizador de cuenta regresiva. Podemos configurar esto en el código del navegador del cliente. Sin embargo, para evitar posibles hacks, configuraremos la hora de inicio de la tienda en la base de datos. Cada vez que el usuario complete su juego, verificaremos si time_taken está dentro de nuestro conjunto de reglas.

Indicación de pantalla.

Ahora que tenemos temporizador, necesitamos dar pistas. Entremos en la parte de puntuación más tarde. Aproximadamente, daremos pistas por cualquiera de los siguientes:

1. Si el usuario solo tiene dos celdas restantes, en una fila / columna / bloque, lo llenaremos.
2. Si el usuario no ha llenado muchas celdas pero ha pedido una pista, llenaremos un bloque para él y deduciremos el puntaje correspondiente.
3. Otras formas de pistas. (Estoy seguro de que puedes pensar en más).

Ahora que hemos hecho ingeniería, poniendo todo en papel (o pizarra), profundicemos en el código.

En cada paso, tenemos que revisar esta gran imagen. Y trata de dividirlo tanto como sea posible.
¿Recuerdas dividir y conquistar algoritmo? Es el corazón de toda la gestión del proyecto. Deberíamos dividir las tareas en las unidades más pequeñas posibles.

Entonces, aquí están las cosas que necesitamos codificar.

  1. Registro de usuario e inicio de sesión en las redes sociales.
  2. Constructor de tableros de juego Sudoku
  3. Validador de resultados de Sudoku. – Esto debe ser del lado del cliente. Entonces, podemos decirle al usuario tan pronto como comete un error. En lugar de llamar a nuestro backend.
  4. Sugerencias de sudoku.
  5. Temporizador de sudoku.
  6. Complejidad del sudoku. – necesita definir métricas de complejidad. Y llame a la función board_builder aquí, en función de la complejidad seleccionada por el usuario. Puede requerir modificar board_builder, dependiendo de las métricas. Ahora que ya tiene un board_builder integrado, esto no será un desafío.
  7. El backend se comunicará con la interfaz a través de datos json. Por lo tanto, haga que su respuesta de API sea razonablemente fácil de entender para alguien.
  8. Es hora de presentar. La simplicidad en su mejor momento. Haga una IU (usando bootstrap) para personalizar esas vistas.

Elección del marco. Como lo estamos haciendo en Python, y necesitamos ser una aplicación web, deberíamos ir con Django. Es maduro y hay una gran curva de aprendizaje en la integración de varias bibliotecas para backend y frontend.

Registrarse en trello. Crea tableros para cada división. Divide las tareas en unidades más pequeñas. Para cada unidad, tenga una fecha límite. Acaba con ellos y comprométete a git. Para tableros dependientes, haga una etiqueta o ponga la identificación de la tarjeta en los comentarios. Si sus dependencias son demasiado, entonces lo está haciendo mal. Alto ahí. Revise dónde puede separar las preocupaciones.

Espero que esto ayude. Estoy empezando a hacer el mismo proyecto, cuando y cuando el tiempo lo permite. 🙂

Su aplicación debe hacerse con Django.

Es el marco adecuado que incorpora la base de datos sqlite para almacenar credenciales de usuario. Y también puede implementar otras funciones similares, todas como una aplicación web.

Me topé con este repositorio en Github: bryanpieper / sudoku, creo que tienes todos los recursos. Esto se basa en una versión anterior, consulte la documentación de: Django

Para la interfaz de usuario y los temas, puede usar bootstrap.

Puede consultar este tutorial, si es nuevo en Django – Pruebe Django 1.9 – Cree un blog de Django – Django 1.9, Bootstrap 3.3, y más.