Avis sur mon code
LePandaDebutant
-
jee pee Messages postés 41520 Date d'inscription Statut Modérateur Dernière intervention -
jee pee Messages postés 41520 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour, Je suis un étudiant en informatique et mon professeur m'a donné un projet à réaliser.
j'ai fait le code du projet et le jeu fonctionne mais comment vous allez le voir dans mon code je suis un débutant...
Je cherche a avoir des avis pour savoir si mon code est bien écris afin que des tiers personne puisse le comprendre. Et si vous avez des remarques à faire dessus où des idées d'améliorations je suis tout preneur.
Voici mon code:
Merci d'avoir lu mon message et j'espère avoir une réponse positive de votre part
Bien à vous
j'ai fait le code du projet et le jeu fonctionne mais comment vous allez le voir dans mon code je suis un débutant...
Je cherche a avoir des avis pour savoir si mon code est bien écris afin que des tiers personne puisse le comprendre. Et si vous avez des remarques à faire dessus où des idées d'améliorations je suis tout preneur.
Voici mon code:
#Voici le code pour le jeu des amulettes import random #importation de la bibliotheque random #Introduction du jeu ainsi que des règles print('Bienvenue dans le jeu des amulettes') print('Souhaitez-vous apprendre les règles du jeu ? taper 1 pour oui, 0 pour non') regle=int(input()) while regle!=1 and regle!=0: print('Veuillez taper 1 ou 0') regle=int(input()) if regle==1: #condition pour savoir si la personne veut apprendre les règles print('Les règles du jeu des amulettes est très simple.') print('Un nombre d amulettes entre 15 et 30 est tiré au sort.') print('chacun a sont tour va pourvoir retirer 1 à 3 amulettes.') print('Celui qui arrive a retirer la ou les dernieres amulettes a gagné!') #Variable rejouer=1 computer=0 nbrjoueur=0 while rejouer==1: #boucle qui permet de rejouer tant que rejouer vaut 1, de base rejouer vaut 1 nombreAmulette=random.randint(15,30)#génération du nombre d'amulette aléatoire entre 15 et 30 print('Souhaitez vous jouer en premier ? 1 pour oui 0 pour non') Premiertour=int(input()) while nombreAmulette!=0: #Boucle qui permet de rejouer les tours tant que le nombre d'amulette ne vaut pas 0 while Premiertour!=0 and Premiertour!=1:#Boucle qui empeche d'écrire n'importe quoi print('Veuillez ecrire 0 ou 1') Premiertour=int(input()) if Premiertour==1: #Condition si le joueur choisi le premier tour print('Choissisez un nombre entre 1 et 3 d amulette a retirer') print('il y a',nombreAmulette,'amulettes') joueur=int(input()) while joueur!= 1 and joueur!=2 and joueur!=3: #Boucle qui empeche d'écrire autre chose que 1,2 ou 3 afin de ne pas casser le jeu print('veuillez entrez un nombre entre 1 et 3') joueur=int(input()) nombreAmulette=nombreAmulette-joueur nbrjoueur=joueur print('il reste',nombreAmulette) elif Premiertour==0: #Condition si le joueur choisi de jouer en deuxième print('il y a',nombreAmulette,'amulettes') #Bloc de if qui permet a l'ordinateur d'utiliser la stratégie gagnante et en cas d'imposibiité de l'appliqué, un chiffre aléatoire entre 1 et 3 est choisis if (nombreAmulette-1)%4==0: #Condition afin d'appliquer la stratégie gagnante avec 1 amulette prise nombreAmulette=nombreAmulette-1 computer=computer+1 print('ordinateur a retirer 1') print('il reste',nombreAmulette) elif (nombreAmulette-2)%4==0: #Condition afin d'appliquer la stratégie gagnante avec 2 amulette prise computer=computer+2 nombreAmulette=nombreAmulette-2 print('ordianteur a retirer 2') print('il reste',nombreAmulette) elif (nombreAmulette-3)%4==0: #Condition afin d'appliquer la stratégie gagnante avec 3 amulette prise computer=computer+3 nombreAmulette=nombreAmulette-3 print('ordianteur a retirer 3') print('il reste',nombreAmulette) else: #Quand l'ordinateur ne sait pas appliqué la stratégie gagnante b=random.randint(1,3) #nombre aléatoire entre 1 et 3 choisi computer=computer+b nombreAmulette=nombreAmulette-b print('ordianteur a retirer',b) print('il reste',nombreAmulette) #Boucle qui permet au jeu de se dérouler si le joueur a jouer en premier while Premiertour==1: #Le joueur a commencer en premier donc c'est au tour de la machine #TOUR DE LA MACHINE if (nombreAmulette-1)%4==0: computer=computer+1 nombreAmulette=nombreAmulette-1 print('ordinateur a retirer 1') print('il reste',nombreAmulette) if nombreAmulette==0: #Condition en cas de victoire la boucle est cassé et un message de gagnant s'affiche print('VOUS AVEZ PERDU') break elif (nombreAmulette-2)%4==0: computer=computer+2 nombreAmulette=nombreAmulette-2 print('ordinateur a retirer 2') print('il reste',nombreAmulette) if nombreAmulette==0: #Condition en cas de défaite la boucle est cassé et un message de perdant s'affiche print('VOUS AVEZ PERDU') break elif (nombreAmulette-3)%4==0: computer=computer+3 nombreAmulette=nombreAmulette-3 print('ordianteur a retirer 3') print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break else: b=random.randint(1,3) computer=computer+b nombreAmulette=nombreAmulette-b print('ordinateur a retirer',b) print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break #TOUR DU JOUEUR print('Choissisez un nombre entre 1 et 3 d amulette a retirer') joueur=int(input()) while joueur!=1 and joueur!=2 and joueur!=3: #La vérification est toujours la pour empecher le joueur d'ecrire n'importe quoi print('veuillez entrez un nombre entre 1 et 3') joueur=int(input()) nombreAmulette=nombreAmulette-joueur nbrjoueur=nbrjoueur+joueur print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ GAGNÉ') break #Boucle qui permet au jeu de se dérouler si l'ordianteur a jouer en premier while Premiertour==0: #TOUR DU JOUEUR print('Choissisez un nombre entre 1 et 3 d amulette a retirer') joueur=int(input()) while joueur!=1 and joueur!=2 and joueur!=3: #vérification print('veuillez entrez un nombre entre 1 et 3') joueur=int(input()) nombreAmulette=nombreAmulette-joueur nbrjoueur=nbrjoueur+joueur print('il reste',nombreAmulette) if nombreAmulette==0: #condition de victoire print('VOUS AVEZ GAGNÉ') break #TOUR DE LA MACHINE if (nombreAmulette-1)%4==0: computer=computer+1 nombreAmulette=nombreAmulette-1 print('ordinateur a retirer 1') print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break elif (nombreAmulette-2)%4==0: computer=computer+2 nombreAmulette=nombreAmulette-2 print('ordinateur a retirer 2') print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break elif (nombreAmulette-3)%4==0: computer=computer+3 nombreAmulette=nombreAmulette-3 print('ordinateur a retirer 3') print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break else: b=random.randint(1,3) computer=computer+b nombreAmulette=nombreAmulette-b print('ordinateur a retirer',b) print('il reste',nombreAmulette) if nombreAmulette==0: print('VOUS AVEZ PERDU') break #Petit bonus qui permet de savoir combien d'amulette chacun a retirer au cour de la partie print('ordinateur a retirer',computer,'amulettes au total') print('le joueur a retirer',nbrjoueur,'amulettes au total') print('souhaitez-vous rejouer ? 1 pour oui et 0 pour non') rejouer=int(input()) #Permet de rejouer si on marque 1
Merci d'avoir lu mon message et j'espère avoir une réponse positive de votre part
Bien à vous
Configuration: Windows / Chrome 96.0.4664.110
A voir également:
- Avis sur mon code
- Code ascii - Guide
- Code puk bloqué - Guide
- Code activation windows 10 - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
- Code blocks - Télécharger - Langages
4 réponses
Bonjour
C'est difficile de te dire si ton code est bien ou pas car on ne sait pas ce que ton prof t'as enseigné.
Imagine, ton prof te demande l'aire d'un rectangle de 3 cm de largeur et 4 de longueur. Tu dessines un rectangle de cette taille et un quadrillage de 1 cm de coté, puis tu comptes les carrés. Si tu es en CE2 c'est super bien, si tu es en 3eme beaucoup moins.
Sauf que là, on ne peut pas savoir où tu te situe.
Je vais donc faire des commentaires très génériques.
Bref, si tu es vraiment un tout tout débutant c'est carrément pas mal.
C'est difficile de te dire si ton code est bien ou pas car on ne sait pas ce que ton prof t'as enseigné.
Imagine, ton prof te demande l'aire d'un rectangle de 3 cm de largeur et 4 de longueur. Tu dessines un rectangle de cette taille et un quadrillage de 1 cm de coté, puis tu comptes les carrés. Si tu es en CE2 c'est super bien, si tu es en 3eme beaucoup moins.
Sauf que là, on ne peut pas savoir où tu te situe.
Je vais donc faire des commentaires très génériques.
- d'abord tu dis (j'ai pas essayé) qu'il marche, c'est très bien
- tu as fait un effort de rédaction dans les textes d'interface, c'est pas souvent le cas donc il faut le souligner. Pourtant il reste quand même un certain nombre de fautes à corriger
- les noms de variables sont explicites
- le code est plutôt bien commenté
Bref, si tu es vraiment un tout tout débutant c'est carrément pas mal.
Oui, il reste des fautes d’orthographe.
Si tu en es aux fonctions, pourquoi ne pas en avoir utilisé dans ce code?
Si tu en es aux fonctions, pourquoi ne pas en avoir utilisé dans ce code?
Oui, excusez-moi le français n'a jamais été très bon avec moi ^^
Je comptais faire 2 fonctions, une pour le tour de la machine et une autre pour le tour du joueur.
Le code que j'ai envoyé est mon code "brut"' (premier essai), je compte justement l'améliorer avec des fonctions par la suite.
J'avais juste besoin d'un avis externe pour voir si mon code était bien clair pour d'autre personne vu que je vais devoir le présenté face à mon professeur.
Je comptais faire 2 fonctions, une pour le tour de la machine et une autre pour le tour du joueur.
Le code que j'ai envoyé est mon code "brut"' (premier essai), je compte justement l'améliorer avec des fonctions par la suite.
J'avais juste besoin d'un avis externe pour voir si mon code était bien clair pour d'autre personne vu que je vais devoir le présenté face à mon professeur.
Note que j'ai commencé par écrire
C'est souvent négligé par les codeurs qui pensent que l'important c'est l'algorithme. Mais l'utilisateur ne voit que ça.
C'est un peu comme la coque d'un téléphone, le fabriquant peut faire tous les efforts technologiques qu'il veut, si le téléphone est moche c'est la première chose que voit l'acheteur.
C'est donc un point à essayer d'améliorer.
Pour moi c'est une mauvaise stratégie, car créer des fonctions va t'obliger à plus qu'un simple couper coller.
Par endroit, tu devras peut-être revoir un certain nombre de choses.
Autant architecturer ton code dès le début autour de fonctions.
tu as fait un effort de rédaction dans les textes d'interface, c'est pas souvent le cas donc il faut le souligner.Ok ce n'est pas ton fort, mais c'est bien mieux que beaucoup de codes qu'on voit passer ici.
C'est souvent négligé par les codeurs qui pensent que l'important c'est l'algorithme. Mais l'utilisateur ne voit que ça.
C'est un peu comme la coque d'un téléphone, le fabriquant peut faire tous les efforts technologiques qu'il veut, si le téléphone est moche c'est la première chose que voit l'acheteur.
C'est donc un point à essayer d'améliorer.
Le code que j'ai envoyé est mon code "brut"' (premier essai), je compte justement l'améliorer avec des fonctions par la suite.
Pour moi c'est une mauvaise stratégie, car créer des fonctions va t'obliger à plus qu'un simple couper coller.
Par endroit, tu devras peut-être revoir un certain nombre de choses.
Autant architecturer ton code dès le début autour de fonctions.
Ton jeu fonctionne bien. C'est effectivement la première chose que l'on demande à un programme.
Quand on observe ton code on y voit le déroulement de ta pensée et de algorithme qui en découle. Tu as bien décortiqué la problématique et tous les cas. Et ce sont tous ces cas que tu as directement codé. Mais il te manque une étape finale, la synthèse, regrouper toutes les séquences identiques. Pour faire un code le plus simple possible. Dans le cas présent on pourrait probablement diviser par 3 ou 4 la longueur du code.
Tu traites :
Donc au final on a 3 fois la saisie du jeu du joueur et 3 fois la séquence de calcul du meilleur choix pour l'ordinateur, et une multitude de tests pour savoir si le jeu est terminé.
On ne devrait avoir qu'une fois la saisie du joueur et une fois le calcul du jeu de l'ordinateur. Souvent les programmeurs traitent le premier cas et le dernier cas d'une itération de façon particulière. Alors que c'est rarement nécessaire.
On peut imaginer quelque chose comme :
J'avais mis un petit exemple sur 6 lignes sur comment on pourrait procéder, mais je te laisse d'abord y réfléchir. Et cela n'utilise pas des fonctions pour déporter le problème en appelant 3 fois une fonction joueur et 3 fois une fonction ordinateur.
Dans le même esprit, pour simplifier, regrouper le code dupliqué, si on observe le traitement du calcul de l'ordinateur, on a 4 cas à traiter avec 4 valeurs (1,2,3 et random(1,3)) il est plus que probable que l'on peut trouver une boucle qui traite ces valeurs plutôt que de dupliquer 4 fois 6 lignes identiques.
Plus factuellement :
Quand on observe ton code on y voit le déroulement de ta pensée et de algorithme qui en découle. Tu as bien décortiqué la problématique et tous les cas. Et ce sont tous ces cas que tu as directement codé. Mais il te manque une étape finale, la synthèse, regrouper toutes les séquences identiques. Pour faire un code le plus simple possible. Dans le cas présent on pourrait probablement diviser par 3 ou 4 la longueur du code.
Tu traites :
- le joueur qui joue en premier
- l'ordinateur qui joue en premier, et d'ailleurs sur ces 2 séquences spécifiques comme on démarre avec au moins 15 amulettes et que l'on ne peut en retirer qu'au maximum 3 tu t'es dit pas la peine de tester s'il en reste 0 ;-)
- le joueur qui joue en second puis l'ordinateur en troisième et cette boucle se répète jusqu'à la fin
- l'ordinateur qui joue en second et le joueur qui joue en troisième et cette boucle se répète jusqu’à la fin
Donc au final on a 3 fois la saisie du jeu du joueur et 3 fois la séquence de calcul du meilleur choix pour l'ordinateur, et une multitude de tests pour savoir si le jeu est terminé.
On ne devrait avoir qu'une fois la saisie du joueur et une fois le calcul du jeu de l'ordinateur. Souvent les programmeurs traitent le premier cas et le dernier cas d'une itération de façon particulière. Alors que c'est rarement nécessaire.
On peut imaginer quelque chose comme :
J'avais mis un petit exemple sur 6 lignes sur comment on pourrait procéder, mais je te laisse d'abord y réfléchir. Et cela n'utilise pas des fonctions pour déporter le problème en appelant 3 fois une fonction joueur et 3 fois une fonction ordinateur.
Dans le même esprit, pour simplifier, regrouper le code dupliqué, si on observe le traitement du calcul de l'ordinateur, on a 4 cas à traiter avec 4 valeurs (1,2,3 et random(1,3)) il est plus que probable que l'on peut trouver une boucle qui traite ces valeurs plutôt que de dupliquer 4 fois 6 lignes identiques.
Plus factuellement :
- La boucle while Premiertour ligne 34 ne devrait pas être dans la boucle while nombreAmulette mais derrière l'input en 30 ; comme tu le fais sur les autres input()
- computer=0 et nbrjoueur=0 devraient être placés dans la boucle rejouer après la ligne 27, car actuellement quand on rejoue tous les coups sont cumulés les compteurs n'étant pas réinitialisés
- "while nombreAmulette!=0: #Boucle qui permet de rejouer les tours tant que le nombre d'amulette ne vaut pas 0" pas véritablement ce sont les boucles while Premiertour==1 et while Premiertour==0 qui pilotent l’arrêt sur ce compteur, on peut tout simplement supprimer cette boucle cela fonctionne pareil.
- Le joueur peut retirer plus d'amulettes qu'il n'en reste faisant passer le compteur en négatif. Je ne l'ai vu qu'après de très nombreux essais, il faut comprendre comment gagner face à cet ordinateur infernal.
Merci pour votre réponse, j'ai réfléchie à ce que vous avez dit.
J'ai pensé à cette fonction pour le tour de la machine qui utilise une boucle comme vous m'avez suggéré.
J'ai corrigé le code niveau orthographe ainsi que les point que vous avez souligné telles que la boucle ligne 34 qui ne servait pas à grand chose.
Par conte je refléchie toujours a comment faire en sorte d'avoir qu'une fois la saisie d joueur et de l'ordinateur sans pour autant rappeler 3 fois une fonction pour chacun.
J'avais pas pensé que le joueur pouvait aller en négatif, c'est mieux que je fasse une fonction qui empeche cela ou juste une condition suffira ?
Merci encore pour vos réponse et le temps que vous prenez pour me répondre et m'aidez j'apprécie grandement.
J'ai pensé à cette fonction pour le tour de la machine qui utilise une boucle comme vous m'avez suggéré.
def tourpc (x,y): #x est le nombre d'amulette y est le nombre d'amulette avant la boucle y=x while x%4!=0: x=x-1 if x==y-3: x=y-random.randint(1,3) break
J'ai corrigé le code niveau orthographe ainsi que les point que vous avez souligné telles que la boucle ligne 34 qui ne servait pas à grand chose.
Par conte je refléchie toujours a comment faire en sorte d'avoir qu'une fois la saisie d joueur et de l'ordinateur sans pour autant rappeler 3 fois une fonction pour chacun.
J'avais pas pensé que le joueur pouvait aller en négatif, c'est mieux que je fasse une fonction qui empeche cela ou juste une condition suffira ?
Merci encore pour vos réponse et le temps que vous prenez pour me répondre et m'aidez j'apprécie grandement.
def tourpc (x,z): #x est le nombre d'amulette z est le nombre d'amulette soustrait y=x #y est le nombre d'amulette avant la boucle z=1 while x%4!=0: x=x-z z=z+1 if x==(y-4): x=y-random.randint(1,3) break print('il reste',x,'amulettes') print('ordianteur a enlever',z,'amulette')
désolé je me suis rendu compte que la fonction que j'ai mise avant était mauvaise.
Premier coup d’œil : on devrait en faire quelque chose. Mais je détaille et là çà me pique les yeux, je suis perdu, c'est alambiqué. Tu utilises beaucoup trop de variables. Puis comme le faisait remarquer Whismerril il faut utiliser des fonctions à bon escient, en concevant dés le départ le code pour et autour de quelques questions : dans ma fonction, vais-je utiliser des variables globales, des paramètres et des variables locales, quelles/s valeurs/s retourne la fonction, ...
Sans fonction, en imaginant juste des lignes en remplacement de ton code de départ. Tu as nombreAmulette et tu dois trouver jeuOrdinateur. Comme je l'ai écrit sur ma première intervention j'ai beaucoup aimé l'utilisation du modulo. Probablement qu'en faisant l'exercice j'aurais été moins bon sur ce point précis. Mais quand tu me souffles l'idée, je pense que l'on peut résoudre la problématique simplement. En mode texte :
si modulo 4 de nombreAmulette = zéro alors jeuOrdinateur = 1,2 ou 3
sinon jeuOrdinateur = modulo 4 de nombreAmulette
"J'avais pas pensé que le joueur pouvait aller en négatif, c'est mieux que je fasse une fonction qui empeche cela ou juste une condition suffira ? " tu testes déjà la valeur saisie par rapport à 1,2 ou 3 il suffit de rajouter <= nombreAmulette
Pour le jeu alternatif joueur/ordinateur, tu demandes au joueur de choisir qui commence,
donc prochainJoueur=1 si il répond moi, 0 si c'est l'ordinateur.
Tu lances une boucle infinie
- si prochainJoueur = 1, le jeu du joueur, et en fin prochainJoueur=0
- si prochainJoueur = 0, le jeu de l'ordinateur, et en fin prochainJoueur=1
Sans fonction, en imaginant juste des lignes en remplacement de ton code de départ. Tu as nombreAmulette et tu dois trouver jeuOrdinateur. Comme je l'ai écrit sur ma première intervention j'ai beaucoup aimé l'utilisation du modulo. Probablement qu'en faisant l'exercice j'aurais été moins bon sur ce point précis. Mais quand tu me souffles l'idée, je pense que l'on peut résoudre la problématique simplement. En mode texte :
si modulo 4 de nombreAmulette = zéro alors jeuOrdinateur = 1,2 ou 3
sinon jeuOrdinateur = modulo 4 de nombreAmulette
"J'avais pas pensé que le joueur pouvait aller en négatif, c'est mieux que je fasse une fonction qui empeche cela ou juste une condition suffira ? " tu testes déjà la valeur saisie par rapport à 1,2 ou 3 il suffit de rajouter <= nombreAmulette
Pour le jeu alternatif joueur/ordinateur, tu demandes au joueur de choisir qui commence,
donc prochainJoueur=1 si il répond moi, 0 si c'est l'ordinateur.
Tu lances une boucle infinie
- si prochainJoueur = 1, le jeu du joueur, et en fin prochainJoueur=0
- si prochainJoueur = 0, le jeu de l'ordinateur, et en fin prochainJoueur=1
Juste une petite question quand tu dis des fautes à corriger c'est des fautes d'orthographe ?
Et pour te répondre niveau de la matière j'ai commencé fin Septembre l'apprentissage du Python et on s'est arrêté aux fonctions.