IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Réaliser un Flipper sur pyhton


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Réaliser un Flipper sur pyhton
    Bonjour,

    Je cherche à créer un flipper avec python. Je ne suis pas très douée !
    En, fait nous avons créer noter interface graphique avec le flipper, ainsi que la balle. Au début l'utilisateur doit entrer les positions et largeurs des 3 différents obstacles (matérialisés par des segments horizontaux) ainsi que les dimensions du flipper.
    Notre balle doit partir avec un angle de 45 degrès. Celle-ci ne bouge pas quand nous lançons le programme.

    Voici notre programme (sans les interfaces graphiques,juste pour le mouvement de la balle):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    ######### Les tests #####################
     
    #on teste si la balle va toucher un obstacle vertical
    #xb et yb sont les coordonnees de la balle
    #xmax,ymax,xmin,ymin sont les extrémités du flipper
     
    ######### Les tests #####################
     
    #on teste si la balle va toucher un obstacle vertical
    #xb et yb sont les coordonnees de la balle
    #xmax,ymax,xmin,ymin sont les extrémités du flipper
     
    def touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin):                
        if xb==xmax or xb==xmin:#si touche les bords verticaux du flipper
            alpha=pi-alpha #si la balle touche un bord, elle repart symétriquement donc l'angle change
            xb=xb+cos(alpha)
            yb=yb+sin(alpha)
            return 1
     
    #on teste si la balle touche un coin du flipper
        elif xb==xmax and yb==ymin or xb==xmax and yb==ymax or xb==xmin and yb==ymin or xb==xmin and yb==ymax:
            alpha=pi+alpha #si elle touche, elle repart en sens inverse avec le même angle
            xb=xb+cos(alpha)
            yb=yb+sin(alpha)
            return -1
        else:
            return 0
     
    #on teste si la balle touche des obstacles horizontaux (bords horizontaux du flipper ou les plots(segments)
     
    def touche_obstacle_h(xb,yb,listeplot,ymin,ymax):
        if yb==ymin or yb==ymax:#si ca touche les bords horizontaux du flipper
             alpha=-alpha
             xb=xb+cos(alpha)
             yb=yb+cos(alpha)   
             return 1
        else:
            for i in listeplot: #on teste si ca touche les plots
                a,b,c=i
                if a<=xb<=b and yb==c:
                    alpha=-alpha 
                    xb=xb+cos(alpha)
                    yb=yb+cos(alpha)           
                    return 1
                else:
                    return 0
     
     
     
    def mouvement_balle():
        global xb,yb,alpha,flag    
        while touche_obstacle_h(xb,yb,listeplot,ymin,ymax)==0 and touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin)==0:
    #on voudrait que la balle avance tant qu'elle ne touche ni le flipper, ni les plots
            xb, yb = xb+cos(alpha), yb+sin(alpha)
            interfacejeu.coords(balle,xb,yb,xb+30,yb+30)
        if flag >0:
            root.after(50,mouvement_balle)         # => boucler après 50 millisecondes
     
     
     
    def demarrer():
        "démarrage de l'animation"
        global flag
        if flag ==0:         # pour ne lancer qu'une seule boucle
            flag =1
            mouvement_balle()
     
    def pause():
        "arret de l'animation"
        global flag
        flag =0
     
    ########Programme principal#############
    listeplot=[(x1,xa1,y1),(x2,xa2,y2),(x3,xa3,y3)] #les x sont les abscisses de début des plots, les xa sont leurs abscisses de fin et les y leurs ordonnées
     
    xb, yb = 10, 10 #position initiale de la balle
    alpha=pi/4 
    flag=0
    balle = interfacejeu.create_oval(xb, yb, xb+30, yb+30, width=2, fill='red')



    Bon, j'espère que c'est compréhensible. Sinon je peux répondre à d'autres questions sans problème, c'est la première fois que j'utilise le forum.
    Je pense que nous emboitons mal notre while... Nous ne trouvons pas de solution.
    En vous remerciant par avance de votre aide....

    Bonne journée

    Marion.

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2008
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2008
    Messages : 327
    Points : 257
    Points
    257
    Par défaut
    Bonsoir,

    A première vue... Je dirai que le problème provient de la fonction mouvement_balle... (faut pas croire que je me fiche de vous ^^). Votre probleme est que la balle ne bouge pas, et la seule fonction qui modifie les coordonnées de votre balle, c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    interfacejeu.coords(balle,xb,yb,xb+30,yb+30)
    J'en déduis que cette dernière n'est jamais appelle, donc que la condition de votre while n'est pas respecté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while touche_obstacle_h(xb,yb,listeplot,ymin,ymax)==0 and touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin)==0:
    Ce que je vais vous dire va peut etre parraitre un peu nul, mais la meilleur façon de debugger un programme, c'est de voir en temps réel comment ce déroule le programme... Ne regardé pas à la main, pour ma part, je place des "print" un peu partout dans le programme et je regarde dans la console si tout s'affiche BIEN et dans LORDRE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    def touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin):                
        if xb==xmax or xb==xmin:#si touche les bords verticaux du flipper
            alpha=pi-alpha #si la balle touche un bord, elle repart symétriquement donc l'angle change
            xb=xb+cos(alpha)
            yb=yb+sin(alpha)
            return 1
     
    #on teste si la balle touche un coin du flipper
        elif xb==xmax and yb==ymin or xb==xmax and yb==ymax or xb==xmin and yb==ymin or xb==xmin and yb==ymax:
            alpha=pi+alpha #si elle touche, elle repart en sens inverse avec le même angle
            xb=xb+cos(alpha)
            yb=yb+sin(alpha)
            return -1
        else:
            return 0
     
    #on teste si la balle touche des obstacles horizontaux (bords horizontaux du flipper ou les plots(segments)
     
    def touche_obstacle_h(xb,yb,listeplot,ymin,ymax):
        if yb==ymin or yb==ymax:#si ca touche les bords horizontaux du flipper
             alpha=-alpha
             xb=xb+cos(alpha)
             yb=yb+cos(alpha)   
             return 1
        else:
            for i in listeplot: #on teste si ca touche les plots
                a,b,c=i
                if a<=xb<=b and yb==c:
                    alpha=-alpha 
                    xb=xb+cos(alpha)
                    yb=yb+cos(alpha)           
                    return 1
                else:
                    return 0
     
     
     
    def mouvement_balle():
        print 2
        global xb,yb,alpha,flag    
        while touche_obstacle_h(xb,yb,listeplot,ymin,ymax)==0 and touche_obstacle_v(xb,yb,xmax,ymax,xmin,ymin)==0:
            print 3
            xb, yb = xb+cos(alpha), yb+sin(alpha)
            interfacejeu.coords(balle,xb,yb,xb+30,yb+30)
        if flag >0:
            root.after(50,mouvement_balle)         # => boucler après 50 millisecondes
     
    def demarrer():
        "démarrage de l'animation"
        global flag
        if flag ==0:         # pour ne lancer qu'une seule boucle
            flag =1
            print 1
            mouvement_balle()
    Dans ce petit code réalisé :

    * SI 1 s'affiche, alors la fonction démarre bien et appelle le mouvement de balle, sinon vous avez trouvé votre probleme
    * SI 2 s'affiche et 3 non, alors les condiftions sont pas vérifié

    Placez ensuite des prints dans vos fonctions "touche_obstacle_h" et "touche_obstacle_v" pour voir pourquoi les conditions ne sont pas vrais.

    Sinon, les coordonnées sont biens modifiers (faites un print des coordonnées) et vérifier le fonction d'actualisation de l'affichage...

    J'espere avoir pu aider avec ces tout tout tout petis conseils :s

    Bon courage

    Cordiallement...

    Mickael

Discussions similaires

  1. [HOOK] Problème(s) pour réaliser le tutoriel sur les HOOKS
    Par Rodrigue dans le forum C++Builder
    Réponses: 13
    Dernier message: 27/07/2016, 18h22
  2. Réaliser une arborescence sur plusieurs colonnes
    Par vince16 dans le forum Langage
    Réponses: 1
    Dernier message: 11/11/2006, 12h33
  3. [2.0] Comment réaliser des opérations sur les ensembles ?
    Par Cereal123 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 23/10/2006, 13h01
  4. [ADO.NET]Comment réaliser une relation sur plusieurs champs?
    Par kleomas dans le forum Accès aux données
    Réponses: 3
    Dernier message: 13/03/2006, 12h40
  5. [MySQL] Réaliser une pagination sur un forum
    Par maroweb dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/02/2006, 12h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo