Partage
  • Partager sur Facebook
  • Partager sur Twitter

alignement de nombres dans une grille

alignement de f chaines

    2 novembre 2022 à 15:56:13

    Bonjour, j'écris un morpion en python sans module graphique pour le moment, j'ai tout fait mais il me reste un dernier problème au niveau de l'affichage des numéros de case de ma grille. J'ai essayé de formater les chaines avec '^' et j'ai essayé avec rjust() mais aucun moyen de parvenir au résultat que je voudrais obtenir à cause des nombres faisant plus de 2 chiffres (j'ai plusieurs modes : 3x3, 4x4 et 5x5 alors les cases vont jusqu'à 24 puisque je commence à 0).

    Je vous laisse constater, si vous pourriez m'aider ce serait incroyable, merci d'avance pour vos réponses.

    Ma fonction pour afficher la grille

    Ce que ça m'affiche

    -
    Edité par RetroTeens 2 novembre 2022 à 15:58:35

    • Partager sur Facebook
    • Partager sur Twitter
      2 novembre 2022 à 16:21:03

      Poste ton code en entier que je puisse t'aider avec plus de visibilité s'il te plait
      • Partager sur Facebook
      • Partager sur Twitter
        2 novembre 2022 à 16:53:46

        from IPython.display import clear_output
        from time import sleep
        
        
        def creation_grille(n):
            return [['.' for val in range(n)] for ligne in range(n)]
        
        def afficher(grille, n):
            n_case = 0
            for ligne in grille:
                print(('+-'*n*2)+'+')
                for case in ligne:
                    if case == '.':
                        if n_case < 10:
                            print(f'| {n_case} ', end='')
                        else : print(f'|{n_case}', end='')
                    elif case == 'X': print(f'| X ', end='')
                    else: print(f'| O ', end='')
                    n_case+=1
                print('|', end='')
                print()
            print(('+-'*n*2)+'+')
            
        
        def libre(grille, i, j):
            return grille[i][j] == '.'
        
        def demander(grille, n):
            dem = int(input('Sur quelle case vide voulez-vous jouer ?'))
            i, j = dem//n, dem%n
            while not libre(grille, i, j):
                dem_bis = int(input("La case n'est pas libre, rejouez."))
                i, j = dem_bis//n, dem_bis%n
            return (i, j)
        
        def placer(grille, i, j, symbole):
            grille[i][j] = symbole
        
        def test_l(grille, i, n):
            return all(val == grille[i][0] != '.' for val in grille[i])
        
        def test_c(grille, j, n):
            for i in range(n-1):
                if not grille[i][j] == grille[i+1][j]: return False
            return True
        
        def test_d1(grille, n):
            for i in range(n-1):
                if not grille[i][i] == grille[i+1][i+1] != '.' : return False
            return True
        
        def test_d2(grille, n):
            for i in range(n-1):
                if not grille[i][n-1-i] == grille[i+1][n-1-i-1] != '.' : return False
            return True
        
        def nulle(grille, n):
            for ligne in range(n):
                for colonne in range(ligne):
                     if libre(grille, ligne, colonne) : return False
            return True
                
        def test(grille, i, j, n):
            return test_d1(grille, n) or test_d2(grille, n) or test_l(grille, i, n) or test_c(grille, j, n)
        
        def partie():
            
            mode = int(input("1. 3x3\n2. 4x4\n3. 5x5\n\n"))
            clear_output(wait=False)
            n = 0
            if mode == 1 : n = 3
            elif mode == 2 : n = 4
            elif mode == 3 : n = 5
            elif mode == 10 : n = 10
            else : clear_output(wait=False) ; print('Choisissez un mode de jeu') ; mode = int(input("1. 3x3\n2. 4x4\n3. 5x5\n\n"))
            
            grille = creation_grille(n)
            while True:
                #Tour Joueur 1
                
                print('***********************\nAu tour du Joueur 1 (X)\n***********************\n')
                afficher(grille, n)
                print('')
                i, j = demander(grille, n)
                placer(grille, i, j, 'X')
                print('')
                if test(grille, i, j, n): return print('Victoire ! Bravo Joueur 1')
                if nulle(grille, n): return print("Egalité ! Pas de vainqueur..")
                sleep(0.5)
                clear_output(wait=False)
                
                #Tour Joueur 2
                
                print('***********************\nAu tour du Joueur 2 (O)\n***********************\n')
                afficher(grille, n)
                print('')
                i, j = demander(grille, n)
                placer(grille, i, j, 'O')
                print('')
                if test(grille, i, j, n): return print('Victoire ! Bravo Joueur 2')
                if nulle(grille, n): return print("Egalité ! Pas de vainqueur..")
                sleep(0.5)
                clear_output(wait=False)
                      
        partie()
        • Partager sur Facebook
        • Partager sur Twitter
          2 novembre 2022 à 17:59:52

          ça affiche ce que tu demandes 

          if n_case < 10:
              print(f'| {n_case} ', end='')
          else:
              print(f'|{n_case}', end='')

          tu supprimes les 2 espaces à gauche et à droite du nombre, ce qui fait que ta case est d'une taille de 2 caractères.

          une façon de faire est d'utiliser les possibilité de f-string

          print(f'|{n_case:^3}',end='')

          qui centrera sur les unités ( https://docs.python.org/3/library/string.html#grammar-token-format-spec-align )


          • Partager sur Facebook
          • Partager sur Twitter
            3 novembre 2022 à 22:32:08

            Bon je suis arrivé à un certain résultat mais moi je voudrais non seulement que les délimitations des cases soient alignées mais que les nombres supérieurs à 9 soient centrés au milieu de la case.

            Mon résultat :

            J'ai juste modifié mon code comme ci-dessous :

            if n_case < 10:
               print(f'| {n_case} ', end='')
            else : print(f'| {n_case}', end='')



            -
            Edité par RetroTeens 3 novembre 2022 à 22:33:09

            • Partager sur Facebook
            • Partager sur Twitter
              3 novembre 2022 à 23:15:57

              Je ne pense pas que cela soit possible en mode texte.
              • Partager sur Facebook
              • Partager sur Twitter

              Python c'est bon, mangez-en. 

                3 novembre 2022 à 23:40:58

                Bonjour.

                C´est juste impossible, cela reviendrait à dire que l´on peut diviser un caractère en deux.

                • Partager sur Facebook
                • Partager sur Twitter

                PB68

                  4 novembre 2022 à 11:16:35

                  centrer au milieu un chiffre à 2 caractères sur un espace de 3 caractères ça va être dur, il sera forcément coller à droite au à gauche (en mode texte); tu peux passer à un espace à 4 caractères si tu veux toujours laisser au moins un espace de chaque côté, mais bon.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 novembre 2022 à 12:04:22

                    umfred a écrit:

                    centrer au milieu un chiffre à 2 caractères sur un espace de 3 caractères ça va être dur, il sera forcément coller à droite ou à gauche (en mode texte); tu peux passer à un espace à 4 caractères si tu veux toujours laisser au moins un espace de chaque côté, mais bon.

                    Ouais bah du coup je vais laisser comme ça, je pense pas que le prof me pénalisera pour si peu sachant que c'est impossible puis j'ai fini une version tkinter qui marche super bien alors pas grave. Merci quand même pour vos réponses.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 novembre 2022 à 18:51:58

                      umfred a écrit:

                      centrer au milieu un chiffre à 2 caractères sur un espace de 3 caractères ça va être dur, il sera forcément coller à droite au à gauche (en mode texte); tu peux passer à un espace à 4 caractères si tu veux toujours laisser au moins un espace de chaque côté, mais bon.


                      Oui, ça ira alors pour les nombres à 2 caractères mais le problème se reposera pour les chiffres --> 3 espaces à diviser en 2 !!!

                      -
                      Edité par PB68 5 novembre 2022 à 1:38:37

                      • Partager sur Facebook
                      • Partager sur Twitter

                      PB68

                      alignement de nombres dans une grille

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown