Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > GUI
GUI Forum d'entraide sur les bibliothèques pour interfaces graphiques en Python
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 21/12/2012, 20h24   #1
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Par défaut vpython 2.7 erreur avec définition __init__

Bonjour,

Je suis étudiante en première année bio-ingénieur, et je dois programmer le jeu Lunar Lander.

Je recois cette erreur

TypeError: __init__() takes exactly 1 argument (5 given)


qui est relatée au morceau de code ci-dessous, mais je ne vois pas où est ma faute!
Quelqu'un à la réponse à ma question?

class Lander_View(object):
def __init__(self,owner):
self.owner = owner
self.frame = frame ()
curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)
curve(frame, pos=[(-11,16),(-12,14),(-10,15)], radius =0, color = color.white)
curve(frame, pos=[(-8,16),(-7,14),(-9,15)], radius =0, color = color.white)
curve(frame, pos=[(-10,15),(-9.5,12),(-9,15)], radius=0, visible= False)


Dans mon code, les lignes sont mises à la bonne hauteur, mais ici tout se met à ligne ...

Merci d'avance
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2012, 06h38   #2
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 615
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 615
Points : 3 727
Points : 3 727
Bonjour,

L'erreur est pourtant explicite:
Citation:
Envoyé par cecile vb Voir le message
TypeError: __init__() takes exactly 1 argument (5 given)
__init__ attend un argument et vous en donnez 5 lors de l'instanciation.
Code :
1
2
3
4
5
6
7
8
9
10
>>> class Lander_View(object):
...     def __init__(self, owner):
...         pass
... 
>>> Lander_View(1)
<__main__.Lander_View object at 0xb76c79cc>
>>> Lander_View(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 2 arguments (3 given)
Par contre ce n'est pas la classe Lander_View, pour ce qui est du code présenté, qui retourne cette erreur car deux arguments sont attendus: self qui représente l'instance et l'argument owner.
Code :
1
2
3
4
5
6
7
8
>>> class Lander_View(object):
...     def __init__(self):
...         pass
... 
>>> Lander_View(1, 2, 3, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 1 argument (5 given)
Pour l'indentation sélectionnez le code puis cliquez sur le dièse #.

@+
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 13h55   #3
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Merci d'avoir réagi si rapidement.

Si je comprends bien l'erreur, j'aurais donné trop d'arguments à une fonction __init__. Mais quand je controle mon code, je ne vois pas d'endroit où j'ai mis plus que 'owner' en 'self' comme 'argument'

Si la faute ne vient pas de la partie de code que j'ai donné la dernière fois, il viendra peut -être de la partie suivante?

class Game_View(object):
def __init__(self, owner):
self.owner = owner

self.frame = frame()
# maanoppervlak
curve(frame=f, pos=[(-20,-20),(-17,-17)], radius = 0, color = color.red)
curve(frame=f, pos=[(-17,-17),(-9,-17)], radius = 0, color= color.green)
curve(frame=f, pos=[(-9,-17),(-6,-18),(-2,-15),(2,-17)], radius = 0, color = color.red)
curve(frame=f, pos=[(2,-17),(10,-17)], radius = 0, color = color.green)
curve(frame=f, pos=[(10,-17),(15,-19),(18,-15),(20,-20)], radius = 0, color = color.red)
# self.body = f

side = owner.size
thk = 0.1
s2 = 2*side - thk
s3 = 2*side + thk
box(pos=( side, 0, 0), length=thk, height=s2, width=0, color = color.blue)
box(pos=(-side, 0, 0), length=thk, height=s2, width=0, color = color.blue)
box(pos=(0, -side, 0), length=s3, height=thk, width=0, color = color.blue)
box(pos=(0, side, 0), length=s3, height=thk, width=0, color = color.blue)
scene.background = (0,0,0)

En faite, l'erreur que IDLE donne et plus longue:

Traceback (most recent call last):
File "E:\lunar lander\spel_met_nieuwe_code.py", line 142, in <module>
nieuw_spel = Moon_Lander_Game()
File "E:\lunar lander\spel_met_nieuwe_code.py", line 14, in __init__
self.lander = Lander(self)
File "E:\lunar lander\spel_met_nieuwe_code.py", line 50, in __init__
self.view = Lander_View(self)
File "E:\lunar lander\spel_met_nieuwe_code.py", line 90, in __init__
curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)# rechthoek
TypeError: __init__() takes exactly 1 argument (5 given)mais, je sais difficelement mettre tout mon code dans un message...

la ligne 90 c'est la 5ième ligne du code dans le mail précédent, c'est pour cela que je pensais que la faute se troivait dans cette partie de code

Je ne comprends pas trop

Cécile
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 14h52   #4
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 615
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 615
Points : 3 727
Points : 3 727
Citation:
Envoyé par cecile vb Voir le message
File "E:\lunar lander\spel_met_nieuwe_code.py", line 90, in __init__
curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)# rechthoek
Il y a bien 5 arguments (4 + self) lors de l'instanciation de curve.
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 14h59   #5
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 941
Points : 1 408
Points : 1 408
Salut,

Utilises les balises code pour que ton script soit plus lisible. (L'icône #)


Tu n'as qu'un seul fichier dans ton code ?

Vu comme tel ça a l'air étrange, ce doit donc être une bêtise, simplement on ne l'a pas sous les yeux.

Tu peux mettre ton code en entier en attachement si il est trop long.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 19h46   #6
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
J'ai mis tout mon code dans un attachement, le travail est en néerlandais (pour info).

Comment puis-je réduire les 5 arguments à 1 tout en gardant les courbes ?
Fichiers attachés
Type de fichier : py spel_met_nieuwe_code.py (5,1 Ko, 6 affichages)
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 20h48   #7
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 615
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 615
Points : 3 727
Points : 3 727
Citation:
Envoyé par cecile vb Voir le message
Comment puis-je réduire les 5 arguments à 1 tout en gardant les courbes ?
Aucune idée mais suivant les exemples du site cela ne viens pas de la.
Ou....
?
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2012, 21h11   #8
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 704
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 704
Points : 4 536
Points : 4 536
Salut,
Coder est un exercice de précision:

Code :
1
2
    self.frame = frame ()
    curve(frame, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)
Est-ce que curve prend en premier paramètre une classe telle que frame?

curve est une primitive "simple".

Avant de l'intégrer dans un programme "compliqué", pourquoi ne pas essayer de faire fonctionner le truc avec des appels simples passé à la console:

Code :
1
2
3
4
>>> from visual import *
>>> frame = frame()
>>> curve(pos=[(-20,-20),(-17,-17)], radius = 0, color = color.red)
<vis.primitives.curve object at 0x0309B4E0>
Dans le cas du programme, avec frame en premier paramètre:
Code :
1
2
3
4
5
>>> curve(frame, pos=[(-20,-20),(-17,-17)], radius = 0, color = color.red)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() takes exactly 1 argument (5 given)
>>>
- W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/12/2012, 22h38   #9
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Je ne comprends pas pourquoi ca ne marche pas, vu qu'avec ce code si il ne me donne aucune faute et j'utilise également 'frame' .

(c'est le code d'une ancienne version de mon jeu)


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
class Lander_View(object):
    def __init__(self, owner):
        self.owner = owner
 
        f = frame ()
        curve(frame=f, pos=[(-11,17),(-8,17),(-8,15),(-11,15),(-11,17)], radius = 0, color= color.white)# rechthoek
        curve(frame=f, pos=[(-10,17),(-11,18),(-10,19),(-9,19),(-8,18),(-9,17)], radius =0, color = color.white)# bovendeel
        curve(frame=f, pos=[(-11,16),(-12,14),(-10,15)], radius =0, color = color.white)#linkerpoot
        curve(frame=f, pos=[(-8,16),(-7,14),(-9,15)], radius =0, color = color.white)#rechterpoot
        curve(frame=f, pos=[(-12.5,14),(-11.5,14)], radius =0, color = color.white)#linkerpoot
        curve(frame=f, pos=[(-7.5,14),(-6.5,14)], radius =0, color = color.white)#rechterpoot
        curve(frame=f, pos=[(-10,15),(-9.5,12),(-9,15)], radius=0, visible= False)# vlam
        curve(frame=f, pos=[(-12.5,14),(-6.5,14),(-8,19),(-11,19),(-12.5,14)], radius=0, visible= False)# kader

@ PauseKawa : ca ne marche pas avec tes propositions
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 00h13   #10
wiztricks
Expert Confirmé Sénior
 
Inscription : juin 2008
Messages : 3 704
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 3 704
Points : 4 536
Points : 4 536
Utilisez "frame" comme keyword et lui passer une instance de "frame" ou passer en paramètre la classe frame... çà se ressemble, mais ce n'est pas la même chose.
La question est: vous voulez faire quoi?
-W
__________________
Architectures Post-Modernes
wiztricks est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2012, 06h43   #11
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 615
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 615
Points : 3 727
Points : 3 727
Citation:
Envoyé par cecile vb Voir le message
@ PauseKawa : ca ne marche pas avec tes propositions
Oui, cela fonctionne. A condition de prendre en compte le fait que j'ai la touche f du clavier fatiguée : curve(frame=self.rame, >>> curve(frame=self.frame,
Remplacez tous vos curve(frame, ... et curve(frame=f, ... par curve(frame=self.frame, ...

Note: Attention aussi au meli melo self.positie/frame.pos (self.frame.positie n'existe pas par exemple) et de pas oublier self (ligne 111 par exemple : self.positie = frame.pos >>> self.positie = self.frame.pos)
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 20h49   #12
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
J'ai un peu changé mon code et maintenant l'erreur n'apparaît plus, merci pour les idées!

Ma question de base est solutionnée.

Mais ce que je ne sais pas, c'est comment je dois lier mon code de formules à la visualisation, pour que mon vaisseau spatial bouge.

Dans ce cas, comment je dois lier la position de 'frame' à la vitesse, l'accélération ...
Pour l'instant le vesseau ne bouge pas, alors qu'il devrait etre attiré par la gravité. J'ai écrit toutes les formules, mais j'ai du oublié une liaison quelque part ...
Fichiers attachés
Type de fichier : py laatste try.py (6,6 Ko, 6 affichages)
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2012, 21h23   #13
PauseKawa
Expert Confirmé
 
Avatar de PauseKawa
 
Homme Patrice BLANGARIN
Technicien Help Desk, maintenance, réseau, système et +
Inscription : juin 2006
Messages : 2 615
Détails du profil
Informations personnelles :
Nom : Homme Patrice BLANGARIN
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Technicien Help Desk, maintenance, réseau, système et +
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2006
Messages : 2 615
Points : 3 727
Points : 3 727
Bonsoir,

En fait vous n'arrivez pas a utiliser les classes (et la poo. C'est le but de mon 'Note' au dessus.). Le code en deviens (ce n'est pas un reproche) n'importe quoi.
Code :
1
2
3
        f = frame ()
        self.frame = frame()
        frame.positie = self.positie
Code :
1
2
3
4
5
6
        f = frame ()
        self.view = f
 
        self.frame = frame()
 
        curve(frame=f, pos=[(-20,-20),(-17,-17)], radius = 0, color = color.red)
etc...
Citation:
mais j'ai du oublié une liaison quelque part
Oui... Apprendre les classes.

Désolé mais le code donné comporte trop de méconnaissances pour aller plus loin avec.

Note: Commencez par tester sans classe puisque ce n'est pas un sujet acquis.

@+
__________________
Merci d'utiliser le forum pour les questions techniques.
PauseKawa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/12/2012, 18h25   #14
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Ok, je comprends !
Pour les classes, je suis obligée de travailler avec ...

Merci pour votre temps consacré à mes questions.

Cécile
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 10h46   #15
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 941
Points : 1 408
Points : 1 408
Salut,

En simplifiant et en modifiant quelques paramètres j'arrive à piloter le module.

Code :
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
# -*- coding: utf-8 -*-
 
from visual import *
import math as m
import time
 
G = -1.6 / 100
PI = m.pi
DT = 0.01
 
class Moon_Lander_Game(object):
 
    def __init__(self):
        self.size = 20.0
        self.lander = Lander()
        self.game_items = [self.lander ]
        self.gedaan = False
        f = frame ()
        self.view = f
        curve(frame=f, pos=[(-20,-20), (-17,-17)], radius=0, color=color.red)
        curve(frame=f, pos=[(-17,-17), (-9,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(-9,-17), (-6,-18), (-2,-15), (2,-17)], radius=0, 
                            color=color.red)
        curve(frame=f, pos=[(2,-17), (10,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(10,-17), (15,-19), (18,-15), (20,-20)], radius=0, 
                            color=color.red)
 
    def play_nieuw(self):
        while not self.gedaan:
            self.lander.wordt_aangetrokken()
            self.lander.verplaats()
            self.gedaan = self.lander.is_gecrashed_of_geland()
            self.verwerk_toetsenbord_invoer()
            time.sleep(0.1)
 
    def verwerk_toetsenbord_invoer(self):
        if scene.kb.keys:
            toets = scene.kb.getkey()
            if toets == "left":
                self.lander.draai_links()
 
            elif toets == "right":
                self.lander.draai_rechts()
 
            elif toets == "up":
                self.lander.geef_gas(2)
 
            elif toets == 'ctrl+c':
                sys.exit('Exit by user.')
 
 
class Lander(object):
    def __init__(self):
        self.velocity= vector(0, 0)
        self.acceleration= vector(0, G)
        self.hoek = PI / 2.0
        self.axis = vector(1, 0)
        self.state = True
        self.brandstof = 100
 
        self.positie= vector(0, 0)
        self.frame = frame()
        self.frame.positie = self.positie
        curve(frame=self.frame, pos=[(-11,17), (-8,17), (-8,15), (-11,15),
                                    (-11,17)], radius=0, color=color.white)
        curve(frame=self.frame, pos=[(-10,17), (-11,18), (-10,19), (-9,19), 
                                    (-8,18), (-9,17)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-11,16), (-12,14), (-10,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-8,16), (-7,14), (-9,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-12.5,14), (-11.5,14)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-7.5,14), (-6.5,14)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-10,15), (-9.5,12), (-9,15)], radius=0, 
                                    visible=False)
        curve(frame=self.frame, pos=[(-12.5,14), (-6.5,14), (-8,19), (-11,19),
                                    (-12.5,14)], radius=0, visible=False)
 
    def draai_links(self):
        self.hoek = self.hoek + (PI / 22.0)
        self.positie += (-2, -2)
        self.frame.pos = self.positie
 
    def draai_rechts(self):
        self.positie += (2, -2)
        self.frame.pos = self.positie
 
    def wordt_aangetrokken(self):
        self.velocity = self.velocity + (self.acceleration * 2)
 
    def geef_gas(self, val):
        self.velocity = self.velocity + self.bereken_versnelling_motor() * val
 
    def bereken_versnelling_motor(self):
        return vector(cos(self.hoek), sin(self.hoek))
 
    def is_gecrashed_of_geland(self):
        #XXX TODO
        return False
 
    def verplaats(self):
        self.frame.pos = self.frame.positie + (self.velocity * 2)
 
    def update (self):
        self.positie = self.frame.pos
        self.acceleration = self.acceleration
        self.positie =self.positie + self.velocity * DT
 
if __name__ == '__main__':
    nieuw_spel = Moon_Lander_Game()
    nieuw_spel.play_nieuw()
J'ai l'impression que tu as mélangé les données positie, velocity, etc lors des mouvements gauche-droite, aussi ta constante DT (les constantes s'écrivent en majuscules) était trop petite pour un effet visible, je l'ai remplacée par 2 à certains endroits.

Il faudra encore refaire la fonction de détection du crash, mais je ne sais pas comment tu comptais t'y prendre.
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/01/2013, 21h41   #16
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Un grand merci, VinsS d'avoir regardé mon programme, et d'avoir fait bougé le vaisseau!

J'ai quelques questions sur le code changé, je ne comprends pas tout

- ligne 49-50: je ne sais pas à quoi cela sert, et quand je fait 'crtl+c' IDLE affiche 'sys is not defined'

- ligne 85 et 89: pourquoi ajouter un tuple avec des valeurs fixes

- ligne 93:
la vitesse causé par l'attraction de la lune (qui est une accélération) est lié au temps, la vitesse à laquelle le vesseau tombe doit augmenter au fur et à mesure que le jeu progresse
la formule : v(t) = v + a*DT
ca donnerait : self.velocity = self.velocity + self.acceleration*DT
(et l'acceleration de -0.5 , sinon cela va trop lentement)

dans votre code , le temps n'a aucune influence sur la vitesse, mais dans le mien il le faut

- ligne 96: le *val à la place de *DT, je ne vois pas ce que cette valeur est, vous l'avez mis comme argument, mais où trouve-t-on une valeur pour val?


Pour la détection de crash, j'ai recu du code qui détecte quand 2 segments se touchent (dans l'attachement), mais je dois encore l'étudier

je pensais rassembler toutes les segments de la lune dans un 'tuple' ou dans une 'liste' et controler pour chaque segment si le vesseau ne le touche pas (à tout moment)
avec quelque chose comme : for i in (list) et puis le code.

Mais je n'ai pas encore eu le temps d'y travailler.

J'espère que mes questions et mes explications sont assez claires.
Fichiers attachés
Type de fichier : py vectorutils.py (731 octets, 1 affichages)
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 09h20   #17
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 941
Points : 1 408
Points : 1 408
Salut,

sys est un module qu'il faut importer et que j'ai oublié dans mon code.

Pour les déplacements gauche droit, j'ai remplacé tes valeurs par ces tuples parce que les valeurs que tu utilisais n'avais aucun effet. Modifies les valeurs, testes et tu comprendras ce que je veux dire.

Pour le reste, j'ai été un peu obligé de deviner le calcul auquel tu recourais pour la descente donc j'ai modifié tes données en me fiant uniquement au résultat visible.

Avec tes nouvelles explications c'est plus clair. Et aussi plus simple.

J'ai modifié le code en utilisant ton calcul d'accélération et en supprimant des noms (variables) qui faisait doublon.

Par contre pour le calcul de la poussée, tu modifies l'altitude (coordonnée Y) avec un valeur de 1 (sin(PI / 2)) ce qui n'a pratiquement aucun effet. Mais bon, ça c'est à toi de juger comment le module doit réagir.

Code :
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
 
# -*- coding: utf-8 -*-
 
import sys
 
from visual import *
import math as m
import time
 
G = -1.6 / 100
PI = m.pi
DT = 1.005
 
class Moon_Lander_Game(object):
    def __init__(self):
        self.lander = Lander()
        self.gedaan = False
        f = frame ()
        self.view = f
        curve(frame=f, pos=[(-20,-20), (-17,-17)], radius=0, color=color.red)
        curve(frame=f, pos=[(-17,-17), (-9,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(-9,-17), (-6,-18), (-2,-15), (2,-17)], radius=0, 
                            color=color.red)
        curve(frame=f, pos=[(2,-17), (10,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(10,-17), (15,-19), (18,-15), (20,-20)], radius=0, 
                            color=color.red)
 
    def play_nieuw(self):
        while not self.gedaan:
            self.lander.wordt_aangetrokken()
            self.lander.verplaats()
            self.gedaan = self.lander.is_gecrashed_of_geland()
            self.verwerk_toetsenbord_invoer()
            # La vitesse du jeu se regle ici
            time.sleep(0.07)
 
    def verwerk_toetsenbord_invoer(self):
        # Saisie clavier
        if scene.kb.keys:
            toets = scene.kb.getkey()
            if toets == "left":
                self.lander.draai_links()
 
            elif toets == "right":
                self.lander.draai_rechts()
 
            elif toets == "up":
                self.lander.geef_gas()
 
            elif toets == 'ctrl+c':
                sys.exit('Exit by user.')
 
 
class Lander(object):
    def __init__(self):
        self.velocity = vector(0, 0)
        self.acceleration = vector(0, G)
        self.hoek = PI / 2.0
 
        self.frame = frame()
        curve(frame=self.frame, pos=[(-11,17), (-8,17), (-8,15), (-11,15),
                                    (-11,17)], radius=0, color=color.white)
        curve(frame=self.frame, pos=[(-10,17), (-11,18), (-10,19), (-9,19), 
                                    (-8,18), (-9,17)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-11,16), (-12,14), (-10,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-8,16), (-7,14), (-9,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-12.5,14), (-11.5,14)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-7.5,14), (-6.5,14)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-10,15), (-9.5,12), (-9,15)], radius=0, 
                                    visible=False)
        curve(frame=self.frame, pos=[(-12.5,14), (-6.5,14), (-8,19), (-11,19),
                                    (-12.5,14)], radius=0, visible=False)
 
    def wordt_aangetrokken(self):
        # Descente
        self.acceleration *= DT
        self.velocity += self.acceleration
 
    def verplaats(self):
        # Positionnement
        self.frame.pos += (self.velocity)
 
    def draai_links(self):
        # Deplacement gauche
        self.frame.pos += (-2, 0)
 
    def draai_rechts(self):
        # Deplacement Droit
        self.frame.pos += (2, 0)
 
    def geef_gas(self):
        # Propulsion
        self.frame.pos += self.bereken_versnelling_motor() * DT
 
    def bereken_versnelling_motor(self):
        # Calcul de poussee
        return vector(0, 1.5)
        #return vector(cos(self.hoek), sin(self.hoek))
 
    def is_gecrashed_of_geland(self):
        #XXX TODO
        return False
 
if __name__ == '__main__':
    nieuw_spel = Moon_Lander_Game()
    nieuw_spel.play_nieuw()
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2013, 20h09   #18
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
En fait, quand je tourne à gauche/droite, le module doit seulement changer son angle de pi/20 / -pi/20 à chaque fois qu'on pousse sur la fleche, et garder ce nouvel angle.
C'est pour cela que dans ma def draai_links / draai_rechts je n'ai mis que le changement de l'angle.

Mais je ne sais pas comment je dois lier cela au module. J'ai pensé que ça marcherait peut-être avec l'axe, mais je ne sais pas comment.
Pour l'axe , j'ai trouvé comment faire quand le frame est composé d'objects telle des cilindres, des cercles etc , mais pas pour un ensemble de segments.

Ce n'est que quand on pousse sur la flèche du haut qu'il doit avancer le long de cet axe. Et quand on ne touche plus sur les fleches il doit tomber tout droit vers le sol.

J'ai essayé de commencer par la base, pour le jeu. Je voulais faire les 'détails' plus tard.

J'ai encore du travail ...
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2013, 21h00   #19
VinsS
Membre Expert
 
Homme
Inscription : octobre 2008
Messages : 941
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations forums :
Inscription : octobre 2008
Messages : 941
Points : 1 408
Points : 1 408
Ah ben oui, j'ai lié directement le mouvement aux flèches gauche-droite, je pensais que le bouton 'up' servait à redonner un peu d'altitude au vaisseau.

Mais ça n'implique pas un gros changement ça, et pour l'axe du vaisseau je pense que tu ne dois changer que l'axe du frame sans t'occuper de ses composants.

Regarde si ceci correspond:
Code :
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 
# -*- coding: utf-8 -*-
 
import sys
 
from visual import *
import math as m
import time
 
G = -1.6 / 100
PI = m.pi
DT = 1.005
 
class Moon_Lander_Game(object):
    def __init__(self):
        scene.width = 400
        scene.height = 600
        self.lander = Lander()
        self.gedaan = False
        f = frame ()
        self.view = f
        curve(frame=f, pos=[(-20,-20), (-17,-17)], radius=0, color=color.red)
        curve(frame=f, pos=[(-17,-17), (-9,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(-9,-17), (-6,-18), (-2,-15), (2,-17)], radius=0, 
                            color=color.red)
        curve(frame=f, pos=[(2,-17), (10,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(10,-17), (15,-19), (18,-15), (20,-20)], radius=0, 
                            color=color.red)
 
    def play_nieuw(self):
        while not self.gedaan:
            self.lander.wordt_aangetrokken()
            self.lander.verplaats()
            self.gedaan = self.lander.is_gecrashed_of_geland()
            self.verwerk_toetsenbord_invoer()
            # La vitesse du jeu se regle ici
            time.sleep(0.5)
 
    def verwerk_toetsenbord_invoer(self):
        # Saisie clavier
        if scene.kb.keys:
            toets = scene.kb.getkey()
            if toets == "left":
                self.lander.draai_links()
 
            elif toets == "right":
                self.lander.draai_rechts()
 
            elif toets == "up":
                self.lander.geef_gas()
 
            elif toets == 'ctrl+c':
                sys.exit('Exit by user.')
 
 
class Lander(object):
    def __init__(self):
        self.acceleration = vector(0, G)
        self.hoek = PI / 2.0
        self.gas = vector(0, 0, 0)
 
        self.frame = frame()
        curve(frame=self.frame, pos=[(-11,17), (-8,17), (-8,15), (-11,15),
                                    (-11,17)], radius=0, color=color.white)
        curve(frame=self.frame, pos=[(-10,17), (-11,18), (-10,19), (-9,19), 
                                    (-8,18), (-9,17)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-11,16), (-12,14), (-10,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-8,16), (-7,14), (-9,15)], radius=0, 
                                    color=color.white)
        curve(frame=self.frame, pos=[(-12.5,14), (-11.5,14)], radius=0, 
                                    color=color.red)
        curve(frame=self.frame, pos=[(-7.5,14), (-6.5,14)], radius=0, 
                                    color=color.red)
        curve(frame=self.frame, pos=[(-10,15), (-9.5,12), (-9,15)], radius=0, 
                                    visible=False)
        curve(frame=self.frame, pos=[(-12.5,14), (-6.5,14), (-8,19), (-11,19),
                                    (-12.5,14)], radius=0, visible=False)
        self.frame.velocity = vector(0, 0.1, 0)
        self.frame.pos = (10, 0, 0) 
 
    def wordt_aangetrokken(self):
        # Falling velocity
        self.acceleration *= DT
        self.frame.velocity += self.acceleration
 
    def verplaats(self):
        # Positionning
        self.frame.pos += self.frame.velocity
        print 'fall:', self.frame.pos
 
    def draai_links(self):
        # Set left deviation
        self.frame.axis -= (0, 0, 0.05)
        self.gas = vector(-sin(self.hoek), cos(self.hoek))
 
    def draai_rechts(self):
        # Set right deviation
        self.frame.axis += (0, 0, 0.05)
        self.gas = vector(sin(self.hoek), cos(self.hoek))
 
    def geef_gas(self):
        # Set modified velocity
        self.frame.velocity += self.gas
        self.frame.pos += self.frame.velocity
        # Reset falling velocity
        self.frame.velocity -= self.gas
 
    def is_gecrashed_of_geland(self):
        #XXX TODO
        return False
 
if __name__ == '__main__':
    nieuw_spel = Moon_Lander_Game()
    nieuw_spel.play_nieuw()
J'ai réduit la vitesse (ligne 36) pour mieux visualiser les mouvements.


Tu as un collègue de cours qui a exposé ce problème sur la ML de Python (1), son code est similaire au tien mais il multiplie par 10 la valeur d'angle de déviation.

(1) http://mail.python.org/pipermail/pyt...ry/637910.html
__________________
Vincent
Oqapy . Qarte . PaQager
VinsS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 09h06   #20
cecile vb
Invité de passage
 
Femme
Étudiant
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Belgique

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 0
Points : 0
Dans votre version la flèche du haut ne fonctionne pas, et quand j'utilise la flèche de droite ou de gauche le module ne pas pas vraiment à droite ou gauche , mais on dirait qu'il tourne pour se mettre en profil.

J'ai vu que vous faites changer l'axe par (0,0,0.5), je pense que c'est ça qui cause le mouvement de profil.
Et je pense que pour les vecteurs , c'est (cos(angle), sin(angle)) et non (sin, cos).

J'ai essayé quelque chose , mais il quand on actionne les flèches droite/gauche, il se réduit , devient plat, et réapparaît à l'envers. Je ne sais pas ce qui cause ca. Et quand je pousse sur la flèche du haut, il ne s'arrête plus !!

Code :
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# -*- coding: utf-8 -*-
 
import sys
 
from visual import *
import math as m
import time
 
G = -0.5/20
PI = m.pi
DT = 1.005
 
class Moon_Lander_Game(object):
    def __init__(self):
        scene.width = 400
        scene.height = 600
        self.lander = Lander()
        self.gedaan = False
        f = frame ()
        self.view = f
        curve(frame=f, pos=[(-20,-20), (-17,-17)], radius=0, color=color.red)
        curve(frame=f, pos=[(-17,-17), (-9,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(-9,-17), (-6,-18), (-2,-15), (2,-17)], radius=0, 
                            color=color.red)
        curve(frame=f, pos=[(2,-17), (10,-17)], radius=0, color=color.green)
        curve(frame=f, pos=[(10,-17), (15,-19), (18,-15), (20,-20)], radius=0, 
                            color=color.red)
 
    def play_nieuw(self):
        while not self.gedaan:
            self.lander.wordt_aangetrokken()
            self.lander.verplaats()
            self.gedaan = self.lander.is_gecrashed_of_geland()
            self.verwerk_toetsenbord_invoer()
            # La vitesse du jeu se regle ici
            time.sleep(0.5)
 
    def verwerk_toetsenbord_invoer(self):
        if scene.kb.keys:
            toets = scene.kb.getkey()
            if toets == "left":
                self.lander.draai_links()
 
            elif toets == "right":
                self.lander.draai_rechts()
 
            elif toets == "up":
                self.lander.geef_gas()
                #vlam.visible ==True
                #vlam.visible == True      nog zeggen vanwaar het komt: frame, of lander ???
 
            elif toets == 'ctrl+c':
                sys.exit('Exit by user.')
 
 
class Lander(object):
    def __init__(self):
        self.acceleration = vector(0, G)
        self.velocity = vector(0, 0)
        self.hoek = PI / 2.0
        #self.gas = vector(5* cos(self.hoek), 5*sin(self.hoek))
 
        self.frame = frame()
        curve(frame=self.frame, pos=[(-11,17), (-8,17), (-8,15), (-11,15),(-11,17)], radius=0, color=color.white)                          
        curve(frame=self.frame, pos=[(-10,17), (-11,18), (-10,19), (-9,19), (-8,18), (-9,17)], radius=0, color=color.white)                            
        curve(frame=self.frame, pos=[(-11,16), (-12,14), (-10,15)], radius=0, color=color.white)                            
        curve(frame=self.frame, pos=[(-8,16), (-7,14), (-9,15)], radius=0, color=color.white)                            
        curve(frame=self.frame, pos=[(-12.5,14), (-11.5,14)], radius=0, color=color.red)                           
        curve(frame=self.frame, pos=[(-7.5,14), (-6.5,14)], radius=0, color=color.red)
 
        vlam= curve(frame=self.frame, pos=[(-10,15), (-9.5,12), (-9,15)], radius=0, visible=False)
        vlam2= curve(frame=self.frame, pos=[(-12.5,14), (-6.5,14), (-8,19), (-11,19),(-12.5,14)], radius=0, visible=False)
 
        self.frame.pos = vector(10, 0)
        self.frame.axis = (1,0)
 
    def wordt_aangetrokken(self):
        self.velocity = self.velocity + (self.acceleration * DT)
 
    def draai_links(self):
        self.frame.rotate(angle= PI/20, axis=self.frame.axis,origin= self.frame.pos )
        self.hoek = self.hoek + PI/20
 
    def draai_rechts(self):
        self.frame.rotate(angle= -PI/20, axis=self.frame.axis,origin= self.frame.pos)
        self.hoek = self.hoek - PI/20
 
    def versnelling_motor(self):
        extra_snelheid= vector(cos(self.hoek)*2, sin(self.hoek)*2) 
        return extra_snelheid
 
    def geef_gas(self):
        self.velocity = self.velocity + self.versnelling_motor()
        #self.frame.pos += (self.frame.velocity * DT)
        # Reset falling velocity
        #self.frame.velocity -= self.gas
 
    def verplaats(self):
        # Positionning
        self.frame.pos = self.frame.pos + (self.velocity * DT)
        print 'fall:', self.frame.pos
 
    def is_gecrashed_of_geland(self):
        #XXX TODO
        return False
 
if __name__ == '__main__':
    nieuw_spel = Moon_Lander_Game()
    nieuw_spel.play_nieuw()
cecile vb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h18.


 
 
 
 
Partenaires

Hébergement Web