Partage
  • Partager sur Facebook
  • Partager sur Twitter

ISN-Tower Defense

4 mai 2019 à 21:55:42

C'est normal, tu ne fais pas ce que je te dis. Essaye de relire les messages et compare avec ta version, tu devras comprendre ce qui ne va pas...
  • Partager sur Facebook
  • Partager sur Twitter
4 mai 2019 à 23:47:02

def Ballou():
    global budget
    global T
    for i in range(50):
        balle = bl.Balle()
        listBalle.append(balle)
    while 1:
        dt=.06
        start_time = time.time()
        time.sleep(dt)
        for balle in listBalle:
            balle.afficher(Canevas)
            Mafenetre.update()
            balle.effacer(Canevas)
            balle.deplacer(dt)
            balle.avancer()
            balle.avancer1()
            balle.avancer2()
            balle.avancer3()
            balle.avancer4()
            balle.avancer5()
            balle.avancer6()
            balle.avancer7()
            balle.afficher(Canevas)
            budget=budget+0.2
            print(dt)
        dt=.06
        start_time = time.time()
        time.sleep(dt)
    for tourelle in T:
                balle.interaction(tourelle)

je vois vraiment pas si j'ai faux là :(

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 9:49:17

1) pourquoi tu as deux fois le sleep ? Relis ton code. Sleep ça va endormir la machine (sleep en anglais ça veut dire "dormir"), dt c'est le temps en secondes où ta machine dort. Si tu le mets deux fois ben ta machine va dormir deux fois plus. Et d'ailleurs, plus ce dt est élevé, plus tu vas devoir attendre entre deux frame. Si tu veux du 60 fps (60 frame par seconde), qquelle valeur dois tu mettre au dt ?

2) ta boucle des tourelles n'est toujours pas exécutée à cause de l'indentation

3) les fonctions avancer n'ont rien à voir avec le ralentissement. Elles vont polluer ton code le rendre plus difficile à lire par contre comme j'ai dit dans mes premiers messages

-
Edité par potterman28wxcv 5 mai 2019 à 9:55:53

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 12:21:48

def Ballou():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
    while 1:
        dt=.06
        start_time = time.time()
        time.sleep(dt)
        for balle in listBalle:
            balle.afficher(Canevas)
            Mafenetre.update()
            balle.effacer(Canevas)
            balle.deplacer(dt)
            balle.avancer()
            balle.avancer1()
            balle.avancer2()
            balle.avancer3()
            balle.avancer4()
            balle.avancer5()
            balle.avancer6()
            balle.avancer7()
            balle.afficher(Canevas)
            budget=budget+0.2
            print(dt)
        for tourelle in T:
            balle.interaction(tourelle)
            print('oui')
bon logiquement si je lis bien mon code, le time.sleep, le dt=0.6 et start_time=time.time() sont bien en dehors de ma boucle for et à l'intérieur de ma boucle while, pareil pour ma boucle for tourelle.
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 13:58:43

Ouais ça a l'air bon là. Par contre tu vas avoir un framerate de 1/0.06 = 17 FPS.
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 15:02:26

def Ballou():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
    while 1:
        dt=.016666667
        start_time = time.time()
        time.sleep(dt)
        for balle in listBalle:
            balle.afficher(Canevas)
            Mafenetre.update()
            balle.effacer(Canevas)
            balle.deplacer(dt)
            balle.avancer()
            balle.avancer1()
            balle.avancer2()
            balle.avancer3()
            balle.avancer4()
            balle.avancer5()
            balle.avancer6()
            balle.avancer7()
            balle.afficher(Canevas)
            budget=budget+0.2
            print(dt)
        for tourelle in T:
            balle.interaction(tourelle)
            print('oui')


j'a changé pour avoir un peu prés 60 fps, le soucis reste le même, quand je reclique sur play, une deuxième balle apparait et la vitesse semble être ralentis.
  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 15:22:29

Katalz a écrit:

def Ballou():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
    while 1:
        dt=.016666667
        start_time = time.time()
        time.sleep(dt)
        for balle in listBalle:
            balle.afficher(Canevas)
            Mafenetre.update()
            balle.effacer(Canevas)
            balle.deplacer(dt)
            balle.avancer()
            balle.avancer1()
            balle.avancer2()
            balle.avancer3()
            balle.avancer4()
            balle.avancer5()
            balle.avancer6()
            balle.avancer7()
            balle.afficher(Canevas)
            budget=budget+0.2
            print(dt)
        for tourelle in T:
            balle.interaction(tourelle)
            print('oui')


j'a changé pour avoir un peu prés 60 fps, le soucis reste le même, quand je reclique sur play, une deuxième balle apparait et la vitesse semble être ralentis.

Oui, parce que tu as deux fonctions Ballou qui tournent en même temps - chacune va pauser de 0.016 secondes à chaque fois. Chaque balle que tu rajoutes va donc ralentir : d'abord un /2, puis un /3, puis un /4, etc.. si tu cliques 10 fois sur Play ton jeu sera ralenti 10 fois.

Il faut que tu restructures ton programme pour que ce ne soit plus le cas. Mettre ta boucle infinie ailleurs, séparer ta fonction Ballou en deux fonctions (une pour la création de la balle et l'autre pour la mise à jour).

En pseudo code pour l'instant tu as quelque chose qui ressemble à :

def Ballou():
  creation de plusieurs balles
  boucle infinie avec sleep et mise à jour des balles

association de Play à creer_ballou()

Il faudrait maintenant que tu aies :

def creer_ballou():
  creation de plusieurs balles

def update_ballou():
  mise à jour des balles

association de Play à creer_ballou()

while 1:
  sleep
  update_ballou()





-
Edité par potterman28wxcv 5 mai 2019 à 15:23:30

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 16:03:10

def creer_ballou():
  creation de plusieurs balles
 
def update_ballou():
  mise à jour des balles
 
association de Play à creer_ballou()
 
while 1:
  sleep
  update_ballou()

si je fais ca l'interface graphique ne veut pas se lancer étant donner que le programme va continuer de rester dans la boucle while.

du coup il faut que je le positionne à l'intérieur de la def qui update la balle ?

  • Partager sur Facebook
  • Partager sur Twitter
5 mai 2019 à 18:34:26

Katalz a écrit:

def creer_ballou():
  creation de plusieurs balles
 
def update_ballou():
  mise à jour des balles
 
association de Play à creer_ballou()
 
while 1:
  sleep
  update_ballou()

si je fais ca l'interface graphique ne veut pas se lancer étant donner que le programme va continuer de rester dans la boucle while.

du coup il faut que je le positionne à l'intérieur de la def qui update la balle ?

En fait pour faire vraiment propre il faudrait quelque chose comme ça :

def creer_ballou():
  creation de plusieurs balles
  
def update_ballou():
  mise à jour des balles
  
initialisation de l'interface graphique
association de Play à creer_ballou()
  
while 1:
  sleep
  update_ballou()
  mise à jour de l'affichage (blits et cie)

Mais oui sinon tu peux mettre la mise à jour de l'affichage dans le update_ballou, ce qui est déjà le cas dans Ballou


  • Partager sur Facebook
  • Partager sur Twitter
6 mai 2019 à 20:12:25

Salut portterman, j’espère que tu vas bien, même en déplaçant la boucle while après la création des graphique j’ai toujours problème qui fait que l'interface Ne se lance pas.
  • Partager sur Facebook
  • Partager sur Twitter
6 mai 2019 à 22:32:08

Met des print un peu partout pour savoir ce qu'il se passe, pour voir là où l'exécution passe.
  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2019 à 15:21:00

Salut potterman, j'ai découvert que le ralentissement était du aux calculs que devait effectuer l'ordinateur, il me reste encore une chose à coder pour que le jeu soit fonctionnel c'est l'interactions que doit faire la tourelle sur les balles, j'ai essayer de le coder comme ca 
import tourelle as tr
Vitessemax=0.04
Vitessemin=0

class Balle:
    global Vitessemax
    def __init__(self):
        self.rayon=10
        self.x=25
        self.y=25
        self.Vx=Vitessemax
        self.Vy=Vitessemin


    def afficher(self,Can):
        self.oval=Can.create_oval(self.x-self.rayon,self.y-self.rayon,self.x+self.rayon,self.y+self.rayon,fill='red')


    def deplacement(self):
        global Vmax
        if self.x>470 and self.y<30:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x>470 and self.y<125 and self.y>120:
            self.Vx=-Vitessemax
            self.Vy=Vitessemin
        elif self.x<25 and self.y>120 and self.y<130:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x<25 and self.y>220 and self.y<230:
            self.Vx=Vitessemax
            self.Vy=Vitessemin
        elif self.x>470 and self.x<475 and self.y>220 and self.y<225:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x>470 and self.y<325 and self.y>320:
            self.Vx=-Vitessemax
            self.Vy=Vitessemin
        elif self.x<25 and self.y>320 and self.y<330:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x<25 and self.y>420 and self.y<430:
            self.Vx=Vitessemax
            self.Vy=Vitessemin


    def deplacer(self,Can,dt):
        Can.move(self.oval,self.Vx,self.Vy)
        self.x+=self.Vx
        self.y+=self.Vy

    def interaction(self,tourelle):
        return
        distance=(( self.x-tourelle1.x )**2+( self.y-tourelle1.y )**2)**1/2
        if distance<400:
                print("t mort")
        print(distance)
P=0
class Tourelle:

    def __init__(self):
        self.rayon=10
        self.x=0
        self.y=0

    def placers(self,Can):
        print(self.x,self.y)
        if self.x<500 and self.y<50:
            print("NONNN")
            P=1
        elif self.y>100 and self.y<150:
            print("NONN")
            P=1
        elif self.y>200 and self.y<250:
            print("NONN")
            P=1
        elif self.y>300 and self.y<350:
            print("NONN")
            P=1
        elif self.y>400 and self.y<450:
            print("NONN")
            P=1
        elif self.y>500 and self.y<550:
            print("NONN")
            P=1
        elif self.y<100 and self.y>50 and self.x<500 and self.x>450:
            print("NONN")
            P=1
        else:
            Can.create_oval(self.x-self.rayon,self.y-self.rayon,self.x+self.rayon,self.y+self.rayon,fill='blue')
from tkinter import *
from PIL.Image import*
from importlib import reload
import numpy as np
import balle as bl
import tourelle as tr
import time

reload(bl)
reload(tr)

Largeur = 500
Hauteur = 500
budget=20.0
T=[]
listBalle=[]
S=0
i=0

def Ballou():
    global budget
    global T
    for i in range(2):
        balle = bl.Balle()
        listBalle.append(balle)
        balle.afficher(Canevas)
        dt=0.02
    while 1:
        for balle in listBalle:
            Mafenetre.update()
            balle.deplacement()
            balle.deplacer(Canevas,dt)
    for tourelle in T:
                balle.interaction(tourelle)

def Placer(event):
    global budget
    global T
    for i in range(1):
        tourelle1 = tr.Tourelle()
        T.append(tourelle1)
    for tourelle1 in T:
            tourelle1.x=event.x
            tourelle1.y=event.y
    if budget>19.9:
                tourelle1.placers(Canevas)
                budget=budget-20
    else:
                print("pas assez d'argent")




Mafenetre = Tk()
Mafenetre.title('Towerdefense')



Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ="white")
Canevas.pack()

bouton1=Button(Mafenetre, text="play", command=Ballou) # Bouton qui détruit la fenêtre
bouton1.pack()

Canevas.bind('<Button-1>', Placer)
Canevas.pack()

Canevas.create_rectangle((0,0), (500,50), fill='grey')
Canevas.create_rectangle((0,50), (500,100), fill='green')
Canevas.create_rectangle((0,100), (500,150), fill='grey')
Canevas.create_rectangle((0,150), (500,200), fill='green')
Canevas.create_rectangle((0,200), (500,250), fill='grey')
Canevas.create_rectangle((0,250), (500,300), fill='green')
Canevas.create_rectangle((0,300), (500,350), fill='grey')
Canevas.create_rectangle((0,350), (500,400), fill='green')
Canevas.create_rectangle((0,400), (500,450), fill='grey')
Canevas.create_rectangle((0,450), (500,500), fill='green')
Canevas.create_rectangle((450,50), (500,100), fill='grey')
Canevas.create_rectangle((0,150), (50,200), fill='grey')
Canevas.create_rectangle((450,250), (500,300), fill='grey')
Canevas.create_rectangle((0,350), (50,400), fill='grey')



Mafenetre.mainloop()



  • Partager sur Facebook
  • Partager sur Twitter
14 mai 2019 à 16:02:56

