def extraire_modeles_depuis_bdd(self):
     """ Créer les modèles à partir des données chargées
     ---
     """
     for c in self.liste_pays:
         if self.est_enregistre(c.tag):
             self.liste_modeles.append(Modele(c, self))
Пример #2
0
    def __init__(self):
        self.modele         = Modele(self)
        self.vue            = Vue(self)

        self.modele.init_grid_Pathfinding(self)
        self.client       = None
        self.serveur      = None
        self.nomBatiment  = None
        self.infoCreation = None
        self.etatCreation = None
        self.tempsDebut   = None
        self.compteur     = 0
        self.afterID      = None
        #Section Temporaire
        self.verbose = False # //Mettre verbose a True pour plus de print venant du serveur
        
        self.client = Client()
        self.initServerLobby()
        self.vue.root.mainloop()
        self.closeGame()
 def __init__(self):
     Modele.__init__(self)
     self.pi = 0
     self.mu1 = np.array(0)
     self.mu0 = np.array(0)
     return
Пример #4
0
class Controleur():
    def __init__(self):
        self.modele = None
        self.gui = None

        nbCol = 25
        nbLignes = 20
        nbPlanete = 35

        self.initModele(nbCol, nbLignes, nbPlanete)
        self.initGui()

    def initGui(self):
        self.gui = Gui(self.gameLoop)
        self.gui.activerValiderDeplacement(False)
        self.gui.activerBarreAugmentation(False)

        data = {}
        data["anneeCourante"] = self.modele.anneeCourante
        data["listePlanetes"] = self.modele.planetes
        data["nbPlanetesHumain"] = self.modele.getNbPlanetesRace(Races.HUMAIN)
        data["nbPlanetesGubru"] = self.modele.getNbPlanetesRace(Races.GUBRU)
        data["nbPlanetesCzin"] = self.modele.getNbPlanetesRace(Races.CZIN)
        data["selection1"] = None
        data["selection2"] = None
        data["flottesHumaines"] = None
        data["flottes"] = self.modele.flottes

        self.gui.rafraichir(data)

    def initModele(self, nbCols, nbLignes, nbPlanetes):
        self.modele = Modele(nbCols, nbLignes, nbPlanetes)
        self.modele.creerPlanetes()

    def executer(self):
        """ permet de lancer le GUI """
        self.gui.run()

    def gameLoop(self, userAction, coordinates=None):
        """ the coordiantes should be tuples """
        if userAction == UserActions.VALIDER_DEPLACEMENT:
            self.validationDeplacement()

        elif userAction == UserActions.VALIDER_TOUR:
            self.finTour()

        elif userAction is UserActions.SELECT_PLANETE or userAction is UserActions.SELECT_PLANETE_2:
            self.gestionSelectionPlanete(coordinates, userAction)

        elif userAction == UserActions.FLOTTE_CHANGEMEMT:
            self.gestionChangementFlotte()


    # MÉTHODES DE CONTRÔLES PRINCIPALES #
    def gestionSelectionPlanete(self, coordonnee, userAction):
        """ Méthode gérant le cas de la sélection d'une planète """
        planete = self.modele.getPlaneteAt(coordonnee[0], coordonnee[1])

        if not planete:  # Si on clique dans le vide
            if userAction is UserActions.SELECT_PLANETE:
                self.modele.planeteSelectionnee = None
                self.gui.resetNombreVaisseaux()
                self.gui.activerBarreAugmentation(False)
                self.gui.activerValiderDeplacement(False)

            else:
                self.modele.planeteSelectionnee2 = None
        else:
            self.inspecterPlanete(planete)
            if userAction is UserActions.SELECT_PLANETE:
                self.gestionSelection1(planete)
            else:
                self.gestionSelection2(planete)
                self.rafraichirFlotte()

        self.rafraichirGui()


    def gestionSelection1(self, planete):
        self.modele.planeteSelectionnee = planete

        if self.modele.planeteSelectionnee.civilisation == Races.HUMAIN:
            self.gui.nbVaisseauxWidget.configure(to_=planete.nbVaisseaux)
            activation = True
        else:
            activation = False
            self.gui.resetNombreVaisseaux()

        self.gui.activerBarreAugmentation(activation)


    def gestionSelection2(self, planete):
        self.modele.planeteSelectionnee2 = planete
        if self.modele.planeteSelectionnee:
            if self.modele.planeteSelectionnee.civilisation == Races.HUMAIN:
                self.gui.nbVaisseauxWidget.configure(to_=self.modele.planeteSelectionnee.nbVaisseaux)
                activation = True
            else:
                activation = False
                self.gui.resetNombreVaisseaux()

            self.gui.activerBarreAugmentation(activation)


    def gestionChangementFlotte(self):
        """ Méthode gérant le cas du changement du nombre de vaisseaux d'une flotte """
        if self.gui.getNbVaisseaux() <= 0 or not self.modele.planeteSelectionnee2:
            activation = False
        else:
            activation = True

        self.gui.activerValiderDeplacement(activation)



    def rafraichirFlotte(self):
        depart = self.modele.planeteSelectionnee
        arrivee = self.modele.planeteSelectionnee2
        data = {"planeteDepart": depart, "planeteArrivee": arrivee}
        if depart and arrivee:
            data["distance"] = self.modele.calculerDistance(depart, arrivee)
        else:
            data["distance"] = None
        self.gui.rafraichirFlotte(data)


    def inspecterPlanete(self, planete):
        """ Inspecte une la planete selon le niveau de connaissance """
        if planete.civilisation == Races.HUMAIN:
            self.gui.inspecterPlanete(planete.nom, planete.posX, planete.posY, planete.nbManufactures,
                                      planete.nbVaisseaux)
            return

        if planete.nbVisites == 0:
            self.gui.inspecterPlanete(planete.nom, planete.posX, planete.posY)

        if planete.nbVisites == 1:
            self.gui.inspecterPlanete(planete.nom, planete.posX, planete.posY, planete.nbManufactures)

        if planete.nbVisites == 2:
            self.gui.inspecterPlanete(planete.nom, planete.posX, planete.posY, planete.nbManufactures)

        if planete.nbVisites >= 3:
            self.gui.inspecterPlanete(planete.nom, planete.posX, planete.posY, planete.nbManufactures, planete.nbVaisseaux)


    def validationDeplacement(self):
        """ Méthode gérant le cas de la validation d'un déplacement """
        # Rafraîchissement du GUI
        self.rafraichirGui()

        planeteDepart = self.modele.planeteSelectionnee
        planeteArrive = self.modele.planeteSelectionnee2
        nbVaisseaux = self.gui.getNbVaisseaux()

        self.modele.ajouterFlotte(planeteDepart, planeteArrive, Races.HUMAIN, nbVaisseaux)

        self.gui.resetNombreVaisseaux()
        self.gui.activerBarreAugmentation(False)
        self.gui.activerValiderDeplacement(False)
        self.rafraichirGui()


    def finTour(self):
        """ Méthode gérant le cas de la fin d'un tour"""
        self.modele.avancerTemps()
        self.gestionNotifications()
        self.rafraichirGui()


    def rafraichirGui(self):
        data = {}
        data["anneeCourante"] = self.modele.anneeCourante
        data["listePlanetes"] = self.modele.planetes
        data["nbPlanetesHumain"] = self.modele.getNbPlanetesRace(Races.HUMAIN)
        data["nbPlanetesGubru"] = self.modele.getNbPlanetesRace(Races.GUBRU)
        data["nbPlanetesCzin"] = self.modele.getNbPlanetesRace(Races.CZIN)
        data["selection1"] = self.modele.planeteSelectionnee
        data["selection2"] = self.modele.planeteSelectionnee2
        data["flottes"] = self.modele.flottes
        self.gui.rafraichir(data)








    def gestionNotifications(self):
        """ Permet de gérer les notifications """

        notifications = self.modele.notifications
        for notif in notifications:
            if isinstance(notif, Affrontement):
                self.gestionNotifAffrontement(notif)
            elif isinstance(notif, Annihilation):
                self.gestionNotifAnnihilation(notif)
        self.modele.notifications = []  # On vide les notifications

    def gestionNotifAnnihilation(self, notif):
        """ Gestion notifications d'annihilation """
        self.gui.consoleHumains.annihilation(notif.annee, notif.race)
        self.gui.consoleEnnemis.annihilation(notif.annee, notif.race)

    def gestionNotifAffrontement(self, notif):
        """ Gestion notifications d'affrontement """

        isHumainConcernes = False
        if notif.attaquant is Races.HUMAIN or notif.defenseur is Races.HUMAIN:
            isHumainConcernes = True

        # il y eu affrontement

        if isHumainConcernes:
            self.gui.consoleHumains.affrontementPlanete(notif.annee, notif.attaquant, notif.defenseur, notif.planete)

        self.gui.consoleEnnemis.affrontementPlanete(notif.annee, notif.attaquant, notif.defenseur, notif.planete)

        if notif.isDefenseReussie:  # Défense réussie

            if isHumainConcernes:
                self.gui.consoleHumains.defensePlanete(notif.annee, notif.defenseur, notif.attaquant, notif.planete)

            self.gui.consoleEnnemis.defensePlanete(notif.annee, notif.defenseur, notif.attaquant, notif.planete)

        else:  # Défense ratée, perte planète gain pour autre
            if isHumainConcernes:
                self.gui.consoleHumains.victoirePlanete(notif.annee, notif.attaquant, notif.planete)
                self.gui.consoleHumains.pertePlanete(notif.annee, notif.defenseur, notif.attaquant, notif.planete)

            self.gui.consoleEnnemis.pertePlanete(notif.annee, notif.defenseur, notif.attaquant, notif.planete)
            self.gui.consoleEnnemis.victoirePlanete(notif.annee, notif.attaquant, notif.planete)
Пример #5
0
 def initModele(self, nbCols, nbLignes, nbPlanetes):
     self.modele = Modele(nbCols, nbLignes, nbPlanetes)
     self.modele.creerPlanetes()
Пример #6
0
class Controleur:
    def __init__(self):
        self.modele         = Modele(self)
        self.vue            = Vue(self)

        self.modele.init_grid_Pathfinding(self)
        self.client       = None
        self.serveur      = None
        self.nomBatiment  = None
        self.infoCreation = None
        self.etatCreation = None
        self.tempsDebut   = None
        self.compteur     = 0
        self.afterID      = None
        #Section Temporaire
        self.verbose = False # //Mettre verbose a True pour plus de print venant du serveur
        
        self.client = Client()
        self.initServerLobby()
        self.vue.root.mainloop()
        self.closeGame()


    #Fonction qui crée le serveur. Un seul est nécéssaire par partie
    def creeServeur(self, nameServer, nomPartie, nomJoueur):
        print(nameServer, nomPartie, nomJoueur, self.verbose)
        self.serveur = Server(nameServer, nomPartie, nomJoueur, test = self.verbose) #Initialisation 
        self.serveur.daemon = True
        self.serveur.start()    #Démarrage du serveur

    def initServerLobby(self):
        self.vue.removeGridDisplay()
        self.vue.displayServers([])
        self.serverLobby()

    #Fait afficher le lobby de choix de serveur
    def serverLobby(self):
        if(self.client.nameServer):
            try:
                self.vue.refreshServers(self.client.getServers())#Affichage du lobby
            except:
                print("oups le nameServer ne répond plus...")
                self.client.nameServer = None
        else:
            self.vue.refreshServers({})
            self.client.findNameServerThread()

        self.afterID = self.vue.root.after(5000,self.serverLobby)


    #Fonction qui permet d'entrer dans un Lobby et affiche le lobby de partie
    def joinLobby(self):
        selectedServer = self.vue.serverList.get(self.vue.serverList.curselection()[0])#Pour obtenir le serveur selectionne dans la listbox
        if(selectedServer):
            self.vue.root.after_cancel(self.afterID)
            self.client.nom = self.vue.entreClient.get()
            print("Connecting "+self.client.nom+" to "+selectedServer)
            self.client.connect(selectedServer)#Se connecter au serveur
            self.vue.removeGridDisplay()
            self.vue.displayLobby(self.serveur)
            self.playerLobby()

    #Creation d'un nouveau serveur et affiche le lobby de partie
    def createLobby(self):
        self.vue.root.after_cancel(self.afterID)
        self.client.nom = self.vue.entreClient.get()
        self.creeServeur(self.client.nameServer, self.vue.entreServeur.get(), self.client.nom)
        while not self.serveur.isReady:
            time.sleep(0.1)
            #possibilité d'affficher un loading ici
        self.client.findNameServer()
        self.client.connect(self.vue.entreServeur.get())
        self.vue.removeGridDisplay()
        self.vue.displayLobby(self.serveur)
        self.playerLobby()
        

    def playerLobby(self):
        self.vue.refreshLobby(self.client.proxy.getStartingInfo())
        if(self.client.proxy.isGameStarted()):
            self.lancerPartie()
        else:
            if(self.serveur):
                self.client.setCpuClient( int(self.vue.spinBox.get()) )  #Afin que tous les joueurs puisse afficher les joueur IA dans leur lobby
                if(not self.client.isNameServerAlive()):
                    self.server.startNameServer()
            self.afterID = self.vue.root.after(300,self.playerLobby)


    #Retourne si le client est aussi le host
    def isHost(self):
        if(self.serveur): return True
        return False

    def clearLog(self):
        se = platform.system()
        if(se == 'Windows'):
            os.system('cls')
        else:
            os.system('clear')

    #Fonction qui démarre la partie
    def lancerPartie(self):
        self.vue.root.after_cancel(self.afterID)
        if(self.serveur):
            self.serveur.removeServerBroadcast()
            self.client.proxy.startGame()
        self.vue.removeGridDisplay()
        self.clearLog()
        print("Numero de joueur : " + str(self.client.noJoueur))
        self.modele.initPartie(self.client.noJoueur, self.client.getStartingInfo(), self.isHost())
        self.client.setCpuClient(self.modele.getAIcount())
        self.vue.displayMap(self.modele.map)
        self.vue.generateSpriteSet(self.modele.noJoueurLocal)
        self.vue.displayObject(self.modele.listeJoueur,[],self.modele.noJoueurLocal,self.modele.selection)
        self.vue.displayHUD()
        self.vue.displayRessources(self.modele.listeJoueur[self.modele.noJoueurLocal].listeRessource)
        self.tempsDebut = time.time()
        self.gameLoop()
    
    def packAction2Server(self):
        retour = []
        retour.append((self.modele.noJoueurLocal,self.modele.dicAction2Server))
        if(self.serveur):
            for joueur in self.modele.listeJoueur:
                if isinstance(joueur,AI):
                    retour.append((joueur.noJoueur, joueur.dictionaireAction))
        return retour

    def gameLoop(self):
        reception = None
        if(self.verbose):print("\n----------------------------\n",self.compteur, "ENVOIE : ", self.packAction2Server())
        self.client.pushAction( self.packAction2Server() )
        self.modele.dicAction2Server.clear()
        while not reception:
            reception = self.client.pullAction()
            #if(self.verbose):print("RECOIE : ", reception)
            if(not reception):
                time.sleep(0.01)
                #print("laaaaag!")
        self.modele.gestion( reception )
        """if(self.vue.etatCreation==True):
            self.vue.dessinerShadowBatiment()"""
        self.modele.actualiser()
        self.vue.displayRessources(self.modele.listeJoueur[self.modele.noJoueurLocal].listeRessource)
        self.vue.displayObject(self.modele.listeJoueur,[],self.modele.noJoueurLocal,self.modele.selection)
        self.vue.displayPop(self.modele.listeJoueur[self.modele.noJoueurLocal])
        #self.vue.displayNodes(self.modele.cutNodes)
        self.compteur+=1
        self.vue.root.after(24,self.gameLoop)

    def gererMouseClick(self,event):
        offset = self.vue.getSurfacePos()#Obtenir la position du canvas
        self.modele.clickPosx = event.x+offset[0]
        self.modele.clickPosy = event.y+offset[1]

    def gererMouseDrag(self, event):
        offset = self.vue.getSurfacePos()
        self.vue.displaySelection((self.modele.clickPosx,self.modele.clickPosy), event)

    def gererMouseRelease(self,event):
        self.vue.eraseSelection()
        offset = self.vue.getSurfacePos()#Obtenir la position du canvas
        self.modele.releasePosx = event.x+offset[0]
        self.modele.releasePosy = event.y+offset[1]
        self.modele.gererMouseRelease(event,self.etatCreation, self.infoCreation)
        try:
            self.vue.displayInfoUnit(self.modele.selection[0],self.modele.noJoueurLocal)
        except Exception:
            self.vue.hud.delete("infos")
            self.vue.hud.delete("button")
            self.vue.hud.delete("thumbnail")
            print("Pas de selection!")
        self.vue.etatCreation = False

    def getResearch(self, noLocal):
        return self.modele.listeJoueur[noLocal].availableResearch
        
    def spawnUnit(self, unitName):
        self.modele.spawnUnit(unitName)
        
    def moveUnitWithMinimap(self, event):
        #print("Avant : ",event.x, event.y)
        event.x = event.x * (len(self.modele.map.map[0])*64)/self.vue.miniMapW
        event.y = event.y * (len(self.modele.map.map)*64)/self.vue.miniMapH
        self.modele.releasePosx = event.x
        self.modele.releasePosy = event.y
        #print("Apres : ",event.x, event.y)
        self.modele.gererMouseRelease(event,self.etatCreation, self.infoCreation)
        
        

    def getSizeBatiment(self, batiment):
        return self.modele.dictBatiment[batiment]

    def closeGame(self):
        if(self.client and self.client.proxy):
            self.client.disconnect()

        if(self.serveur):
            self.serveur.close()
Пример #7
0
 def __init__(self):
         Modele.__init__(self)
         self.beta = np.array(0)
         return
Пример #8
0
def exec():
    opti = Modele()
    print(
        " 1-Heuristique  Ordre croissant des prix des packs \nordre:{}  \nsolution :{}\nz={}\n\n"
        .format(opti.ordeByPrix(),
                opti.heuristique(opti.ordeByPrix())[4],
                opti.heuristique(opti.ordeByPrix())[2]))

    print(
        " 2-Heuristique  Ordre croissant des prix des packs \nordre:{}  \nsolution :{}\nz={}\n\n"
        .format(opti.orderByNombreHeure(),
                opti.heuristique(opti.orderByNombreHeure())[4],
                opti.heuristique(opti.orderByNombreHeure(False))[2]))

    print(
        " 3-Heuristique Ordre décroissant du nombre d’heures par packs \nordre:{}  \nsolution :{}\nz={}\n\n"
        .format(opti.orderByRatioPrixSurNbHeure(),
                opti.heuristique(opti.orderByRatioPrixSurNbHeure(False))[4],
                opti.heuristique(opti.orderByRatioPrixSurNbHeure(False))[2]))

    print(
        " 4-Heuristique Ordre croissant du ratio (prix/nombre d’heures) \nordre:{}  \nsolution :{}\nz={}\n\n"
        .format(opti.orderByRatioPrixSurNbHeure(),
                opti.heuristique(opti.orderByRatioPrixSurNbHeure(False))[4],
                opti.heuristique(opti.orderByRatioPrixSurNbHeure())[2]))

    print(" 5-La meilleur Heuristique  :{}\n\n".format(
        opti.bestHeuristique()[0]))
    #  input("entrez une touche pour continuer")
    s = opti.borneSUp()
    print(
        "Q2-\nL’ordre initial{} \n la solution de la relaxation {} \nz={}\n\n".
        format(opti.orderByRatioPrixSurNbHeure(False), s[4], s[2]))
    deb = time()
    print("Debut parcours de noeud[bourne sup-sol relaxée]")
    s = opti.solve()
    print("Fin parcours")
    duree = time() - deb
    print("Q3-")
    print("La solution :{}\nl'objectif de la solution:{}\nz={}\n\n".format(
        s[0], s[2], s[1]))
    print("Le  nombre  de  nœuds  explorer  par  l’ordre  de  B&B :",
          Node.nbre)
    print("Temps d execution :%f" % duree)
    print("la solution  optimale{}\n Z:{}".format(s[0], s[1]))