Bonjour à toutes et à tous
Je poste aujourd'hui sur ce forum car cela fait plusieurs jours que je bloque sur le même problème et je désespère vraiment.
J'apprends Python en ligne et j'arrive à un exercice où on nous demande de développer un petit jeu de labyrinthe appelé Roboc en 2 temps.
1) Développer le jeu qui doit fonctionner en console en mode solo
2) Étendre le code réalisé en développant 2 scripts serveur.py et client.py qui doivent permettre à plusieurs joueurs de jouer dans le même labyrinthe à tour de rôle
J'ai réussi la première partie sans aucun souci, j'obtiens un code fonctionnel, propre et modulaire que voici, vous êtes libres de le recopier rapidement pour voir ce qu'il fait, respectez bien l'arborescence cependant :
roboc.py
cartes/facile.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Jeu import * # FONCTIONS # Fonction principale # def main(): jeu = Jeu() jeu.bienvenue() while not jeu.termine: jeu.continuer() jeu.aurevoir() # PROGRAMME if __name__ == "__main__": main()
cartes/prison.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 OOOOOOUOOOOOO O O O O O . O O O O O U . x . U O O O O O . O O O O O OOOOOOUOOOOOO
classes/Jeu.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 OOOOOOOOOOOOOOOOO O O . O U O x O O O O O O O O O O O O O O O . O . O OOOOOOOOOOOOOOOOO
classes/Partie.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Carte import * from classes.Partie import * # CLASSE class Jeu: def __init__(self): self.nom = "ROBOC v1_1" self.cartes = [] self.termine = False def initialiser(self): self.cartes = chargerCartes() def bienvenue(self): print("#"*(len(self.nom)+4)) print("# {nomJeu} #".format(nomJeu=self.nom)) print("#"*(len(self.nom)+4)) print("Bienvenue dans le jeu du labyrinthe ! Vous pensez pouvoir en sortir ? C'est ce qu'on va voir !") def aurevoir(self): print("Au revoir !") def continuer(self): # Étape 1 : Charger les cartes self.initialiser() # Étape 2 : Demander au joueur d'en choisir une et lui confirmer son choix afficherCartes(self.cartes) carteChoisie = choisirCarte(self.cartes) confirmerCarteChoisie(carteChoisie) # Étape 4 : Démarrer une nouvelle partie sur la carte choisie # qui se poursuit tant qu'elle n'est pas gagnée # ou qu'on a pas saisi la commande pour quitter la partie et le jeu partie = Partie(carteChoisie) partie.labyrinthe.afficher() while not partie.terminee: partie.continuer() # Étape 5 : La partie est terminée, soit elle a été gagnée soit elle a été interrompue. if partie.gagnee: if partie.nombreCoups == 1: print("Bravo ! Vous avez trouvé la sortie en 1 coup !") else: print("Bravo ! Vous avez trouvé la sortie en {nombreCoups} coups !".format(nombreCoups=partie.nombreCoups)) self.rejouer() else: self.termine = True def rejouer(self): oui = ['o', 'oui'] non = ['n', 'non'] rejouerEnAttente = True while rejouerEnAttente: rejouer = input("Voulez-vous rejouer (o/n) ? ") rejouer = rejouer.lower() if rejouer in oui or rejouer in non: rejouerEnAttente = False else: print("ERREUR - Vous devez répondre par oui ou par non.") if rejouer in non: self.termine = True
classes/Carte.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # CLASSE class Partie: def __init__(self, carteChoisie): self.carte = carteChoisie self.labyrinthe = carteChoisie.labyrinthe self.nombreCoups = 0 self.gagnee = False self.terminee = False def continuer(self): commande, direction, nombrePas = self.saisirCommande() if commande != "q": # dans ce cas on sait qu'on a demandé un déplacement self.labyrinthe.deplacer_robot(self, direction, nombrePas) self.nombreCoups += 1 def saisirCommande(self): commandesPossibles = ["q", "n", "s", "o", "e"] direction = "" nombrePas = 0 messageErreur = "ERREUR - Vous devez saisir une commande reconnue.\nQ : sauvegarder et quitter\nN : 1 pas vers le Nord\nS : 1 pas vers le Sud\nO : 1 pas vers l'Ouest\nE : 1 pas vers l'Est\nExemple : N2 : 2 pas vers le Nord" commandeEnAttente = True while commandeEnAttente: commande = input("> ") commande = commande.lower() longueurCommande = len(commande) if longueurCommande == 0: print(messageErreur) elif longueurCommande == 1: if commande in commandesPossibles: if commande in "nsoe": direction = commande nombrePas = 1 else: self.terminee = True commandeEnAttente = False else: print(messageErreur) else: if commande[0] in commandesPossibles: if commande[0] in "nsoe": direction = commande[0] try: nombrePas = int(commande[1:]) except ValueError: print(messageErreur) else: commandeEnAttente = False else: print(messageErreur) else: print(messageErreur) return commande, direction, nombrePas
classes/Labyrinthe.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS import os from classes.Labyrinthe import * # FONCTIONS def chargerCartes(): cartes = [] nomsFichiers = os.listdir("cartes") for nomFichier in nomsFichiers: if nomFichier.endswith(".txt"): cheminFichier = os.path.join("cartes", nomFichier) with open(cheminFichier, "r") as fichierCarte: contenuFichier = fichierCarte.read() carte = Carte(nomFichier, contenuFichier) cartes.append(carte) return cartes def afficherCartes(cartes): print("Cartes disponibles :") for indiceCarte, carte in enumerate(cartes): print("{numeroCarte} - {nomCarte}".format(numeroCarte=indiceCarte+1, nomCarte=carte.nom)) def choisirCarte(cartes): numerosCartes = [indiceCarte+1 for indiceCarte, carte in enumerate(cartes)] numeroCarteEnAttente = True while numeroCarteEnAttente: numeroCarte = input("Saisissez le numéro de la carte dont vous souhaitez vous munir : ") try: numeroCarte = int(numeroCarte) assert numeroCarte in numerosCartes except ValueError: print("ERREUR - Vous devez saisir un nombre.") except AssertionError: print("ERREUR - Vous devez saisir un nombre correspondant à une carte disponible.") else: numeroCarteEnAttente = False return cartes[numeroCarte-1] def confirmerCarteChoisie(carteChoisie): print("Vous vous munissez de la carte : {nomCarteChoisie}".format(nomCarteChoisie=carteChoisie.nom)) # CLASSE class Carte: def __init__(self, nomFichier, contenuFichier): self.nom = nomFichier[:-4] self.labyrinthe = creerLabyrintheDepuisContenuFichier(contenuFichier) def __repr__(self): return "<Carte: {nomCarte}>".format(nomCarte=self.nom)
classes/Obstacle.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Robot import * from classes.Obstacle import * from classes.Mur import * from classes.Porte import * from classes.Sortie import * # FONCTIONS def creerLabyrintheDepuisContenuFichier(contenuFichier): x = 0 y = 0 robot = None obstacles = [] symboles = { "o": Mur, ".": Porte, "u": Sortie, "x": Robot } for caractere in contenuFichier: if caractere == "\n": x = 0 y += 1 continue elif caractere == " ": pass elif caractere.lower() in symboles: classe = symboles[caractere.lower()] objet = classe(x, y) if type(objet) is Robot: if robot is None: robot = objet else: raise ValueError("ERREUR - Vous essayez d'insérer un nouveau robot en (x={xRobotAInserer}, y={yRobotAInserer}) alors qu'il y en a déjà un en (x={xRobotDejaPresent}, y={yRobotDejaPresent}).".format(xRobotAInserer=x, yRobotAInserer=y, xRobotDejaPresent=robot.x, yRobotDejaPresent=robot.y)) else: obstacles.append(objet) else: raise ValueError("ERREUR - Symbole inconnu en (x={xSymboleInconnu}, y={ySymboleInconnu}) : {symboleInconnu}".format(xSymboleInconnu=x, ySymboleInconnu=y, symboleInconnu=caractere)) x += 1 nombreColonnes = x nombreLignes = y+1 labyrinthe = Labyrinthe(nombreColonnes, nombreLignes, robot, obstacles) return labyrinthe # CLASSE class Labyrinthe: def __init__(self, nombreColonnes, nombreLignes, robot, obstacles): self.grille = {} self.invisibles = [] # Étape 1 : On vérifie les paramètres 'nombreColonnes' et 'nombreLignes' qui correspondent aux dimensions du labyrinthe if type(nombreColonnes) is int and nombreColonnes > 0: self.nombreColonnes = nombreColonnes else: raise ValueError("ERREUR - Vous essayez de créer un labyrinthe avec un nombre de colonnes incorrect.") if type(nombreLignes) is int and nombreLignes > 0: self.nombreLignes = nombreLignes else: raise ValueError("ERREUR - Vous essayez de créer un labyrinthe avec un nombre de lignes incorrect.") # Étape 2 : On vérifie que le paramètre 'robot' a reçu un objet de la classe Robot avec des coordonnées valides if type(robot) is Robot: if robot.x >= 0 and robot.x < self.nombreColonnes and robot.y >= 0 and robot.y < self.nombreLignes: self.robot = robot self.grille[(robot.x, robot.y)] = robot else: raise ValueError("ERREUR - Vous essayez d'insérer un Robot en (x={xRobotAInserer}, y={yRobotAInserer}), soit en dehors des limites de la grille (xMin=0, yMin=0, xMax={xMax}, yMax={yMax}).".format(xRobotAInserer=robot.x, yRobotAInserer=robot.y, xMax=self.nombreColonnes-1, yMax=self.nombreLignes-1)) else: raise ValueError("ERREUR - Vous essayez de passer un objet qui n'est pas issu de la classe Robot au paramètre 'robot'.") # Étape 3 : On vérifie que le paramètre 'obstacles' a reçu une liste d'objets issus de classes héritées de la classe Obstacle avec des coordonnées valides et non occupées par un autre objet for obstacle in obstacles: if isinstance(obstacle, Obstacle): if obstacle.x >= 0 and obstacle.x < self.nombreColonnes and obstacle.y >= 0 and obstacle.y < self.nombreLignes: if (obstacle.x, obstacle.y) not in self.grille: self.grille[(obstacle.x, obstacle.y)] = obstacle else: raise ValueError("ERREUR - Vous essayez d'insérer un obstacle en (x={xObstacleAInserer}, y={yObstacleAInserer}), où se trouve déjà un autre objet ({nomObjetDejaPresent}).".format(xObstacleAInserer=obstacle.x, yObstacleAInserer=obstacle.y, nomObjetDejaPresent=self.grille[(obstacle.x, obstacle.y)].nom)) else: raise ValueError("ERREUR - Vous essayez d'insérer un obstacle en (x={xObstacleAInserer}, y={yObstacleAInserer}), soit en dehors des limites de la grille (xMin=0, yMin=0, xMax={xMax}, yMax={yMax}).".format(xObstacleAInserer=obstacle.x, yObstacleAInserer=obstacle.y, xMax=self.nombreColonnes-1, yMax=self.nombreLignes-1)) else: raise ValueError("ERREUR - Vous essayez de passer une liste d'objets qui ne sont pas tous issus de classes héritées de la classe Obstacle au paramètre 'obstacles'.") def afficher(self): representation = "" premiereLigne = True for y in range(self.nombreLignes): if not premiereLigne: representation += "\n" else: premiereLigne = False for x in range(self.nombreColonnes): if (x, y) in self.grille: representation += self.grille[(x, y)].symbole#.upper() else: representation += " " print(representation) def valider_deplacement(self, direction, nombrePas): robot = self.robot coords = [robot.x, robot.y] nombrePasRestants = nombrePas deplacementValide = True while nombrePasRestants > 0: if direction == "n": coords[1] -= 1 elif direction == "s": coords[1] += 1 elif direction == "o": coords[0] -= 1 elif direction == "e": coords[0] += 1 else: deplacementValide = False nombrePas = 0 x, y = coords if x >= 0 and x < self.nombreColonnes and y >= 0 and y < self.nombreLignes: if (x, y) in self.grille and not self.grille[(x, y)].franchissable: deplacementValide = False nombrePas = 0 else: deplacementValide = False nombrePas = 0 nombrePasRestants -= 1 return deplacementValide def actualiser_invisibles(self): for obstacle in list(self.invisibles): if (obstacle.x, obstacle.y) not in self.grille: self.grille[(obstacle.x, obstacle.y)] = obstacle self.invisibles.remove(obstacle) def deplacer_robot(self, partie, direction, nombrePas): deplacementValide = self.valider_deplacement(direction, nombrePas) if deplacementValide: robot = self.robot coords = [robot.x, robot.y] nombrePasRestants = nombrePas while nombrePasRestants > 0: if direction == "n": coords[1] -= 1 elif direction == "s": coords[1] += 1 elif direction == "o": coords[0] -= 1 elif direction == "e": coords[0] += 1 nombrePasRestants -= 1 x, y = coords obstacle = self.grille.get((x, y)) if obstacle is None or obstacle.franchissable: if obstacle: self.invisibles.append(obstacle) del self.grille[(robot.x, robot.y)] self.grille[(x, y)] = robot robot.x = x robot.y = y self.actualiser_invisibles() self.afficher() if obstacle: obstacle.arriver(partie) else: print("ERREUR - Déplacement invalide !")
classes/Mur.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 # -*-coding:utf-8 -* # CLASSE class Obstacle: nom = "obstacle" symbole = "" franchissable = True def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return "<{nomObstacle}: {xObstacle},{yObstacle}>".format(nomObstacle=self.nom.capitalize(), x=self.x, y=self.y) def arriver(self, partie): pass
classes/Porte.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Obstacle import * # CLASSE class Mur(Obstacle): nom = "mur" symbole = "O" franchissable = False
classes/Sortie.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Obstacle import * # CLASSE class Porte(Obstacle): nom = "porte" symbole = "."
classes/Robot.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Obstacle import * # CLASSE class Sortie(Obstacle): nom = "sortie" symbole = "U" def arriver(self, partie): partie.gagnee = True partie.terminee = True
J'arrive maintenant à la deuxième partie, où je dois développer les 2 nouveaux scripts : serveur.py et client.py en respectant de nouvelles consignes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 # -*-coding:utf-8 -* # CLASSE class Robot: nom = "robot" symbole = "x" def __init__(self, x, y): self.x = x self.y = y def __repr__(self): return "<Robot: {xRobot},{yRobot}>".format(xRobot=self.x, yRobot=self.y)
- il faut que le serveur attende au moins 2 joueurs avant d'autoriser le lancement du jeu lorsqu'un client saisit la commande "C"
- les robots des joueurs seront placés aléatoirement dans le labyrinthe au lancement du jeu (pour l'instant je passe carrément la dessus...)
- les joueurs pourront également saisir 2 nouvelles commandes : M<direction> pour créer un mur à un pas de distance de leur robot dans la direction indiquée (MN : Murer Nord) , P<direction> pour percer un mur à un pas de leur robot (PE : Percer Est) (pour l'instant je passe aussi carrément la dessus)
J'ai donc commencé à rédiger les deux scripts que voici, mais je bloque sur la façon dont intégrer mon travail précédent dans ces deux nouveaux scripts :
serveur.py
classes/Serveur.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Serveur import * # FONCTIONS # Fonction principale # def main(): serveur = Serveur() serveur.demarrer() if serveur.actif: serveur.bienvenue() while serveur.actif: serveur.continuer() serveur.aurevoir() # PROGRAMME if __name__ == "__main__": main()
client.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS import socket import select import time # CLASSE class Serveur: def __init__(self): self.hote = "" self.portMin = 1024 self.portMax = 65535 self.port = 0 self.socketServeur = None self.actif = False self.socketsClients = [] def choisirHote(self): hote = input("Hôte : ") if len(hote) == 0: hote = "localhost" return hote def choisirPort(self): messageErreur = "ERREUR - Vous devez saisir un numéro de port compris entre {portMin} et*{portMax}.".format(portMin=self.portMin, portMax=self.portMax) portEnAttente = True while portEnAttente: port = input("Port (entre {portMin} et {portMax}) : ".format(portMin=self.portMin, portMax=self.portMax)) try: port = int(port) assert port >= self.portMin and port <= self.portMax except ValueError: print(messageErreur) except AssertionError: print(messageErreur) else: portEnAttente = False return port def demarrer(self): nombreEssaisRestantsCreationSocketServeur = 3 socketServeurCree = False while not socketServeurCree and nombreEssaisRestantsCreationSocketServeur > 0: self.hote = self.choisirHote() self.port = self.choisirPort() try: self.socketServeur = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socketServeur.bind((self.hote, self.port)) self.socketServeur.listen(2) except Exception: nombreEssaisRestantsCreationSocketServeur -= 1 if nombreEssaisRestantsCreationSocketServeur > 1: messageErreur = "ERREUR - Ouverture du serveur de jeu sur le port {port} de l'hôte {hote} échouée... {nombreEssaisRestantsCreationSocketServeur} essais restants...".format(port=self.port, hote=self.hote, nombreEssaisRestantsCreationSocketServeur=nombreEssaisRestantsCreationSocketServeur) else: messageErreur = "ERREUR - Ouverture du serveur de jeu sur le port {port} de l'hôte {hote} échouée... {nombreEssaisRestantsCreationSocketServeur} essai restant...".format(port=self.port, hote=self.hote, nombreEssaisRestantsCreationSocketServeur=nombreEssaisRestantsCreationSocketServeur) print(messageErreur) else: socketServeurCree = True if socketServeurCree: self.actif = True def bienvenue(self): nomProgramme = "SERVEUR" print("#"*(len(nomProgramme)+4)) print("# {nomProgramme} #".format(nomProgramme=nomProgramme)) print("#"*(len(nomProgramme)+4)) print("Bienvenue !") def aurevoir(self): print("Au revoir !") def accepterSocketsClients(self): if self.jeuEnCours: return False else: return True def continuer(self): print("Serveur actif...") # ÉTAPE 1 : Accepter les connexions de clients socketsClientsDemandes, wlist, xlist = select.select([self.socketServeur], [], [], 0) for socketClientDemande in socketsClientsDemandes: socketClientAcceptee, infosSocketClientAcceptee = socketClientDemande.accept() print(socketClientAcceptee) print(infosSocketClientAcceptee) self.socketsClients.append(socketClientAcceptee) # ÉTAPE 2 : ... # C'EST ICI QUE JE DOIS INTÉGRER MON TRAVAIL PRÉCÉDENT # ... # ... # ... time.sleep(3)
classes/Client.py
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS from classes.Client import * # FONCTIONS # Fonction principale # def main(): client = Client() client.demarrer() if client.actif: client.bienvenue() while client.actif: client.continuer() client.aurevoir() # PROGRAMME if __name__ == "__main__": main()
Si vous avez lu jusque là, je vous remercie infiniment !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # -*-coding:utf-8 -* # IMPORTATIONS import socket import time # CLASSE class Client: def __init__(self): self.hote = "" self.portMin = 1024 self.portMax = 65535 self.port = 0 self.socketServeur = None self.actif = True def choisirHote(self): hote = input("Hôte : ") if len(hote) == 0: hote = "localhost" return hote def choisirPort(self): messageErreur = "ERREUR - Vous devez saisir un numéro de port compris entre {portMin} et*{portMax}.".format(portMin=self.portMin, portMax=self.portMax) portEnAttente = True while portEnAttente: port = input("Port (entre {portMin} et {portMax}) : ".format(portMin=self.portMin, portMax=self.portMax)) try: port = int(port) assert port >= self.portMin and port <= self.portMax except ValueError: print(messageErreur) except AssertionError: print(messageErreur) else: portEnAttente = False return port def demarrer(self): nombreEssaisRestantsCreationSocketServeur = 3 socketServeurCree = False while not socketServeurCree and nombreEssaisRestantsCreationSocketServeur > 0: self.hote = self.choisirHote() self.port = self.choisirPort() try: self.socketServeur = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socketServeur.connect((self.hote, self.port)) except Exception: nombreEssaisRestantsCreationSocketServeur -= 1 if nombreEssaisRestantsCreationSocketServeur > 1: messageErreur = "ERREUR - Ouverture du serveur de jeu sur le port {port} de l'hôte {hote} échouée... {nombreEssaisRestantsCreationSocketServeur} essais restants...".format(port=self.port, hote=self.hote, nombreEssaisRestantsCreationSocketServeur=nombreEssaisRestantsCreationSocketServeur) else: messageErreur = "ERREUR - Ouverture du serveur de jeu sur le port {port} de l'hôte {hote} échouée... {nombreEssaisRestantsCreationSocketServeur} essai restant...".format(port=self.port, hote=self.hote, nombreEssaisRestantsCreationSocketServeur=nombreEssaisRestantsCreationSocketServeur) print(messageErreur) else: socketServeurCree = True if socketServeurCree: self.actif = True def bienvenue(self): nomProgramme = "CLIENT" print("#"*(len(nomProgramme)+4)) print("# {nomProgramme} #".format(nomProgramme=nomProgramme)) print("#"*(len(nomProgramme)+4)) print("Bienvenue !") def aurevoir(self): print("Au revoir !") def continuer(self): print("Client actif...") # ÉTAPE 2 : ... # C'EST ICI QUE JE DOIS INTÉGRER MON TRAVAIL PRÉCÉDENT # ... # ... # ... time.sleep(3)
Si vous avez des suggestions / conseils, je vous serais éternellement reconnaissant !
Merci d'avance de vos réponses !![]()
Partager