Dire que les ralentissements viennent des calculs que doit faire l'ordinateur, c'est une phrase vide de sens, un peu comme si je disais que "l'eau ça mouille".

Tu es en train d'écrire un programme informatique, forcément que ça va faire faire des calculs à l'ordinateur. Mais de quels calculs tu parles très exactement ?

La fonction suivante, telle que tu l'as écrite, ne sert à rien

    def interaction(self,tourelle):
        return
        distance=(( self.x-tourelle1.x )**2+( self.y-tourelle1.y )**2)**1/2
        if distance<400:
                print("t mort")
        print(distance)

Le mot clef return signifie à Python : arrête l'exécution de ma fonction, et retourne l'argument du return. C'est à dire ici, None. Autrement dit, les lignes après ton return c'est du code mort qui n'est en fait jamais exécuté. Je ne pense pas que c'est ce que tu veux faire.

cf : https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python/231442-avancez-pas-a-pas-vers-la-modularite-1-2#/id/r-2231724



-
Edité par potterman28wxcv 14 mai 2019 à 16:03:36

  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2019 à 9:58:44

salut, enfaite c’est mon prof qui m’avais dit de mettre le return, j’ai suivis son conseil, d’accord donc je vais essayer de l’enlever, et du coup pour ma fonction deplacement c’est mieux comme ça je pense avec des eli.
  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2019 à 10:39:35

Katalz a écrit:

salut, enfaite c’est mon prof qui m’avais dit de mettre le return, j’ai suivis son conseil, d’accord donc je vais essayer de l’enlever, et du coup pour ma fonction deplacement c’est mieux comme ça je pense avec des eli.

Tu as appliqué à la lettre le conseil de ton prof sans réfléchir. "Mettre un return", oui, mais pas au tout début de ta fonction ! Je te conseille de relire le chapitre que je t'ai donné en lien pour comprendre comment ça marche une fonction, et à quoi sert un return.

Pour ta fonction de déplacement, il ne faut pas juste rempalcer les if par des elif - c'est pas un changement de mot clef qui va magiquement faire marcher ton programme ;)

Je rappelle comment ça marche les elif :

if cond1:
  action1
elif cond2:
  action2
else:
  action3

C'est équivalent à :

if cond1:
  action1
if (not cond1) and cond2:
  action2
if (not cond1) and (not cond2):
  action3

Tu vois que tu n'obtiens pas la même chose en remplaçant les if par des elif : ça va changer le comportement de ton programme.

Mais oui, structurer tes conditions avec des elif rend le code plus clair. Il faut vraiment que tu repenses ce que t'as écrit avec des "sinon si". Prend du recul, tu peux même prendre une feuille de papier et dessiner au brouillon ce qu'il se passe dans le plan 2D, pour distinguer les différents cas.

Pourquoi je te dis ça ? Parce que dans ce code là, le deuxième elif ne sera jamais exécuté

        elif self.y>100 and self.y<150:
            print("NONN")
            P=1
        elif self.y>200 and self.y<250:
            print("NONN")
            P=1

Si self.y > 100, tu rentres dans le premier elif. Sinon, forcément self.y <= 100. Tu rentres alors dans le deuxième elif : mais le cas self.y > 200 ne se présente pas, vu que self.y est <= 100. Tu as un problème de logique dans ton code. Est-ce que tu comprends ce que je veux dire ?

elif c'est vraiment "sinon, si ...". En fait ceci :

if cond1:
  action1
elif cond2:
  action2

Est équivalent à

if cond1:
  action1
else:
  if cond2:
    action2


Est-ce que tu vois comment ça marche les if..elif..else maintenant ?

-
Edité par potterman28wxcv 15 mai 2019 à 10:47:01

  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2019 à 14:04:03

yes, mais la partie que je t'es envoyé sur les elif marchait correctement enfin la balle suivait le trajet que je lui demander.Pour le return, j'en conclut que je n'en ai pas besoin étant donné que je ne veux pas que mon programme me retourne mon argument.

  • Partager sur Facebook
  • Partager sur Twitter
15 mai 2019 à 14:26:45

Katalz a écrit:

yes, mais la partie que je t'es envoyé sur les elif marchait correctement enfin la balle suivait le trajet que je lui demander.Pour le return, j'en conclut que je n'en ai pas besoin étant donné que je ne veux pas que mon programme me retourne mon argument.

C'est toi qui vois. Si ça marche, tant mieux :)

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 16:53:27

Salut, je dois rendre mon projet ce mardi ( je suis très mal), le jeu n'est pas encore jouable, j'ai réussi à crée une fonction qui calcule la distance entre la balle et la tourelle sauf que j'aimerais bien faire en sorte que la balle n'ayant plus de vie, soit retirée de la list B. Je ne sais pas si quelqu'un a une solution pour cela car je n'ai aucune idée de comment retirer précisément une valeur de la list. 
from tkinter import *
from PIL.Image import*
from importlib import reload
import numpy as np
import balle as bl
import tourelle as tr
import time

reload(bl)
reload(tr)

Largeur = 500
Hauteur = 500
budget=20.0
T=[]
listBalle=[]
S=0
i=0

def Niveau1():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
        balle.afficher(Canevas)
        dt=0.6
    while 1:
        for balle in listBalle:
            time.time(2)
            Mafenetre.update()
            balle.deplacement(dt)
            balle.deplacer(Canevas)
            for tourelle in T:
                balle.interaction(tourelle)
        budget=budget=0.2
        print("budget")


def Niveau2():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
        balle.afficher(Canevas)
        dt=0.002
    while 1:
        for balle in listBalle:
            Mafenetre.update()
            balle.deplacement(dt)
            balle.deplacer(Canevas)
            print(budget)
            for tourelle in T:
                balle.interaction(tourelle)

def Placer(event):
    global budget
    global T
    for i in range(1):
        tourelle1 = tr.Tourelle()
        T.append(tourelle1)
    for tourelle1 in T:
            tourelle1.x=event.x
            tourelle1.y=event.y
    if budget>19.9:
                tourelle1.placers(Canevas)
                budget=budget-20
    else:
                print("pas assez d'argent")



Mafenetre = Tk()
Mafenetre.title('Towerdefense')



Canevas = Canvas(Mafenetre, width = Largeur, height =Hauteur, bg ="white")
Canevas.pack()

bouton1=Button(Mafenetre, text="niveau2", command=Niveau2) # Bouton qui détruit la fenêtre
bouton1.pack()
bouton2=Button(Mafenetre, text="niveau1",command=Niveau2)
bouton2.pack()

Canevas.bind('<Button-1>', Placer)
Canevas.pack()

Canevas.create_rectangle((0,0), (500,50), fill='grey')
Canevas.create_rectangle((0,50), (500,100), fill='green')
Canevas.create_rectangle((0,100), (500,150), fill='grey')
Canevas.create_rectangle((0,150), (500,200), fill='green')
Canevas.create_rectangle((0,200), (500,250), fill='grey')
Canevas.create_rectangle((0,250), (500,300), fill='green')
Canevas.create_rectangle((0,300), (500,350), fill='grey')
Canevas.create_rectangle((0,350), (500,400), fill='green')
Canevas.create_rectangle((0,400), (500,450), fill='grey')
Canevas.create_rectangle((0,450), (500,500), fill='green')
Canevas.create_rectangle((450,50), (500,100), fill='grey')
Canevas.create_rectangle((0,150), (50,200), fill='grey')
Canevas.create_rectangle((450,250), (500,300), fill='grey')
Canevas.create_rectangle((0,350), (50,400), fill='grey')



Mafenetre.mainloop()
P=0
class Tourelle:

    def __init__(self):
        self.rayon=10
        self.x=0
        self.y=0

    def placers(self,Can):
        print(self.x,self.y)
        if self.x<500 and self.y<50:
            print("NONNN")
            P=1
        elif self.y>100 and self.y<150:
            print("NONN")
            P=1
        elif self.y>200 and self.y<250:
            print("NONN")
            P=1
        elif self.y>300 and self.y<350:
            print("NONN")
            P=1
        elif self.y>400 and self.y<450:
            print("NONN")
            P=1
        elif self.y>500 and self.y<550:
            print("NONN")
            P=1
        elif self.y<100 and self.y>50 and self.x<500 and self.x>450:
            print("NONN")
            P=1
        else:
            Can.create_oval(self.x-self.rayon,self.y-self.rayon,self.x+self.rayon,self.y+self.rayon,fill='blue')
import tourelle as tr
Vitessemax=0.4
Vitessemin=0
Vie=10
class Balle:
    global Vitessemax
    def __init__(self):
        self.rayon=10
        self.x=25
        self.y=25
        self.Vx=Vitessemax
        self.Vy=Vitessemin


    def afficher(self,Can):
        self.oval=Can.create_oval(self.x-self.rayon,self.y-self.rayon,self.x+self.rayon,self.y+self.rayon,fill='red')


    def deplacement(self,dt):
        global Vmax
        if self.x>470 and self.y<30:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x>470 and self.y<125 and self.y>120:
            self.Vx=-Vitessemax
            self.Vy=Vitessemin
        elif self.x<25 and self.y>120 and self.y<130:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x<25 and self.y>220 and self.y<230:
            self.Vx=Vitessemax
            self.Vy=Vitessemin
        elif self.x>470 and self.x<475 and self.y>220 and self.y<225:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x>470 and self.y<325 and self.y>320:
            self.Vx=-Vitessemax
            self.Vy=Vitessemin
        elif self.x<25 and self.y>320 and self.y<330:
            self.Vx=Vitessemin
            self.Vy=Vitessemax
        elif self.x<25 and self.y>420 and self.y<430:
            self.Vx=Vitessemax
            self.Vy=Vitessemin


    def deplacer(self,Can):
        Can.move(self.oval,self.Vx,self.Vy)
        self.x+=self.Vx
        self.y+=self.Vy

    def interaction(self,tourelle):
        global Vie
        distance=(( self.x-tourelle.x )**2+( self.y-tourelle.y )**2)**(1/2)
        while distance<100 and Vie>-1:
                Vie=Vie-2
                if Vie==0:
                    





  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 17:33:23

Pour retirer une valeur d'une liste, tu peux utiliser remove ou pop. Remove t'enlève un élément si tu lui donnes l'élément en question en entrée. Pop t'enlèves un élément en fonction de son indice.

L = [4, 2, "toto", 5]

# Enlève "toto" de la liste
L.remove("toto")
print(L)

# Enlève le deuxième élément de la liste
L.pop(1)
print(L)



  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 18:35:34

Merci Potterman pour t'as réactivité, le problème c'est que j'aimerais enlever de ma liste la balle qui n'a plus de vie, mais du coup il faudrait donner un nombre à chaque balle qui spawn et que lorsque la balle n'a plus de vie elle soit retirer. Mais je ne sais pas si les balles de ma liste ont déjà un nom ou si il est possible d'enlever précisément une balle.
  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 19:02:32

Katalz a écrit:

Merci Potterman pour t'as réactivité, le problème c'est que j'aimerais enlever de ma liste la balle qui n'a plus de vie, mais du coup il faudrait donner un nombre à chaque balle qui spawn et que lorsque la balle n'a plus de vie elle soit retirer. Mais je ne sais pas si les balles de ma liste ont déjà un nom ou si il est possible d'enlever précisément une balle.

Tu dois modifier tes classes balles pour qu'elles aient une variable Vie (self.vie par exemple). Pour l'instant ta variable Vie est globale, c'est à dire qu'elle s'applique pour toutes tes balles à la fois.

Ensuite, retirer la balle de la liste devra se faire en dehors de ta fonction interaction. En effet, quand tu es dans interaction, tu es "à l'intérieur" de ta balle - tu ne peux alors pas agir sur la liste. Il faudrait donc par exemple que ta fonction interaction te renvoie un booléen qui vaut True si ta balle survit, False sinon. Et dans ton code principal, si la balle ne survit pas, tu la retires de la liste.

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 19:27:43

Qu'est ce que tu veux dire par booléen ?

edit: non c'est bon j'ai trouvé, j'ai une question, est ce que je peux mettre un temps différent d’exécution pour des fonctions différentes, par exemple ici:

def Niveau1():
    global budget
    global T
    for i in range(1):
        balle = bl.Balle()
        listBalle.append(balle)
        balle.afficher(Canevas)
        dt=0.6
    while 1:
        for balle in listBalle:
            Mafenetre.update()
            balle.deplacement(dt)
            balle.deplacer(Canevas)
            print(self.vie)
            for tourelle in T:
                balle.interaction(tourelle)
        budget=budget=0.2

mon dt=0.6 fixe le temps de pause que la balle met entre chaque déplacement mais j'aimerais par exemple que le budget=budget=0.2 fonctionne seulement toute les 2secondes, mais tout en gardant le fait que mes balles se déplace avec un temps de pause de 0.6..

edit2:

def mort(mort):
    if mort==1:
        listBalle.remove(balle)
def interaction(self,tourelle):
        global Vie
        global mort
        distance=(( self.x-tourelle.x )**2+( self.y-tourelle.y )**2)**(1/2)
        while distance<100 and self.vie<0:
            self.vie=self.vie-2
        if self.vie<-1:
            mort=1
        else:
            mort=0

J'ai fais remove, une balle de la list balle mais je ne sais pas laquelle il retire.



-
Edité par Katalz 23 mai 2019 à 19:58:56

  • Partager sur Facebook
  • Partager sur Twitter
23 mai 2019 à 23:12:01

Un booléen c'est True ou False. vrai ou faux en français. C'est un des types fondamentaux de Python. Quand tu écris des if, la condition du if est évaluée comme un booléen. Retourner un booléen ça veut dire retourner True ou False.

Il ne retire rien du tout là. mort est une fonction, tu utilises une fonction en faisant un appel à la fonction. Pas en mettant la variable mort à 0 ou à 1, qui d'ailleurs écrase le nom de la fonction.

Je ne sais plus ce qu'il y a dans ton code. est-ce que tu fais une pause avec la variable dt quelque part ? Si oui, c'est compliqué d'augmenter ta variable budget toutes les 2 secondes, mais tu peux t'en sortir en augmentant ta variable budget d'un montant qui équivaudrait à si tu l'avais fait toutes les 2 secondes, avec une règle de proportionnalité (resourcegagné / 2 secondes = x / dt secondes ---> combien vaut x ?)

Avec les questions que tu poses je vois que tu n'as toujours pas lu de tuto.. Si t'avais pris la peine de lire un tuto tout s'éclairerait de ton côté je t'assure. Mais là t'es en train de galérer comme pas possible et il ne te reste plus que 4 jours. C'est encore jouable ceci dit si tu lis le tuto à vitesse V pendant le week-end.

Ce que c'est qu'un booléen, ce que c'est qu'une fonction, comment tester quel élément d'une liste ça enlève.. c'est tout dans le tuto

https://openclassrooms.com/fr/courses/235344-apprenez-a-programmer-en-python

-
Edité par potterman28wxcv 23 mai 2019 à 23:15:50

  • Partager sur Facebook
  • Partager sur Twitter
25 mai 2019 à 11:36:01

malheureusement j'ai déjà lu beaucoup de partie de ce tuto, mais mon habilité  n'as pas forcément cru, je vais quand même essayer de le terminer.
  • Partager sur Facebook
  • Partager sur Twitter
7 septembre 2019 à 20:45:17

Bonjour, je vous fais un retour sur mon projet, il a été terminé dans les temps et été fonctionnel, j'ai obtenue la note de 14 pour mon projet au bac, je tenais à remercier les différents contributeurs à ceux résultat.
  • Partager sur Facebook
  • Partager sur Twitter