Probleme affectation de variable

Htech33 -  
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, je travaille actuellement sur un jeu de sudoku : je commence mon programme en définissant aléatoirement une grille de sudoku a partir
d'une grille pleine.
# définition d'une grille de sudoku valide
g1 = [[3, 6, 7, 9, 4, 1, 2, 8, 5],
[1, 5, 2, 6, 8, 3, 4, 9, 7],
[4, 9, 8, 7, 5, 2, 1, 6, 3],
[7, 4, 6, 1, 9, 5, 8, 3, 2],
[8, 1, 9, 2, 3, 7, 6, 5, 4],
[2, 3, 5, 8, 6, 4, 7, 1, 9],
[9, 2, 1, 5, 7, 8, 3, 4, 6],
[5, 8, 4, 3, 2, 6, 9, 7, 1],
[6, 7, 3, 4, 1, 9, 5, 2, 8]]

while i != 45:
i = i + 1
b = random.randint(0, 8)
c = random.randint(0, 8)
x = g1[b][c]
g1[b][c] = 0
print("Bonne chance cette grille n'as pas l'air simple: ")
print("")
g2 = list(g1) # mon probléme est la
aff()


En effet par la suite je définin toute les entrées utilisateur et je compare avec g2 que je ne modifie pas mais lorsque j'affiche une valeur de g2 qui devrait etre zéro je trouve la valeur de que j'ai ajouté. En gros je modifie g1 avec les valeurs de mon utilisateur et g2 en arriére plan me permetrai de savoir si l'utilisateur a modifié une valeur. Je sais pas si j'ai été clair n'hésitaait pas a me contacter pour toute question.

Ps voici mon code complet

import random
c = 0
l = 0
e = 0
f = 0
a = 0
b = 0
c = 0
i = 0
j = 0
x = 0
r = 0
z = 0
vartampon1 = 0
vartampon2 = 0
vartampon3 = 0

# définition d'une grille de sudoku valide
g1 = [[3, 6, 7, 9, 4, 1, 2, 8, 5],
[1, 5, 2, 6, 8, 3, 4, 9, 7],
[4, 9, 8, 7, 5, 2, 1, 6, 3],
[7, 4, 6, 1, 9, 5, 8, 3, 2],
[8, 1, 9, 2, 3, 7, 6, 5, 4],
[2, 3, 5, 8, 6, 4, 7, 1, 9],
[9, 2, 1, 5, 7, 8, 3, 4, 6],
[5, 8, 4, 3, 2, 6, 9, 7, 1],
[6, 7, 3, 4, 1, 9, 5, 2, 8]]

carré1 = [g1[0][0], g1[0][1], g1[0][2],
g1[1][0], g1[1][1], g1[1][2],
g1[2][0], g1[2][1], g1[2][2]]

carré2 = [g1[3][0], g1[3][1], g1[3][2],
g1[4][0], g1[4][1], g1[4][2],
g1[5][0], g1[5][1], g1[5][2]]

carré3 = [g1[6][0], g1[6][1], g1[6][2],
g1[7][0], g1[7][1], g1[7][2],
g1[8][0], g1[8][1], g1[8][2]]

# Fonction d'affichage formatée de la grille de Sudoku
def aff():
print(g1[0][0],"|",g1[0][1],"|",g1[0][2],"||",g1[0][3],"|",g1[0][4],"|",g1[0][5],"||",g1[0][6],"|",g1[0][7],"|",g1[0][8])
print("------------------------------------")
print(g1[1][0],"|",g1[1][1],"|",g1[1][2],"||",g1[1][3],"|",g1[1][4],"|",g1[1][5],"||",g1[1][6],"|",g1[1][7],"|",g1[1][8])
print("------------------------------------")
print(g1[2][0],"|",g1[2][1],"|",g1[2][2],"||",g1[2][3],"|",g1[2][4],"|",g1[2][5],"||",g1[2][6],"|",g1[2][7],"|",g1[2][8])
print("------------------------------------")
print("------------------------------------")
print(g1[3][0],"|",g1[3][1],"|",g1[3][2],"||",g1[3][3],"|",g1[3][4],"|",g1[3][5],"||",g1[3][6],"|",g1[3][7],"|",g1[3][8])
print("------------------------------------")
print(g1[4][0],"|",g1[4][1],"|",g1[4][2],"||",g1[4][3],"|",g1[4][4],"|",g1[4][5],"||",g1[4][6],"|",g1[4][7],"|",g1[4][8])
print("------------------------------------")
print(g1[5][0],"|",g1[5][1],"|",g1[5][2],"||",g1[5][3],"|",g1[5][4],"|",g1[5][5],"||",g1[5][6],"|",g1[5][7],"|",g1[5][8])
print("------------------------------------")
print("------------------------------------")
print(g1[6][0],"|",g1[6][1],"|",g1[6][2],"||",g1[6][3],"|",g1[6][4],"|",g1[6][5],"||",g1[6][6],"|",g1[6][7],"|",g1[6][8])
print("------------------------------------")
print(g1[7][0],"|",g1[7][1],"|",g1[7][2],"||",g1[7][3],"|",g1[7][4],"|",g1[7][5],"||",g1[7][6],"|",g1[7][7],"|",g1[7][8])
print("------------------------------------")
print(g1[8][0],"|",g1[8][1],"|",g1[8][2],"||",g1[8][3],"|",g1[8][4],"|",g1[8][5],"||",g1[8][6],"|",g1[8][7],"|",g1[8][8])

# fonction pour verifier que l'entrée de l'utilisateur ne soit pas déja dans la colonne
def verif_colonne():
#Définir la variable c ici et chjoisir un nom de variable explicite
global c
tab = [g1[0][f], g1[1][f], g1[2][f],
g1[3][f], g1[4][f], g1[5][f],
g1[6][f], g1[7][f], g1[8][f]]

try:
tab.index(h)
print("La valeur est déjà dans la colone")
c = False
except ValueError:
print("La valeur n'est pas déjà dans la colone")
c = True

# fonction pour verifier que l'entrée de l'utilisateur ne soit pas déja dans la ligne
def verif_ligne():
global l
tab = [g1[e][0], g1[e][1], g1[e][2],
g1[e][3], g1[e][4], g1[e][5],
g1[e][6], g1[e][7], g1[e][8]]

try:
tab.index(h)
print("La valeur est déjà dans la ligne")
l = False
except ValueError:
print("La valeur n'est pas déjà dans la ligne")
l = True

# Vérification que les valeurs entrée par l'utilisateur pour les lignes et les colones sont compatible

# Vérification que les valeur de ligne et de colone entrée par l'utilisateur sont
# compatible avec le jeu soit comprise entre 1 et 9
def verif_userinput():
global b
b = 4
if e > 8:
print("merci de mettre une valeur de ligne plus petite")
b =False
if f > 8:
print("merci de mettre une valeur de colonne plus petite")
b = False
if e < 0:
print("merci de mettre une valeur de ligne plus grande")
b = False
if f < 0:
print("merci de mettre une valeur de colonne plus grande")
b = False
else:
b = True
print("")
print("ok user input")

# Vérification que la valeurs entrée par l'utilisateur est compatible avec le jeu du sudoku
def verif_h():
global z
if h >= 10 or h <= 0:
print("erreur h")
z = False

else:
print("ok h")
print("")
z = True

# définition d'une grille aléatoire
while i != 45:
i = i + 1
b = random.randint(0, 8)
c = random.randint(0, 8)
x = g1[b][c]
g1[b][c] = 0
print("Bonne chance cette grille n'as pas l'air simple: ")
print("")
g2 = list(g1)
aff()

# définition des entrées de l'utilisateur
while j != 33:
print("")
vartampon1 = 0
vartampon2 = 0
vartampon3 = 0

#entré de ligne
while vartampon1 != True:
e = input("Dans quelle ligne voulez vous jouer ? ")
try:
e = int(e)
print("La valeur entree est un entier = ", e)
e = e - 1
vartampon1 = True
except ValueError:
print("Ce n'est pas un entier!")

# entré de colone
while vartampon2 != True:
f = input("Dans quelle colone voulez vous jouer ? ")
try:
f = int(f)
print("La valeur entree est un entier = ", f)
f = f - 1
vartampon2 = True
except ValueError:
print("Ce n'est pas un entier!")

# entré de l'utilisateur
while vartampon3 != True:
h = input("Quelle valeur voulez vous entrez ? ")
try:
h = int(h)
print("La valeur entree est un entier = ", h)
vartampon3 = True
except ValueError:
print("Ce n'est pas un entier!")

verif_userinput()
verif_colonne()
verif_ligne()
verif_h()

# vérification de la validité des carrés à condition que la ligne et la colonne
# associés à l'entrée de l'utilisateur soit validés ( t= 2 )
if c == l and l == b and b == z and z == True:

if g2[e][f] == 0 and g1[e][f] == 0:
j = j + 1
r = r + 1
g1[e][f] = h
print ("Vous avez ajouté une valeur")
aff()

elif g2[e][f] != 0:
print("vous ne pouvez pas modifié cette valeur")
print("erreur 1")

elif g1[e][f] != 0 and g2[e][f] == 0:
g1[e][f] = h
print("Vous avez modifié une valeur")
aff()

elif g2[e][f] != 0 and g1[e][f] != 0:
print("vous ne pouvez pas modifié cette valeur")
print("erreur 2")

else:
print("erreur 4")
else :
print("erreur 100")

#vérification de toute les lignes quand l'utilisateur a rempli la grille
def verif_tt_lignes():
while a != 8:
if g1[a][0] != g1[a][1] != g1[a][2] != g1[a][3] != g1[a][4] != g1[a][5] != g1[a][6] != g1[a][7] != g1[a][8]:
print ("ok ligne :")
print(a)
print("")
a = a + 1

else :
print ("erreur ligne")
print (a)
a = a + 1

#vérification de toute les colones quand l'utilisateur a rempli la grille
def verif_tt_colones():
while b != 8:
if g1[0][b] != g1[1][b] != g1[2][b] != g1[3][b] != g1[4][b] != g1[5][b] != g1[6][b] != g1[7][b] != g1[8][b]:
print("ok colone :")
print(b)
print("")
b = b + 1

else:
print("erreur colone :")
print(b)
b = b + 1


Configuration: Linux / Chrome 80.0.3987.149

3 réponses

yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 585
 
bonjour, merci d'utiliser les balises de code quand tu partages ton code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

ceci n'est pas très clair "lorsque j'affiche une valeur de g2 qui devrait etre zéro je trouve la valeur de que j'ai ajouté"

ne pourrais-tu pas reproduire le problème avec un programme beaucoup plus court?

tu écris "mon problème est la", sans expliquer ce que tu attends de cette instruction.

je suggère que tu lises ceci: https://docs.python.org/fr/3/library/copy.html
0
Htech33
 
g1 = [1, 2, 3]
g2 = list(g1) # Cela revient à copier le contenu de ma_liste1

e = input("test :")
e = int(e)

if e == 4:
    g1.append(5)

print("fini")
print(g1)
print(g2)


En gros voila sauf que dans mon vrai programme (sudoku) a la fin g2 = g1
alors qu'en réailté g1 != g2
0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 585
 
je vois une différence fondamentale entre le g1 de ton vrai programme et le g1 de ton exemple.
par ailleurs, tu utilises append dans ton exemple, ce qui ne correspond pas à ce que tu fais dans ton vrai programme.
0
Htech33
 
"je vois une différence fondamentale entre le g1 de ton vrai programme et le g1 de ton exemple"

peux tu m'en dire plus ?

"par ailleurs, tu utilises append dans ton exemple, ce qui ne correspond pas à ce que tu fais dans ton vrai programme."

et concrétement ça change quoi ?
0
yg_be Messages postés 24281 Date d'inscription   Statut Contributeur Dernière intervention   1 585
 
pour ton exemple, garde g1 comme dans ton vrai programme.
en modifiant g1 comme tu le fais dans ton vrai programme, tu vas découvrir ce que cela change.

le but, c'est de recréer le même comportement avec un programme plus court, pas de montrer comment éviter le comportement dans une situation tout-à-fait différente.
0