class Controleur: def __init__(self): self.map = Map(31, 23) self.nourriture = Nourriture() self.serpent = Serpent() self.oriente = "Down" self.vie = True def initialize(self): self.serpent.setPosition(5,5, "Left") self.gui.ajouterID_corps(3) self.nouvellePositionNourriture() file = FileMap() matrice = file.loadFromFile("map.txt") valeur = self.map.loadMatrice(matrice) self.gui.ajouterID_obstacles(valeur) def getPositionBlock(self): return self.block.getPosition() def getLongueurMap(self): return self.map.getLongueur() def getHauteurMap(self): return self.map.getHauteur() def getPositionSerpent(self): return self.serpent.getPosition() def getPositionNourriture(self): return self.nourriture.getPosition() def checkEat(self): if self.nourriture.getPosition() == self.serpent.getPosition(): self.serpent.agrandir(1) self.gui.ajouterID_corps() self.nouvellePositionNourriture() def getRandom(self, start, end): return randint(start, end) def getRandomFree(self): #Trop aléatoire, DANGER ! pos = (self.getRandom(0, self.getLongueurMap()-1), self.getRandom(0, self.getHauteurMap()-1)) while self.checkCollision(pos[0], pos[1]): pos = (self.getRandom(0, self.getLongueurMap()), self.getRandom(0, self.getHauteurMap())) return pos def serpent_goLeft(self): self.serpent.move_left(self.getLongueurMap()) def serpent_goRight(self): self.serpent.move_right(self.getLongueurMap()) def serpent_goUp(self): self.serpent.move_up(self.getHauteurMap()) def serpent_goDown(self): self.serpent.move_down(self.getHauteurMap()) def nouvellePositionNourriture(self): pos = self.getRandomFree() self.nourriture.setPosition(pos[0], pos[1]) self.gui.afficherNourriture() def link(self, gui): self.gui = gui self.initialize() def getListeCorpsSerpent(self): return self.serpent.getListeCorps() def move (self): if self.vie: if self.oriente == "Left": if self.possible_left(): self.serpent_goLeft() else: self.serpentMort() elif self.oriente == "Right": if self.possible_right(): self.serpent_goRight() else : self.serpentMort() elif self.oriente == "Up": if self.possible_up(): self.serpent_goUp() else : self.serpentMort() elif self.oriente == "Down": if self.possible_down(): self.serpent_goDown() else : self.serpentMort() self.gui.afficherSerpent() self.gui.afficherNourriture() else: print("Mort") def possible_left(self): pos = self.serpent.getPosition() pos = (pos[0]-1, pos[1]) return not self.checkCollision(pos[0], pos[1]) def possible_right(self): pos = self.serpent.getPosition() pos = ((pos[0]+1) %self.getLongueurMap(), pos[1]) return not self.checkCollision(pos[0], pos[1]) def possible_up(self): pos = self.serpent.getPosition() pos = (pos[0], pos[1]-1 ) return not self.checkCollision(pos[0], pos[1]) def possible_down(self): pos = self.serpent.getPosition() pos = (pos[0], (pos[1]+1)%self.getHauteurMap() ) return not self.checkCollision(pos[0], pos[1]) def oriente_serpent_left(self, event): if self.oriente != "Right": self.set_var("Left") def oriente_serpent_right(self, event): if self.oriente != "Left": self.set_var("Right") def oriente_serpent_up(self, event): if self.oriente != "Down": self.set_var("Up") def oriente_serpent_down(self, event): if self.oriente != "Up": self.set_var("Down") def set_var(self, var): self.oriente = var def checkCollision_corps(self, pos_x, pos_y): return self.serpent.contains(pos_x, pos_y) def switch(self, event): self.gui.switchToMenu() def getPositionObstacles(self): liste_pos = self.map.getPositionObstacles() return liste_pos def ajouterObstacles(self, x, y, valeur): self.map.set_obstacle(x, y, valeur) self.gui.ajouterID_obstacles() def checkCollision_obstacles(self, x, y): return self.map.obstacles_contains(x, y) def checkCollision(self, x, y): return self.checkCollision_corps(x, y) or self.checkCollision_obstacles(x, y) def serpentMort(self): self.vie = False
class Serveur(threading.Thread): def __init__(self, interface): threading.Thread.__init__(self) self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.sockets = {} self.interface = interface self.map = Map(1,1) file = FileMap() matrice = file.loadFromFile("map.txt") valeur = self.map.loadMatrice(matrice) self.running = True self.updateMovement() #Faire classe thread #valeurs def run(self): try: self.socket.bind(('',33033)) print("Serveur connecté, attente de player...") self.running = True while self.running: self.socket.listen(3) socket, adresse = self.socket.accept() print("Player connecté, adresse IP", adresse[0],", port",adresse[1]) player = Player(socket, self, self.interface) pos = self.map.getRandomFree(3) player.setPosition(pos[0], pos[1]) nom = player.getName() self.sockets[nom]=player player.start() self.interface.updatePlayers() except: print("La liaison du socket a été interrompue.") self.running = False self.socket.close() print ("Unexpected error:", sys.exc_info()) def updateMovement(self): liste_pos = [] for name in self.sockets: player = self.sockets[name] player.updateMovement() liste_pos.append(player.getPosition()) self.send("all", "update players", liste_pos) if (self.running): self.interface.fenetre.after(200, self.updateMovement) def isrunning(self): return self.running def getSizeConnected(self): return len(self.sockets) def stop(self): self.running = False self.socket.close() def analyse(self, name, message): message = json.loads(message) if message["type"] == "load map": obstacles = self.map.getPositionObstacles() data = {"width" : self.map.getLongueur(), "height": self.map.getHauteur(), "numbers":len(obstacles), "obstacles":obstacles} self.send(name, "load map", data) else: print("Type inconnu", message["type"], message["data"]) def send(self, name, types, data = ""): message = {} message["type"] = types message["data"] = data message = json.dumps(message) if name == "all": for name in self.sockets: self.sockets[name].socket.send(message.encode("Utf8")) else: self.sockets[name].socket.send(message.encode("Utf8")) def playerDeconnecte(self, name): self.sockets.pop(name) print ("Player", name,"déconnecté") self.interface.updatePlayers()