Mon premier petit jeu en python

Morpions

a marqué ce sujet comme résolu.

Coucou les amis, je viens ici vous présenter mon premier petit projet , c’est un Morpions qui se joue pour l’instant 1 contre 1 sur le même pc, mais bientôt vous pourrez jouer en 1 vs IA ou en 1 contre 1 en réseau sans plus tarder je vous link le github : https://github.com/marc123456789/Morpions2

Des mise a jours seront faite de temps en temps pour optimiser le code ( enlever les lignes inutiles ), et sans me donner les ligne de codes donner moi des idée d’amélioration, de maintenance ( cad si il y a un bug me dire ou il est) etc.

Les 2 modes arriveront petit a petit car je suis entrée en terminal et je code que le week-end, pour novembre, les modes seront publié

PS: ceci est un projet d’entrainement pour consolider des bases et m’amuser

Projet suspendu pour l’instant ( manque de temps) Merci d’avance d’avoir lus ce post, Cordialement

+2 -0

Salut :) Ca à l’air bien sympa.

Je viens de cloner le dépot git, mais il manque quelque chose d’important : savoir comment tu nomes les cases de la grille :euh: Parceque si on ne regarde pas le code, on ne sait pas qu’il faut noter "A1" par exemple.

J’ai aussi un problème : la commande "CLS" n’existe pas chez moi :| Je suis sous ArchLinux.

+0 -0

Bonjour, Tu envisages de supprimer les lignes inutiles, voici une suggestion. Tu peux réduire cette portion de code, puisque tu as quasiment 2 fois le même bloc, une fois pour le joueur 1, et une fois pour le joueur 2 :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while True:
    system("CLS")
    grille()
    print("c'est je tour du joueur 1 ({0})".format(j1))
    while True:
        c = input(">")
        if isFree(c.upper()):
            place(c.upper(), j1)
            break
        else:
            continue
    system("CLS")
    if isWin(j1):
        break
    grille()
    print("c'est je tour du joueur 2 ({0})".format(j2))
    while True:
        c = input(">")
        if isFree(c.upper()):
            place(c.upper(), j2)
            break
        else:
            continue
    system("CLS")
    if isWin(j2):
        break

C’est tellement la même chose, que tu as la même faute de frappe sur les 2 messages.

Salut,

Après lecture de ton code, voici quelques pistes d’amélioration :

  • Nommer tes fonctions en accord avec les règles du langage (snake_case) ;
  • Choisir des noms clairs et appropriés (par exemple : autre chose que mode pour une liste de modes, et modes pour le mode choisi) ;
  • Éviter les import *, c’est de plus pénible à la lecture, on ne sait jamais d’où provient une fonction ;
  • Factoriser, partout où c’est possible (ta batterie de if sur le choix du mode peut être largement simplifiée, pareil dans ta fonction isWin) ;
    • Un code avec tant de répétitions est inmaintenable ;
  • Éviter les while True qui ne sont pas justifiés, dans la plupart de tes boucles, tu as une condition de fin identifiable ;
  • Ne pas faire d’appels à system ;
  • Éviter les sleep (rien ne les justifie ici) ;
  • Ne pas faire dépendre ton code de paramètres en dur (comme le nombre et le nom des cases qui est figé dans l’ensemble du programme) ;
  • La méthode __str__ de ta classe Robot ne fonctionne pas correctement.

Merci de vos réponse, je travaille actuellement sur toute vos idée pour améliorer mon programme ( je posterai la mise à jour la semaine prochaine ),

  • Nommer tes fonctions en accord avec les règles du langage (snake_case) ;

Quel règles , pourrais-tu me les nommer enfin développer s’il te plaît

*Ne pas faire dépendre ton code de paramètres en dur (comme le nombre et le nom des cases qui est figé dans l’ensemble du programme) ;

Tu veut dire par la d’enlever les nom des cases ( A1, A2 …) ?

Je viens de cloner le dépot git, mais il manque quelque chose d’important : savoir comment tu nomes les cases de la grille :euh: Parceque si on ne regarde pas le code, on ne sait pas qu’il faut noter "A1" par exemple.

Se sera régler pour la prochaine mise à jour, je vais fonctionner par id (1,2,3 …)

J’ai aussi un problème : la commande "CLS" n’existe pas chez moi :| Je suis sous ArchLinux.

Je l’ai est enlever, pour que tu puisse bien utiliser mon programme

  • Factoriser, partout où c’est possible (ta batterie de if sur le choix du mode peut être largement simplifiée, pareil dans ta fonction isWin) ;
    • Un code avec tant de répétitions est inmaintenable ;

Exactement j’ai mis le moins de if possible , et pour isWin je ne sais toujours pas comment je vais le simplifié, donc se serait bien si tu pouvais me donner quelque piste d’amélioration pour cette fonction

Merci, Cordialement

Re bonjour les amis, je viens de modifier mon code, bon la fonction isWin reste inchangé ( j’en ferai la mise à jour bien après )

Changelog

  • enlèvement de code inutile tels que les sleep et system
  • enlèvement de tous les import * pour une meilleur lecture du code et une meilleur compréhension
  • enlèvement de tous les while True pour les remplacer par des boucle avec de vrai conditions
  • la fonction __str__ de la classe robot.py fonctionne désormais
  • enlèvement de toute les répétitions, et créations de la fonction turn

Merci, Cordialement

Quel règles , pourrais-tu me les nommer enfin développer s’il te plaît

PentPent

Les règles de la PEP8, oui, comme ça a été répondu.

Je ne suis pas un nazi de la PEP8, mais la nomenclature en est la base, qui permet une certaine harmonie entre différents codes Python. On est censé pouvoir voir au nom si l’on a affaire à une fonction ou une classe, par exemple.

Tu veut dire par la d’enlever les nom des cases ( A1, A2 …) ?

PentPent

C’est exactement ce que j’avais en tête.

Ici, tu as un jeu de morpion, dont la grille est plutôt standard et définie. Mais si tu veux proposer une grille plus grande, par exemple, tu fais comment ?

Ce ne sera pas forcément ton souhait, mais là, tout ton code est fortement dépendant de cette taille de grille. Ce qui le rend difficile à maintenir.

Exactement j’ai mis le moins de if possible , et pour isWin je ne sais toujours pas comment je vais le simplifié, donc se serait bien si tu pouvais me donner quelque piste d’amélioration pour cette fonction

PentPent

Tu as peut-être réduit leur nombre, mais on est loin du moins possible. :D

Pour ce qui est d’isWin (qui a disparu de ton dépôt Github au moment où j’écris ces lignes, j’y reviens juste en-dessous) : tu dois pouvoir observer que tu as un motif qui se répète. Celui de vérifier que 3 cases adjacentes appartiennent à un même joueur.

Déjà, si on imagine que tu remplaces tes A1, A2, A3, B1, etc. par leurs équivalents (0, 0), (1, 0), (2, 0), (0, 1), etc. Plus compréhensifs à mon goût (et plus facilement exploitables), on identifie facilement les cas de cases adjacentes.

  • Toutes les cases d’une même ligne i (c’est à dire les cases de type (i, y)) appartiennent à un même joueur ;
  • ou toutes les cases d’une même ligne j (les cases (x, j)) ;
  • la première diagonale, représentée par les cases de type (x, x) ;
  • la seconde diagonale, représentée par les cases de type (x, 2-x).

On réduit déjà par deux le nombre de conditions (en ajoutant deux boucles au passage). Ce serait encore réductible, mais pas forcément avec tes connaissances actuelles. Et c’est déjà un bon début.


Pour en revenir au dépôt, tu as demandé des avis sur ton utilisation de Python, mais pas sur celle de Git.

Au vu de ton historique de commits, j’ai bien l’impression que tu édites tes fichiers directement en ligne depuis l’interface Github. Et que tu as tendance à ajouter des fichiers inutiles sur ton dépôt.

Alors, pour faire simple : travaille localement ! Localement, tu peux faire tout ce que tu veux. Faire des modifications, les tester, faire des commits dans tous les sens, te tromper.

Mais une fois que tu pousses vers le dépôt, qui plus est sur la branche principale, il te faut de préférence avoir quelque chose de propre, et dans un état stable. Quand le corps de ta fonction disparaît pendant que je consulte le code, il y a un problème.

Merci pour ta réponse !! ,

Alors, pour faire simple : travaille localement ! Localement, tu peux faire tout ce que tu veux. Faire des modifications, les tester, faire des commits dans tous les sens, te tromper.

Je travaille localement j’ai juste fait un copier coller de mon code

Tu as peut-être réduit leur nombre, mais on est loin du moins possible. :D

Pour ce qui est d’isWin (qui a disparu de ton dépôt Github au moment où j’écris ces lignes, j’y reviens juste en-dessous) : tu dois pouvoir observer que tu as un motif qui se répète. Celui de vérifier que 3 cases adjacentes appartiennent à un même joueur.

Déjà, si on imagine que tu remplaces tes A1, A2, A3, B1, etc. par leurs équivalents (0, 0), (1, 0), (2, 0), (0, 1), etc. Plus compréhensifs à mon goût (et plus facilement exploitables), on identifie facilement les cas de cases adjacentes.

Toutes les cases d’une même ligne i (c’est à dire les cases de type (i, y)) appartiennent à un même joueur ; ou toutes les cases d’une même ligne j (les cases (x, j)) ; la première diagonale, représentée par les cases de type (x, x) ; la seconde diagonale, représentée par les cases de type (x, 2-x). On réduit déjà par deux le nombre de conditions (en ajoutant deux boucles au passage). Ce serait encore réductible, mais pas forcément avec tes connaissances actuelles. Et c’est déjà un bon début.

J’ai justement réfléchie a un système d’id ( cad faire sa : dict = { (0,0) : "*"} ) et tu ma aider je compte faire une boucle for pour parcourir les ligne et une autre pour les colonne mais pour l’instant faut que j’y reflechisse

+0 -0

Bonjour, je viens comme d’habitude update mon projet:

Changelog

  • Modification de la fonction isWin
  • Ajout de la fonction idInToCase servant a transformer un ID (1,2,3) en position (0, 0) par exemple
  • nouveau système de quadrillage, voir fichier Data.py
  • ajout de la ligne os.system("pause") pour pouvoir exécuter mon programme plus librement
  • Modification de la fonction turn pour la renommer en onTurn

Voila, pour le mode réseau, j’espère le finir pour la semaine prochaine, sûr-ce à bientôt, Cordialement

Remplace ton os.system("pause") par un input("Appuyez sur ENTRÉE pour continuer").

N’utilise jamais os.system. D’une façon générale, n’utilise jamais les fonctions du module os sans être absolument certain d’en avoir besoin. Ce module wrappe tous les appels système : un debutant en Python ne devrait jamais avoir besoin de les utiliser explicitement.

+3 -0

Remplace ton os.system("pause") par un input("Appuyez sur ENTRÉE pour continuer").

N’utilise jamais os.system. D’une façon générale, n’utilise jamais les fonctions du module os sans être absolument certain d’en avoir besoin. Ce module wrappe tous les appels système : un debutant en Python ne devrait jamais avoir besoin de les utiliser explicitement.

nohar

Voila c’est fait

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte