Publicité
+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 21
  1. #1
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

  2. #2
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    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.

  3. #3
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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

  4. #4
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    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.

  5. #5
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 862
    Points : 2 574
    Points
    2 574

    Par défaut

    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

  6. #6
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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 Fichiers attachés

  7. #7
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    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.

  8. #8
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 399
    Points : 7 561
    Points
    7 561

    Par défaut

    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

  9. #9
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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

  10. #10
    Modérateur

    Homme Profil pro
    Architecte technique
    Inscrit en
    juin 2008
    Messages
    5 399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : juin 2008
    Messages : 5 399
    Points : 7 561
    Points
    7 561

    Par défaut

    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

  11. #11
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    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.

  12. #12
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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 Fichiers attachés

  13. #13
    Expert Confirmé Avatar de PauseKawa
    Homme Profil pro Patrice BLANGARIN
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    juin 2006
    Messages
    2 720
    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 720
    Points : 3 599
    Points
    3 599

    Par défaut

    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...
    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.

  14. #14
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    Ok, je comprends !
    Pour les classes, je suis obligée de travailler avec ...

    Merci pour votre temps consacré à mes questions.

    Cécile

  15. #15
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 862
    Points : 2 574
    Points
    2 574

    Par défaut

    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

  16. #16
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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 Fichiers attachés

  17. #17
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 862
    Points : 2 574
    Points
    2 574

    Par défaut

    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

  18. #18
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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 ...

  19. #19
    Expert Confirmé

    Homme Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 862
    Points : 2 574
    Points
    2 574

    Par défaut

    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

  20. #20
    Invité de passage
    Femme Profil pro
    Étudiant
    Inscrit en
    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

    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()

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •