Programme plante au bout d'un certain nombre de lancements
Résolu/Fermé- Programme plante au bout d'un certain nombre de lancements
- Programme au démarrage windows 10 - Guide
- Lancer un programme au demarrage - Guide
- Nombre facile - Télécharger - Outils professionnels
- Forcer la fermeture d'un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
7 réponses
Pas évident de trouver l'erreur et je n'avais pas envie de m'essayer ...
Tu peux éliminer une cause de boucle infinie en modifiant la fonction suivante:
# DEF DU TOUR D'UN UTILISATEUR, ICI SIMULE PAR DES COUPS ALEATOIRES ENTRE 1 ET 3
def tour_utilisateur(Nb_batons):
verification = False
if Nb_batons != 0 :
essais = 0
while verification == False and essais < 1000:
essais += 1
batons = random.randint(1,3)
if batons <= Nb_batons:
verification = True
return batons if essais < 1000 else Nb_batons
J'ai modifié cette boucle pour la simplifier:
while (Nb_test-1) % 4 != 0 :
V3 = True
Nb_test = Nb_batons
if J1[-1] + J2[-1] != 4: # Tu ne veux pas que la somme soit 4 ?
right_move = False
batons = random.randint(1,3)
Nb_test -= batons
else :
batons = 2
break
J'ai fini par faire un copier-coller de ton code. :)
Avec la modification donnée au début, j'ai pu me rendre au moins une fois jusqu'à 300 et c'est l'ordi qui a gagné. :)
Il se peut qu'on soit malchanceux avec randint() et qu'on ne trouve jamais la bonne réponse.
Il faut se parer contre ce côté aléatoire.
edit: quand on entre dans cette boucle, il est impossible d'en sortir.
Dans tour_utilisateur, je retourne le nombre de batons restants. Ce n'est pas correct.
Et pour donner une chance à l'utilisateur, ce serait mieux de retourner 1 à la place.
J'ai remplacé la boucle ci-haut par ceci:
if (Nb_test-1) % 4 != 0 :
V3 = True
Nb_test = Nb_batons
if J1[-1] + J2[-1] != 4: # Tu ne veux pas que la somme soit 4 ?
right_move = False
batons = [3, 0, 1, 2][Nb_test%4]
Nb_test -= batons
else :
batons = 2
Je n'ai pas trouvé où ça boucle, mais je me rend plus souvent jusqu'à 300.
Il y a sans doute encore un bug dans la stratégie qui fait boucler le programme.
Et cela dépend des choix aléatoires de l'utilisateur.
28 févr. 2023 à 08:12
bonjour,
quand tu partages du code, merci de préciser le langage,comme expliqué ici: https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code
Le programme boucle parfois dans tour(), sans jamais sortir de "while verification == False :" Tu peux facilement déterminer où il boucle en ajoutant des print().
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJ'ai fait dans mon propre code les modifications que j'ai suggérées.
Et effectivement, je boucle toujours dans la fonction tour() et dans la boucle mentionnée par yg_be.
Je crois que j'étais fatigué pour le dernier code. Ceci est plus simple:
if (Nb_test-1) % 4 != 0 :
V3 = True
Nb_test = Nb_batons
if J1[-1] + J2[-1] != 4: # Tu ne veux pas que la somme soit 4 ?
right_move = False
batons = (Nb_test + 3) % 4
Nb_test -= batons
else :
batons = 2
On peut simplifier encore:
if Liste[-1] == 1 :
batons = 3
... les deux autres tests
batons = 4 - Liste[-1]
Plus tu vas simplifier, plus le bug finira par devenir évident.
J'ai modifié le début de la boucle pour limiter le nombre d'essais:
essais = 0
while verification == False :
essais += 1
if essais > 1000:
print("Erreur pour", Nb_batons)
exit()
Ça plante toujours quand Nb_batons est égal à 1
On pourrait afficher plus de variables pour comprendre.