Forum Programmation.python Problème d'affichage de chiffres jeu squaro Python

Posté par  . Licence CC By‑SA.
2
16
mar.
2014

Bonjour à tous !

Je suis en Terminale S et je suis en option ISN. Depuis le début de l'année scolaire je développe une application avec le langage de programmation Python, il s'agit du jeu "Squaro". Depuis le début de l'année j'ai bien avancé. En effet, pour l'instant j'ai crée une fenêtre graphique qui ressemble à ceci :

Pour le moment j'ai réussi à afficher les chiffres, les cercles et les carrés. Mais le problème c'est que je génère les chiffres (compris entre 0 et 4) de manière aléatoire, mais avec cette méthode ma grille n'est pas faisable, c'est-à-dire qu'il est impossible de gagner mon jeu.
J'ai donc essayer une autre méthode que voici : (voir "squaro image")

Squaro image

Je crée une matrice "circle". Il s'agit de la matrice qui représente les 36 cercles de ma fenêtre graphique. Un cercle séléctionné vaut 1, et un cercle non séléctionné vaut 0 :

global circle

circle = [[random.randrange(0,1) for i in range(0,6)] for j in range(0,6)]

Lorsque on clique sur le cercle en haut gauche :

circle[0][0] = 1

Je crée une matrice "chiffre". Il s'agit de la matrice qui représente les 25 chiffres (compris entre 0 et 4) à l'intérieur des cases :

chiffre = [[0 for i in range(0, 5)] for j in range(0, 5)]

Affichage des 25 chiffres :

xLabel1 = 50
yLabel1 = 50
for i in range (0,5):

for j in range(0,5):

chiffre[i][j] = circle[i][j] + circle[i][j+1]+circle[i+1][j]+circle[i+1][j+1]
label = policeDeTexte.render(str(chiffre[i][j]), True, (0, 0, 0))
fenetre.blit(label, (xLabel1, yLabel1))

Mais avec cette méthode il n'y a que des zéros qui s'affichent, et donc la grille n'est pas jouable. J'espère que quelqu'un va pouvoir m'aider.

Merci d'avance de votre aide

  • # Mauvais calcul de circle

    Posté par  . Évalué à 2. Dernière modification le 16 mars 2014 à 20:09.

    Salut,

    Le problème des zéro vient que tu n'as que des 0 dans la variable circle. Regardes la doc pour la méthode randrange que tu utilises :

    random.randrange(start, stop[, step])
        Return a randomly selected element from range(start, stop, step). This is equivalent to choice(range(start, stop, step)), but doesn’t actually build a range object.
    

    Choice choisi un élément au hasard dans une séquence. Mais ce qui est important pour ton code c'est que ton randrange(0,1) choisi au hasard un élément dans la séquence d'un seul élément [0]. En effet range(0, 1) renvoie [0]. C'est facile a tester dans la console python.

    Tu devrais essayer d'autres valeurs de paramètres.

    • [^] # Re: Mauvais calcul de circle

      Posté par  . Évalué à 1.

      Bien sûr il y a peut-être d'autres erreurs. Je n'ai pas cherché à être exhaustif.

      Peut-être es-tu déçu de ma réponse ? Ou alors elle n'est pas à la hauteur des standards de qualité de linuxfr. Mais quoiqu'il en soit je mérite certainement ce silence et cette solitude.

      • [^] # Re: Mauvais calcul de circle

        Posté par  . Évalué à 1.

        Je suis vraiment désolé j_m, je n'ai pas été alerté de ta réponse par mail, je ne viens de la voir que maintenant…
        Bref, donc j'ai suivi ton conseil et j'ai donc modifié la matrice circle, maintenant j'ai mis comme suit:
        circle = [**random.randrange(0, 2)** for i in range(0, 6)] for j in range(0,6)]

        Et maintenant ça marche donc merci beaucoup !

        Au fait tant que j'y suis, j'aurais besoin de ton aide pour autre chose. En effet je voudrais afficher un chronomètre qui indique le temps écoulé depuis le début de la partie sur ma fenêtre graphique, j'ai donc écrit ceci :

        sec = 0

        min=0

        while sec < 60:

        labelMin = mapolice.render(str(min), True, (0, 0, 0))
        labelSec = mapolice.render(str(sec), True, (0, 0, 0))
        screen.blit(labelMin, (x,y))
        screen.blit(labelSec, (x2, y2))
        time.sleep(1)
        sec +=1
        if sec == 60:
        min += 1
        sec = 0
        Mais ça ne marche pas, est-ce que t'aurais une solution à me proposer ?
        Merci d'avance

        • [^] # Re: Mauvais calcul de circle

          Posté par  . Évalué à 2.

          De mon côté si je reprend ton code, que je simplifie pour l'exécuter chez moi, ben ça marche:

          Voici ce que j'exécute:

          import time
          
          sec = 0
          min=0
          
          while sec < 60:
               time.sleep(1)
               sec +=1
               if sec == 60:
                   min += 1
                   sec = 0
               print "{0}:{1}".format(min, sec)

          Et ça donne une belle suite qui est itérée chaque seconde:

          0:1
          0:2
          0:3
          0:4
          ...
          0:59
          1:0
          1:1
          1:2

          Le problème doit venir de tes méthodes graphiques, que je ne connais pas.

          • [^] # Re: Mauvais calcul de circle

            Posté par  . Évalué à 2.

            Notes qu'il faudrait peut-être que tu décrives plus en détail le problème que tu as obtenu.

            Si par exemple tout se bloque quand tu utilises sleep, c'est normal. C'est sa fonction. Mais comme tu t'en doutes, tu n'es pas le premier à vouloir implémenter un timer et ce problème peut être contourné.

  • # Re : Chronomètre

    Posté par  . Évalué à 1. Dernière modification le 03 avril 2014 à 13:47.

    J'ai le même problème quand j'exécute ton code(avec la méthode print "{0}:{1}".format(min, sec)) et quand j'exécute le mien (avec la méthode screen.blit(labelMin, (x,y))). C'est-à-dire que tout se bloque mais je n'ai aucune erreur qui apparaît. Mais tu as raison cela doit être du au fait que j'utilise sleep. Donc coment je fais pour contourner ce problème ?

    • [^] # Re: Re : Chronomètre

      Posté par  . Évalué à 1. Dernière modification le 03 avril 2014 à 21:20.

      Il faut utiliser les threads. C'est une notion avancée qu'on n'aborde pas dans un cours d'introduction, normalement.

      En fait au sein d'un même programme tu peux lancer des fonctions qui seront indépendantes comme si elles étaient dans des programmes différents. La méthode start_new_thread te permet de faire ça pour les programmes en mode console. Souvent les bibliothèques graphiques ont leurs propres méthodes pour faire ça.

      Voici un exemple avec start_new_thread:

      import time
      
      import thread
      
      def showTime():
          sec = 0
          min=0
          while 1==1:
              time.sleep(1)
              sec +=1
              if sec == 60:
                  min += 1
                  sec = 0
              print "\t{0}:{1}".format(min, sec)
      
      #On lance la fonction dans un thread indépendant
      thread.start_new_thread(showTime, ())
      
      sec = 0
      min=0
      while 1==1:
          #Les deux sleep fonctionnent dans des thread indépendants
          time.sleep(3)
          sec +=1
          if sec == 60:
              min += 1
              sec = 0
          print "{0}:{1}".format(min, sec)

      Donc quand tu exécutes, tu vois que le programme n'attend pas que showTime se soit terminé pour passer à la suite. C'est très différent de ce que tu aurais obtenu sans la méthode start_new_thread. C'est comme si il y avait deux programmes qui s'exécutaient à leur rythme dans des fenêtres séparées sans se connaître.

      Il y a moyen de simuler ça sans passer par les threads. Il faudrait alors lancer toutes tes méthodes dans la boucle while. C'est intéressant à essayer aussi.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.