Commit ef45d1b2 authored by Louis FUNCK BRENTANO's avatar Louis FUNCK BRENTANO
Browse files

test

parents
import numpy as np
import copy
class Case:
def __init__(self,n,x,y,L=[]):
# n entier de 1 à 9
# L array contenant les candidats potentiels pour une case donnée
# x et y coordonnées de la case dans le tableau
self.valeur = n
self.suppositions = L
self.abcisse = x
self.ordonnée = y
class Grille:
def __init__(self,m=9,n=9):
# A array contenant l'ensemble des cases de la grille
# m et n caractéristiques de la grille
self.format = (m,n)
self.colonnes = None
self.lignes = None
def initialiser_grille(self,A):
#permet d'initialiser les lignes et colonnes de la matrice à partir d'un tableau array
n = np.shape(A)
# récupération des colonnes
B = np.array([A[:, 0]])
for i in range(1, n[1]):
B = np.concatenate((B, np.array([A[:, i]])))
self.colonnes = B
self.lignes = A
def vérification_règle_carrés(self,A):
C = np.zeros((9, 9))
for k in range(3):
for i in range(3):
B = np.array(A[i * 3, 3 * k:3 * (k + 1)]) #récupération des carrés
for j in range(3 * i + 1, 3 * (i + 1)):
B = np.concatenate((B, A[j, k * 3:3 * (k + 1)]))
C[i + k * 3] = np.array([B])
for i in range(len(C)): #on regarde si il n'y a pas deux valeurs identiques dans chacuns des carrés
for j in C[i]:
k = 0
for l in C[i]:
if j == l:
k = k + 1
if k > 1:
return(True)
return(False)
def génération(self,n):
GE = np.array([[1,2,3,4,5,6,7,8,9],
[4,5,6,7,8,9,1,2,3],
[7,8,9,1,2,3,4,5,6],
[2,3,4,5,6,7,8,9,1],
[5,6,7,8,9,1,2,3,4], #génération de la grille élémentaire
[8,9,1,2,3,4,5,6,7],
[3,4,5,6,7,8,9,1,2],
[6,7,8,9,1,2,3,4,5],
[9,1,2,3,4,5,6,7,8]])
self.initialiser_grille(GE)
for k in range (n): #permutations des colonnes ou lignes
C = self.colonnes
L = self.lignes
i = np.random.randint(1, 9)
j = np.random.randint(1, 9)
P=True
while P:
TC = C[i].copy()
C[i] = C[j]
C[j] = TC
TL = L[:, i].copy() #permutation lignes
L[:, i] = L[:, j]
L[:, j] = TL
TL = L[i].copy()
L[i] = L[j]
L[j] = TL
TC = C[:, i].copy() #permutation colonnes
C[:, i] = C[:, j]
C[:, j] = TC
P = self.vérification_règle_carrés(L) #on regarde si la nouvelle disposition respecte les règles du jeux
return(L)
class Joueur:
def __init__(self,nom):
# nom str contenant le nom du joueur
self.__nom=nom
def possible(self,grille, x, y, n):
# détermine si le proposition vérifie les lois du jeu
# grille array contenant des cases
# x et y coordonnées d'une case dans le grille
# n proposition de valeur à tester
for i in range(9):
if grille[y, i] == n:
return False
for i in range(9):
if grille[i, x] == n:
return False
x0 = (x // 3) * 3
y0 = (y // 3) * 3
for i in range(3):
for j in range(3):
if grille[y0 + i, x0 + j] == n:
return False
return True
class Humain(Joueur):
def __init__(self):
Joueur.__init__(self,'humain')
def modifie_une_case(self,grille,x,y,n):
# modifie la valeur d'une case si elle repecte les lois du jeu
# grille array contenant des cases
# x et y coordonnées d'une case dans le grille
# n proposition de valeur à tester
if self.possible(grille,x,y,n)==False:
print('ça ne fonctionne pas')
else:
grille[y, x] =n
def grille_finie(self,grille):
# vérifie si le tableau est fini et revoi un booléen
for i in range(grille.shape[0]):
for j in range(grille.shape[1]):
if grille[i,j]==0:
return False
return True
def rempli_le_tableau(self,grille):
#permet de modifier les cases tant que le tableau n'est pas fini
while self.grille_finie(grille)==False:
print(grille)
y = int(input('Entrez la ligne:'))
x = int(input('Entrez la colonne:'))
n = int(input('Entrez la valeur'))
self.modifie_une_case(grille,x,y,n)
print('Bravo')
class Ordinateur(Joueur):
def __init__(self):
Joueur.__init__(self,'ordi')
def solve(self,grille,lst=[]):
# Touve une solution à la grille par back tracking
# grille array contenant des cases
for y in range(9):
for x in range(9):
if grille[y, x] == 0:
for n in range(1, 10):
if self.possible(grille, x, y, n):
grille[y, x]=n
self.solve(grille,lst)
grille[y, x] = 0
return lst
lst.append(copy.deepcopy(grille))
def solution_unique(self,grille):
lst=[]
self.solve(grille, lst)
if len(lst)==1:
return True
else:
return False
class Partie():
def __init__(self,type):
self.__type=type
def nouvelle_partie_ordi(self,n):
Grille.génération(n)
Ordinateur.solve(grille)
def nouvelle_partie_humain(self,n):
Grille.génération(n)
Humain.rempli_le_tableau(grille)
import numpy as np
import Classes
if __name__ == "__main__":
grl = Classes.Grille()
ordi= Classes.Ordinateur()
hum= Classes.Humain()
grille=grl.génération(100) #génération d'une grille inédite
for k in range(10):
i = np.random.randint(0, 9)
j = np.random.randint(0, 9)
grille[i, j] = 0
#lst=[]
#print(grille)
#print(grille)
#hum.rempli_le_tableau(grille) #touve une solution à cette grille
#ordi.solve(grille,lst)
#print(lst)
print(ordi.solve(grille))
"""
p = Classes.Partie(ordi)
p.nouvelle_partie_humain(100)
"""
import unittest
class TestSolution(unittest.TestCase):
def Solutions_diff(self):
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment