Avis sur mon code

LePandaDebutant -  
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:


#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:

4 réponses

Utilisateur anonyme
 
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.
  • 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.
1
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
Salut, et moi je suis bluffé par la mise en oeuvre de la stratégie gagnante qui utilise le modulo 4.
2
LePandaDebutant
 
Merci pour la réponse, j'apprécie les remarques afin de m'améliorer.
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.
0
Utilisateur anonyme
 
Oui, il reste des fautes d’orthographe.

Si tu en es aux fonctions, pourquoi ne pas en avoir utilisé dans ce code?
0
LePandaDebutant
 
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.
0
Utilisateur anonyme
 
Note que j'ai commencé par écrire
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.
0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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 :
  • 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.


0
LePandaDebutant
 
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é.

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.
0
LePandaDebutant > LePandaDebutant
 
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.
0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720 > LePandaDebutant
 
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
0
jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention   9 720 > jee pee Messages postés 41520 Date d'inscription   Statut Modérateur Dernière intervention  
 
Une autre solution, pour passer de joueur à ordinateur, avec des fonctions jeuOrdi() et jeuJoueur(), suivant la réponse de l'utilisateur sur qui commence, on lance l'une ou l'autre et chacune des fonctions, en dernière instruction si le jeu n'a pas pris fin, lance l'autre, ainsi on boucle
0