Programmation d'un circuit

Signaler
-
 neirdah -
Bonjour,

Je me présente d'abord. Je suis un étudiant en CPGE et nous avons un projet informatique à faire pour la fin d'année.

Nous avons choisi de le faire sur les 24h du mans. Nous avons coder l'interface mais nous arrivons dans une partie bien plus difficile : la modélisation du circuit.

Nous n'avons par bien d'idée de comment faire varier des paramètres en fonction d'une durée de course ou même de comment modéliser une voiture sur le circuit.

Je suis donc preneur de toute idée sur le sujet.

Merci.

Configuration: Windows / Edge 88.0.705.56

12 réponses

Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Bonjour Neirdah,

Vaste sujet !

C'est un programme graphique ?

En 2D, donc en vue de dessus du circuit ?

Ou en 3D, donc avec les perspectives et tout et tout ?
Alors c'est un programme en 2D, le format 3D n'étant pas judicieux étant donné que l'on veut faire un jeu de gestion.
Le but sera de gérer sa voiture, la faire rentrer au stand dans les bons temps pour gagner la course.
Nous avons commencer à coder certaines fonctions.
Il nous manque tout de même l'essentiel, étant de modélisé la voiture par un point circulant sur le circuit.
Nous avons entendu parler des courbes de Béziers mais nous ne savons pas trop comment les mettre en œuvres.
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Ah ok, la voiture est simplement un point..
Les courbes de Bézier, c'est pour la forme du circuit ?

Et pourquoi pas une suite d'arcs de cercle ?
Ce serait plus simple, les courbes de Bézier sont pilotées par des points externes appelés
points de contrôle, et ce n'est pas facile à mettre en œuvre, il faut utiliser des équations
paramétriques du genre x(t)=... et y(t)= ...
C'est notre prof de math qui nous a proposé de faire cela avec les courbes de Béziers mais une suite d'arc de cercle semble pertinente.
Je ne vois par contre pas bien comment faire cela et faire ensuite circulé la voiture dessus.
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Bonjour Neirdah,

Comment as-tu fait ton interface graphique ?

Avec la bibliothèque Tkinter, ou autre ?

Il est facile de dessiner des arcs de cercle et un petit cercle qui représenterai la voiture ..
J'ai fait mon interface graphique à l'aide de tkinter. Je suis en cours d'apprentissage et je galère un peu parfois.
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Peux-tu nous afficher le code de ton interface ici, en appliquant les balises de code ?

https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Visuellement, ça doit ressembler à ceci (avec la coloration syntaxique) :

def test():
    print('test')

test()


On pourrait voir ce que l'on peut faire ...
Bonjour,
globalement j'ai cela :

from tkinter import *
import random as rd

class Menu() :
    WIDTH=1000
    HEIGHT=500
    def __init__(self) :
        self.f = Tk()


        self.f.title('Les 24 Heures Du Mans')
        self.f.config(bg = '#A4A4A4')
        self.f.geometry('1000x500')
        self.f.iconbitmap(r'C:\Users\lbhad\OneDrive\Documents\BCPST\2\Informatique\circuit_entier.ico')

        l=Label(self.f, text = 'Bienvenue dans Le Mans, Le jeu', bg = '#A4A4A4' ).pack()
        l0=Label(self.f, text = "Ceci est un jeu de simulation visant à recréer différentes années de la célèbre course des 24h du Mans.\nVous allez être projeté au coeur de l'une de ces années avec pour objectif de réussir à gagner.\nPlusieurs paramètres seront pris en compte pour cela.\nNous vous laissons découvrir tout cela... Bon jeu !", bg = '#A4A4A4').pack()

        b0 = Button(self.f, width = '10', text = 'Suite !', bg = '#A4A4A4', command=self.s).pack()
        bEnd = Button(self.f, text = 'Quitter', command = self.destroyf).pack(side=BOTTOM)

        self.f.mainloop()

    def Ecuries(self) :
        self.f1 = Tk()

        self.f1.title('Les 24 Heures Du Mans')
        self.f1.config(bg = '#A4A4A4')
        self.f1.geometry('1000x500')

        l1 = Label(self.f1, text = 'Veuillez choisir votre écurie.', bg = '#A4A4A4').pack()
        l2 = Label(self.f1, text = 'Attention, chaque écurie possède ses propres caractéristiques !', bg = '#A4A4A4', fg = '#B40431').pack()
        l3 = Label(self.f1, text = 'Bon jeu !', bg = '#A4A4A4').pack()

        b1 = Button(self.f1, width = '10', text = "Ferrari", bg = '#A4A4A4', fg = '#FF0040', command=self.s1).pack()
        b2 = Button(self.f1, width = '10', text = 'Alpine', bg = '#A4A4A4', command=self.s1).pack()
        b3 = Button(self.f1, width = '10', text = 'Porsche', bg = '#A4A4A4', fg = '#F3F781', command=self.s1).pack()
        b4 = Button(self.f1, width = '10', text = 'Ford', bg = '#A4A4A4', fg = '#2E2EFE', command=self.s1).pack()
        b5 = Button(self.f1, width = '10', text = 'Shelby', bg = '#A4A4A4', fg = '#01A9DB', command=self.s1).pack()
        b6 = Button(self.f1, width = '10', text = 'Austin', bg = '#A4A4A4', fg = '#088A08', command=self.s1).pack()
        bEnd = Button(self.f1, text = 'Quitter', command = self.destroyf1).pack(side=BOTTOM)


        self.f1.mainloop()

    def Boost(self) :
        self.f2 = Tk()

        self.f2.title('Les 24 Heures Du Mans')
        self.f2.config(bg = '#A4A4A4')
        self.f2.geometry('1000x500')

        value = DoubleVar()

        l1 = Label(self.f2, text = 'Les pneus', bg = '#A4A4A4').pack()
        c1 = Checkbutton(self.f2, width = '100' , text = 'Soft tires', bg = '#A4A4A4', fg = '#58FA58').pack()
        c2 = Checkbutton(self.f2, width = '100' , text = 'Medium tires', bg = '#A4A4A4', fg = '#DF7401').pack()
        c3 = Checkbutton(self.f2, width = '100' , text = 'Wet time tires', bg = '#A4A4A4', fg = '#DF0101').pack()

        l2 = Label(self.f2, text = 'Les spoilers', bg = '#A4A4A4').pack()
        c4 = Checkbutton(self.f2, width = '100' , text = 'Spoiler basique', bg = '#A4A4A4', fg = '#58FA58').pack()
        c5 = Checkbutton(self.f2, width = '100' , text = 'Spoiler élite', bg = '#A4A4A4', fg = '#DF0101').pack()

        l3 = Label(self.f2, text = 'Puissance moteur', bg = '#A4A4A4').pack()

        s1 = Scale(self.f2, bg = '#A4A4A4', orient = HORIZONTAL, variable = value).pack()

        b1 = Button(self.f2, width = '10', text = 'Suite !', bg = '#A4A4A4', command=self.s2).pack()
        bEnd = Button(self.f2, text = 'Quitter', command = self.destroyf2).pack(side=BOTTOM)



        self.f2.mainloop()

    def circuit(self) :
        self.f3 = Tk()

        self.f3.title('Les 24 Heures Du Mans')
        self.f3.config(bg = '#A4A4A4')
        self.f3.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100')

        l1 = Label(self.f3, width = 20, text = 'Vos options en jeu.', bg = '#A4A4A4').place(x = 850, y = 15)
        l2 = Label(self.f3, width = 20 , text = 'Retour au stand', bg = '#A4A4A4').place(x = 850,y = 100)
        l3 = Label(self.f3, width = 20, text = 'Etat des pneus', bg = '#A4A4A4').place(x = 850, y = 280)
        l4 = Label(self.f3, width = 20, text = "Jauge d'essence", bg = '#A4A4A4').place(x = 850, y = 350)

        b1 = Button(self.f3, width = 20, text = "Plein d'essence", bg = '#A4A4A4').place(x = 850, y = 120)
        b2 = Button(self.f3, width = 20, text = "Changement pour pneu\nmedium", bg = '#A4A4A4').place(x = 850, y = 150)
        b2 = Button(self.f3, width = 20, text = "Changement pour pneu\nmou", bg = '#A4A4A4').place(x = 850, y = 195)
        b2 = Button(self.f3, width = 20, text = "Changement pour pneu\npluie", bg = '#A4A4A4').place(x = 850, y = 240)
        bEnd = Button(self.f3, text ='Quitter', command = self.destroyf3).place(x = 450, y = 475)

        self.f3.mainloop()

    def s(self) :
        self.f.destroy()
        self.Ecuries()

    def s1(self) :
        self.f1.destroy()
        self.Boost()

    def s2(self) :
        self.f2.destroy()
        self.circuit()

    def destroyf(self) :
        self.f.destroy()

    def destroyf1(self) :
        self.f1.destroy()

    def destroyf2(self) :
        self.f2.destroy()

    def destroyf3(self) :
        self.f3.destroy()


start = Menu()


J'ai aussi l'insertion d'une image que j'aimerai mettre en fond des pages.

from tkinter import *
class Interface(Tk):

    def __init__(self, path_image):
        super(Interface, self).__init__()

        self.image = PhotoImage(file=path_image)
        self.w, self.h = self.image.width(), self.image.height()

        self.canvas = Canvas(self, width=self.w, height=self.h)
        self.canvas.pack()
        self.canvas.create_image((self.w//2, self.h//2), image=self.image)

        self.mainloop()



Interface(r"C:\Users\lbhad\OneDrive\Documents\BCPST\2\Informatique\logo2.png")
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Bonjour Neirdah,

Ces 2 codes ne sont pas dans le même fichier ?

Et c'est un peu bizarre de re créer une fenêtre principale a chaque saisie, mais bon ...

(self.f1 = Tk(), etc ...)

Ceci dit, pour dessiner le circuit, il faut créer un Canvas dans la fenêtre qui est dans la

fonction circuit , voir cours Tkinter sur le Net ...

Et dans un Canvas, on peut dessiner toutes sortes de figures géométriques
Bonjour,

je suis d'accord que c'est un peu bizarre de faire de cette façon et d'ouvrir une nouvelle fenêtre à chaque fois mais je ne sais pas comment faire autrement.

Les deux codes ne sont pas dans le même fichier parce que je n'arrive pas à relier les codes (je ne suis pas très bon en tkinter aha)

Après pour ce qui est de la modélisation j'ai fait un dessin du circuit mais je ne sais pas comment faire pour que la voiture circule dessus.
Messages postés
1027
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
25 février 2021
86
Salut

d'ouvrir une nouvelle fenêtre à chaque fois mais je ne sais pas comment faire autrement.
Il faut utiliser la méthode Toplevel() au lieu de Tk(). Le problème en faisant plusieurs appels à Tk(), tu as autant de mainloop(), ça peut perturber le processeur.
Si tu as x fenêtres à créer, tu fais 1 appel à Tk() et x-1 appels à Toplevel()
>
Messages postés
1027
Date d'inscription
samedi 12 septembre 2020
Statut
Membre
Dernière intervention
25 février 2021

Salut,

Merci pour cette solution. Je vais creuser un peu cela car je ne sais pas du tout comment utiliser Toplevel.
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Bonsoir Neirdah,

Rien n'empêche de mettre le contenu de ton 2eme code dans le premier
Mais ou exactement veux tu mettre ton image de fond de page ?

Car en fait, l'image principale de ta fenêtre, c'est un Canvas dans ta fonction circuit() et dans lequel tu vas dessiner ton circuit

" j'ai fait un dessin du circuit ...", donc tu l'as déjà dessiné graphiquement dans ta fenêtre , c'est
bien ça ou pas ?

Remarque: la fonction circuit plante car WIDTH et HEIGHT y sont inconnues
Bonjour,

Désolé de cette absence, nous avons profité de quelques congés.

Pour ce qui est de mon image de fond de page je souhaite la mettre sur les premières pages en fond avec le texte par dessus.

J'ai utilisé Gimp afin de créer une image réaliste du circuit et que j'aimerai donc insérer en fond afin que les voitures tournent dessus.

Je n'ai pas eu de problème particulier venant de WIDTH et HEIGHT
Messages postés
938
Date d'inscription
lundi 23 mars 2020
Statut
Membre
Dernière intervention
24 février 2021
100
Bonjour,

Je n'ai pas eu de problème particulier venant de WIDTH et HEIGHT

C'est sur qu'on ne voit rien en lançant le programme en double-cliquant sur le fichier, par exemple, mais en l'exécutant via IDLE, on voit ça:

File "C:\Phil\Dev\Python\tests\ccm\circuit.pyw", line 80, in circuit
self.f3.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+300+100')
NameError: name 'WIDTH' is not defined


WIDTH n'est pas défini, normal, il est déclaré au début de la classe Menu(), mais dans la fonction circuit(), il est inconnu !
J'ai corrigé cette erreur en incorporant le WIDTH à l'intérieur de la fonction, merci.