Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1230 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Mes questions sur Python

n°2086515
carrion cr​ow
Immortal until my death
Posté le 01-07-2011 à 16:53:16  profilanswer
 

Reprise du message précédent :
Bonjour,

 

Après avoir arrêté python quelques jours pour m'aérer la tête, je me suis dis que j'allais (essayer de) coder le célèbre jeu "Pong". Alors, j'ai réussi à faire un truc qui fonctionne  [:bodette]  mais j'ai galéré avec les self et les transmissions de variables entre fonctions/classe.

 

Il reste des soucis, genre :
- quand on ne peux pas contrôler les deux raquettes en même temps
- parfois il arrive que la balle se "coince" dans la raquette
- la balle a une trajectoire prévisible
- c'est pas très fluide

 

Et des manques :
- pas de jeux contre l'ordi (je n'ai aucune idée de comment faire une IA)
- manque de contrôles (genre commande start/pause/rejouer) ça je vois comment faire
- le bip/bip agaçant au bout de trois rebonds  :D

 

Voici mon code (attention les yeux) Si quelqu'un peut me faire une correction ou me donner quelques conseils pour l'améliorer ou pour que je fasse mieux la prochaine fois

 
Code :
  1. # Jeu Pong
  2. # Python 3
  3. from tkinter import *
  4. class Raquette(object):
  5.     """Créer un rectangle (la raquette) et inclus la méthode de déplacement
  6.     Il faut donner un parametre si on veut jouer à deux. Par défaut, le
  7.     jeu se fait contre un mur.
  8.     """
  9.     def __init__(self, boss, x, y):
  10.         self.boss = boss    # la ref de la fenêtre
  11.         #création d'une raquette
  12.         self.x = x
  13.         self.y = y
  14.         self.raq = boss.create_rectangle(self.x , self.y,
  15.                                          self.x+10, self.y+60, fill='white')
  16.         self.filet = boss.create_line(400, 0, 400, 480, fill='light grey',
  17.                                       dash=(20, 10))
  18.     def monter(self, depl):
  19.         self.y -=10
  20.         if self.y <=0:    # on contrôle que l'on ne sort pas du tableau
  21.             self.y =0
  22.         self.boss.coords(self.raq, self.x, self.y, self.x+10, self.y+60)
  23.     def descendre(self, depl):
  24.         self.y +=10
  25.         if self.y >=420:    # on contrôle que l'on ne sort pas du tableau
  26.             self.y =420
  27.         self.boss.coords(self.raq, self.x, self.y, self.x+10, self.y+60)
  28. class Balle(object):
  29.     """Créer la balle et sa méthode de déplacement"""
  30.     def __init__(self, boss, player1, player2,
  31.                  compteur, scorep1, scorep2):
  32.         self.boss = boss    #ref de la fenêtre
  33.         self.player1 = player1
  34.         self.player2 = player2
  35.         # coordonnées initiales
  36.         self.x, self.y = 400, 240
  37.         self.rayon = 10    # rayon de la balle
  38.         # création de la balle
  39.         self.balle = boss.create_oval(self.x-self.rayon,
  40.                                       self.y-self.rayon,
  41.                                       self.x+self.rayon,
  42.                                       self.y+self.rayon, fill='white')
  43.         # déplacement initial
  44.         self.dx, self.dy = 10, 10
  45.         #compteur
  46.         self.compteur = compteur
  47.         self.scorep1 = scorep1
  48.         self.scorep2 = scorep2
  49.     def move(self):
  50.         "Déplacement de la balle"
  51.         flag =1    # pour controler l'anim'
  52.         self.x += self.dx
  53.         self.y += self.dy
  54.         # On regarde si la balle tape à gauche où à droite
  55.         if self.x <= 0:
  56.             self.x =400    # balle au centre
  57.             self.dx = -self.dx    # renvoi de l'autre côté
  58.             self.scorep2 += 1    # on ajoute un point à p2
  59.             compt = str(self.scorep1) + "   " + str(self.scorep2)
  60.             self.boss.itemconfigure (self.compteur, text=compt)
  61.         if self.x >= 800:
  62.             self.x =400
  63.             self.dx = -self.dx
  64.             self.scorep1 += 1
  65.             compt = str(self.scorep1) + "   " + str(self.scorep2)
  66.             self.boss.itemconfigure (self.compteur, text=compt)
  67.         # contrôle pour mettre fin à la partie
  68.         if self.scorep1 ==5 or self.scorep2 ==5:
  69.             flag =0
  70.             self.boss.create_text(400, 240, text="Game over", fill='white',
  71.                                   font=("Arial", "22" ))
  72.         # Contrôles pour que la balle reste dans la zone (rebonds haut et bas)
  73.         if self.y+self.rayon >=480 or self.y-self.rayon <= 0:
  74.             self.dy = -self.dy
  75.         # pour le rebond sur la raquette de player1
  76.         if self.x-self.rayon <= 30:
  77.             if self.y-self.rayon >= self.player1.y and\
  78.             self.y+self.rayon <= self.player1.y+60:
  79.                 self.dx = -self.dx
  80.         # pour le rebond sur la raquette de player2
  81.         if self.x+self.rayon >= 770:
  82.             if self.y-self.rayon >= self.player2.y and\
  83.                     self.y+self.rayon <= self.player2.y+60:
  84.                 self.dx = -self.dx
  85.         self.boss.coords(self.balle,
  86.                          self.x-self.rayon,
  87.                          self.y-self.rayon,
  88.                          self.x+self.rayon,
  89.                          self.y+self.rayon)
  90.         # Récursivité pour animer la balle
  91.         if flag == 1:
  92.             self.boss.after(40, self.move)
  93. class Application(Frame):
  94.     """Fenêtre principale de l'application"""
  95.     def __init__(self):
  96.         Frame.__init__(self)
  97.         self.master.title(">>> Pong <<<" )
  98.         self.pack()
  99.         self.jeu = Canvas(self, width =800, height =480, background ='black')
  100.         self.jeu.pack()
  101.         self.compteur = self.jeu.create_text(400, 20, text="0   0", fill='white',
  102.                                              font=("Arial", "22" ))
  103.         self.y = 210
  104.         # score des joueurs
  105.         self.scorep1 = 0
  106.         self.scorep2 = 0
  107.         player1 = Raquette(self.jeu, 20, self.y)
  108.         player2 = Raquette(self.jeu, 770, self.y)
  109.         balle = Balle(self.jeu, player1, player2,
  110.                       self.compteur, self.scorep1, self.scorep2)
  111.         # animation de la balle
  112.         balle.move()
  113.         # on guette les touches a et z pour déplacer la raquette
  114.         self.bind_all("a", player1.monter)
  115.         self.bind_all("z", player1.descendre)
  116.         self.bind_all("k", player2.monter)
  117.         self.bind_all("m", player2.descendre)
  118. if __name__ == '__main__':
  119.     Application().mainloop()


Message édité par carrion crow le 01-07-2011 à 16:54:31

---------------
Des piafs en photo
mood
Publicité
Posté le 01-07-2011 à 16:53:16  profilanswer
 

n°2088504
carrion cr​ow
Immortal until my death
Posté le 10-07-2011 à 21:49:52  profilanswer
 

Bonsoir,
 
Je n'ai pas eut de réponses mais je reviens à la charge  :)  
 
J'ai voulu faire un menu d'aide et une fonction pause. Problème, je n'arrive pas à transmettre le flag entre le corps de l'application et la méthode move (ligne 58). Et quand je veux mettre pause, ça n'arrête pas le jeu, ça reboucle move et la balle double de vitesse  :D  
J'ai dû mettre *arg à la méthode displayAide (ligne 160) sinon ça ne fonctionnait pas. C'est du bricolage j'aimerais savoir comment fixer ça.
 
Le code :

Code :
  1. # Le célèbre jeu "Pong" codé par mes soins (enfin, j'ai essayé)
  2. from tkinter import *
  3. class Raquette(object):
  4.     """Créer un rectangle (la raquette) et inclus la méthode de déplacement
  5.     Il faut donner un parametre si on veut jouer à deux. Par défaut, le
  6.     jeu se fait contre un mur.
  7.     """
  8.     def __init__(self, boss, x, y):
  9.         self.boss = boss    # la ref de la fenêtre
  10.         #création d'une raquette
  11.         self.x = x
  12.         self.y = y
  13.         self.raq = boss.create_rectangle(self.x , self.y,
  14.                                          self.x+10, self.y+60, fill='white')
  15.         self.filet = boss.create_line(400, 0, 400, 480, fill='light grey',
  16.                                       dash=(20, 10))
  17.     def monter(self, depl):
  18.         self.y -=10
  19.         if self.y <=0:    # on contrôle que l'on ne sort pas du tableau
  20.             self.y =0
  21.         self.boss.coords(self.raq, self.x, self.y, self.x+10, self.y+60)
  22.     def descendre(self, depl):
  23.         self.y +=10
  24.         if self.y >=420:    # on contrôle que l'on ne sort pas du tableau
  25.             self.y =420
  26.         self.boss.coords(self.raq, self.x, self.y, self.x+10, self.y+60)
  27. class Balle(object):
  28.     """Créer la balle et sa méthode de déplacement"""
  29.     def __init__(self, boss, player1, player2,
  30.                  compteur, scorep1, scorep2):
  31.         self.boss = boss    #ref de la fenêtre
  32.         self.player1 = player1
  33.         self.player2 = player2
  34.         # coordonnées initiales
  35.         self.x, self.y = 400, 240
  36.         self.rayon = 10    # rayon de la balle
  37.         # création de la balle
  38.         self.balle = boss.create_oval(self.x-self.rayon,
  39.                                       self.y-self.rayon,
  40.                                       self.x+self.rayon,
  41.                                       self.y+self.rayon, fill='white')
  42.         # déplacement initial
  43.         self.dx, self.dy = 10, 10
  44.         #compteur
  45.         self.compteur = compteur
  46.         self.scorep1 = scorep1
  47.         self.scorep2 = scorep2
  48.     def move(self):
  49.         "Déplacement de la balle"
  50.         self.flag = 1
  51.         self.x += self.dx
  52.         self.y += self.dy
  53.         # On regarde si la balle tape à gauche où à droite
  54.         if self.x <= 0:
  55.             self.x =400    # balle au centre
  56.             self.dx = -self.dx    # renvoi de l'autre côté
  57.             self.scorep2 += 1    # on ajoute un point à p2
  58.             compt = str(self.scorep1) + "   " + str(self.scorep2)
  59.             self.boss.itemconfigure (self.compteur, text=compt)
  60.         if self.x >= 800:
  61.             self.x =400
  62.             self.dx = -self.dx
  63.             self.scorep1 += 1
  64.             compt = str(self.scorep1) + "   " + str(self.scorep2)
  65.             self.boss.itemconfigure (self.compteur, text=compt)
  66.         # contrôle pour mettre fin à la partie
  67.         if self.scorep1 ==5 or self.scorep2 ==5:
  68.             self.flag =0
  69.             self.boss.create_text(400, 240, text="Game over", fill='white',
  70.                                   font=("Arial", "22" ))
  71.         # Contrôles pour que la balle reste dans la zone (rebonds haut et bas)
  72.         if self.y+self.rayon >=480 or self.y-self.rayon <= 0:
  73.             self.dy = -self.dy
  74.         # pour le rebond sur la raquette de player1
  75.         if self.x-self.rayon <= 30:
  76.             if self.y-self.rayon >= self.player1.y and\
  77.             self.y+self.rayon <= self.player1.y+60:
  78.                 self.dx = -self.dx
  79.         # pour le rebond sur la raquette de player2
  80.         if self.x+self.rayon >= 770:
  81.             if self.y-self.rayon >= self.player2.y and\
  82.                     self.y+self.rayon <= self.player2.y+60:
  83.                 self.dx = -self.dx
  84.         self.boss.coords(self.balle,
  85.                          self.x-self.rayon,
  86.                          self.y-self.rayon,
  87.                          self.x+self.rayon,
  88.                          self.y+self.rayon)
  89.         # Récursivité pour animer la balle
  90.         if self.flag == 1:
  91.             self.boss.after(40, self.move)
  92. class Application(Frame):
  93.     """Fenêtre principale de l'application"""
  94.     def __init__(self):
  95.         Frame.__init__(self)
  96.         self.master.title(">>> Pong <<<" )
  97.         self.pack()
  98.         self.jeu = Canvas(self, width =800, height =480, background ='black')
  99.         self.jeu.pack()
  100.         self.compteur = self.jeu.create_text(400, 20, text="0   0", fill='white',
  101.                                              font=("Arial", "22" ))
  102.         self.y = 210
  103.         self.flag = 0
  104.         self.aide = self.jeu.create_text(400, 100, text='Aide : \nRaquette\
  105. gauche : a pour monter, z pour descendre\nRaquette droite : k pour monter,\
  106. m pour descendre\np : pause, h : aide', fill='white', font =("Arial", "16" ))
  107.         # score des joueurs
  108.         self.scorep1 = 0
  109.         self.scorep2 = 0
  110.         player1 = Raquette(self.jeu, 20, self.y)
  111.         player2 = Raquette(self.jeu, 770, self.y)
  112.         self.balle = Balle(self.jeu, player1, player2,
  113.                       self.compteur, self.scorep1, self.scorep2)
  114.         # animation de la balle
  115.         if self.flag == 1:
  116.             self.balle.move()
  117.         # on guette les touches a et z pour déplacer la raquette
  118.         self.bind_all("a", player1.monter)
  119.         self.bind_all("z", player1.descendre)
  120.         self.bind_all("k", player2.monter)
  121.         self.bind_all("m", player2.descendre)
  122.         self.jeu.bind_all("h", self.displayAide)
  123.         self.bind_all("p", self.pause)
  124.     # si je ne met pas *arg, ça me met une erreur "takes exactly n positionnal
  125.     # argument (n+1 given)", pourquoi ?
  126.     def displayAide(self, *arg):
  127.         if self.flag == 1:
  128.             self.flag = 0
  129.             self.aide = self.jeu.create_text(400, 100, text='Aide : \nRaquette\
  130. gauche : a pour monter, z pour descendre\nRaquette droite : k pour monter,\
  131. m pour descendre\np : pause, h : aide', fill='white', font =("Arial", "16" ))
  132.         else:
  133.             self.jeu.delete(self.aide)
  134.             self.flag = 1
  135.             self.balle.move()
  136.     def pause(self, *arg):
  137.         if self.flag ==1:
  138.             self.flag = 0
  139.         else:
  140.             self.flag = 1
  141.             self.balle.move()
  142. if __name__ == '__main__':
  143.     Application().mainloop()


---------------
Des piafs en photo
n°2104946
KEVRAMA
Posté le 05-10-2011 à 20:08:06  profilanswer
 

Bonjour , est-ce que quelqu'un connait la structure du CAS PARMI en Python ? Merci d'avance.

n°2105343
alien cons​piracy
hardtrance addict
Posté le 08-10-2011 à 14:18:27  profilanswer
 

Si c'est à l'instruction switch case en C que tu fais référence elle n'existe pas tel quelle. Il existe par contre des moyens de parvenir au même résultat :

Code :
  1. func_1():
  2.   print "Vous avez choisi 1."
  3. func_2():
  4.   print "Vous avez choisi 2."
  5. choix = 1
  6. dict = {1:func_1, 2:func_2 }
  7. dict[choix]()


Pour le cas par défaut il faut faire un try catch sur KeyNotFoundException et le code du catch devient le cas par défaut
 
 
J'ai pas vérifié donc il peut y avoir des erreurs de syntaxe.

n°2105347
masklinn
í dag viðrar vel til loftárása
Posté le 08-10-2011 à 14:41:21  profilanswer
 

alien conspiracy a écrit :

Pour le cas par défaut il faut faire un try catch sur KeyNotFoundException et le code du catch devient le cas par défaut


Tu peux aussi utiliser dict.get et lui filer le code de fallback en valeur de défaut:

Code :
  1. import operator
  2. operations = {
  3.    '+': operator.add,
  4.    '-': operator.sub,
  5.    '*': operator.mul,
  6.    '/': operator.div
  7. }
  8.  
  9. operator = '-'
  10. operations.get(operator, lambda a, b: a)(1, 2)


Message édité par masklinn le 08-10-2011 à 14:44:48

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[PYTHON] Module C++ pour pythonvecteur python
classe pythonboucle for python
[Python] Problème position boutonRotation d’une matrice en Python
[Python 2.7]Py2exe - probleme de dépendances[Python] Script crawler Multi-thread
[Python] Questions de nOobPetites questions générales sur le Python
Plus de sujets relatifs à : Mes questions sur Python


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR