Starts modif gameplay to multiplayer/network mode
I am pausing the devel here, I have to prioritise another project. Doctests seems to be obsolete for testing network scripts. I'll be back with Pytest!
This commit is contained in:
parent
579bf24c17
commit
30de5f8096
74
roboc/map.py
74
roboc/map.py
|
@ -6,8 +6,9 @@ Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/
|
||||||
Ce fichier fait partie du projet `roboc`
|
Ce fichier fait partie du projet `roboc`
|
||||||
"""
|
"""
|
||||||
import os
|
import os
|
||||||
|
import random
|
||||||
from configuration import DIRECTIONS, ERR_MAP_FILE, ERR_MAP_ROBO, \
|
from configuration import DIRECTIONS, ERR_MAP_FILE, ERR_MAP_ROBO, \
|
||||||
MIN_MAP_SIDE, ERR_MAP_SIZE, ERR_UNKNOW, MAZE_ELEMENTS, MSG_START_GAME
|
MIN_MAP_SIDE, ERR_MAP_SIZE, ERR_UNKNOW, MAZE_ELEMENTS, MSG_START_GAME, MSG_CHOOSE_MOVE, COMMANDS_LABEL, COMMANDS
|
||||||
|
|
||||||
|
|
||||||
class Map:
|
class Map:
|
||||||
|
@ -26,40 +27,24 @@ class Map:
|
||||||
========
|
========
|
||||||
|
|
||||||
:Example:
|
:Example:
|
||||||
>>> EasyMap = Map("cartes/facile.txt")
|
>>> EasyMap = Map("cartes/facile.txt", 3)
|
||||||
>>> MiniMap = Map("cartes/mini.txt")
|
|
||||||
>>> PrisonMap = Map("cartes/prison.txt")
|
|
||||||
>>> EmptyMap = Map("cartes/vide.txt")
|
|
||||||
>>> TooSmallMap = Map("cartes/trop_petite.txt")
|
|
||||||
>>> NoRoboMap = Map("cartes/sans_robo.txt")
|
|
||||||
|
|
||||||
>>> print(EmptyMap.status_message)
|
>>> print(EmptyMap.status_message)
|
||||||
#!@?# Oups… carte «cartes/vide.txt», dimensions incorrecte: «0 x 0»
|
#!@?# Oups… carte «cartes/vide.txt», dimensions incorrecte: «0 x 0»
|
||||||
>>> print(TooSmallMap.status_message)
|
>>> print(TooSmallMap.status_message)
|
||||||
#!@?# Oups… carte «cartes/trop_petite.txt», dimensions incorrecte: «3 x 2»
|
#!@?# Oups… carte «cartes/trop_petite.txt», dimensions incorrecte: «3 x 2»
|
||||||
>>> print(NoRoboMap.status_message)
|
|
||||||
#!@?# Oups… robo est introuvable sur la carte «cartes/sans_robo.txt»!
|
|
||||||
|
|
||||||
>>> print("_column_nb: {}".format(EasyMap._column_nb))
|
>>> print("_column_nb: {}".format(EasyMap._column_nb))
|
||||||
_column_nb: 11
|
_column_nb: 11
|
||||||
>>> print("_line_nb: {}".format(EasyMap._line_nb))
|
>>> print("_line_nb: {}".format(EasyMap._line_nb))
|
||||||
_line_nb: 11
|
_line_nb: 11
|
||||||
|
|
||||||
>>> MiniMap.move_to("O")
|
>>> EasyMap.move_to("O")
|
||||||
1
|
1
|
||||||
>>> MiniMap.move_to("Z1")
|
|
||||||
0
|
|
||||||
>>> MiniMap.move_to("4")
|
|
||||||
0
|
|
||||||
>>> MiniMap.move_to("E1")
|
|
||||||
2
|
|
||||||
>>> MiniMap.map_print()
|
|
||||||
OOO
|
|
||||||
O X
|
|
||||||
OOO
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, map_file):
|
def __init__(self, map_file, nb_player):
|
||||||
"""
|
"""
|
||||||
Initialisation de la carte utilise
|
Initialisation de la carte utilise
|
||||||
|
|
||||||
|
@ -73,9 +58,9 @@ class Map:
|
||||||
:var int _line_nb: Nbre de ligne du labyrinte
|
:var int _line_nb: Nbre de ligne du labyrinte
|
||||||
:var int _robo_position: position du robo dans _data_text
|
:var int _robo_position: position du robo dans _data_text
|
||||||
|
|
||||||
:param map_file: fichier «carte» avec chemin relatif
|
:param str map_file: fichier «carte» avec chemin relatif
|
||||||
|
:param int nb_player: nombre de joueurs (max 9)
|
||||||
:rtype map: str()
|
:rtype map: str()
|
||||||
:return: None
|
|
||||||
"""
|
"""
|
||||||
# Chargement du fichier carte choisi
|
# Chargement du fichier carte choisi
|
||||||
if os.path.isfile(map_file) is True:
|
if os.path.isfile(map_file) is True:
|
||||||
|
@ -99,28 +84,27 @@ class Map:
|
||||||
except IndexError:
|
except IndexError:
|
||||||
self._line_nb = 0
|
self._line_nb = 0
|
||||||
|
|
||||||
# position du robot
|
self._robo_position = {}
|
||||||
self._robo_position = self._data_text.find(
|
self._element_under_robo = {}
|
||||||
MAZE_ELEMENTS['robo']
|
|
||||||
)
|
|
||||||
|
|
||||||
# element «sous» le robo, au depart
|
for player in range(1, nb_player + 1):
|
||||||
self._element_under_robo = MAZE_ELEMENTS['void']
|
# placement des n robots
|
||||||
|
self._robo_position[player] = random.choice([idx for (idx, value) in enumerate(self._data_text) if value == MAZE_ELEMENTS['void']])
|
||||||
|
|
||||||
|
# element «sous» le robo, au depart
|
||||||
|
self._element_under_robo[player] = MAZE_ELEMENTS['void']
|
||||||
|
|
||||||
|
# place le robot sur la carte
|
||||||
|
self.place_element(player, player)
|
||||||
|
|
||||||
# Quelques controle sur la carte chargee:
|
# Quelques controle sur la carte chargee:
|
||||||
# dimensions assez grande pour deplacer un robo?
|
# dimensions assez grande pour deplacer un robo?
|
||||||
if self._column_nb < MIN_MAP_SIDE or \
|
if (self._line_nb, self._column_nb) < (MIN_MAP_SIDE, MIN_MAP_SIDE):
|
||||||
self._line_nb < MIN_MAP_SIDE:
|
|
||||||
self.status = False
|
self.status = False
|
||||||
self.status_message = ERR_MAP_SIZE.format(
|
self.status_message = ERR_MAP_SIZE.format(
|
||||||
map_file, self._column_nb, self._line_nb
|
map_file, self._column_nb, self._line_nb
|
||||||
)
|
)
|
||||||
|
|
||||||
# y a t il un robo?
|
|
||||||
elif self._robo_position == -1:
|
|
||||||
self.status = False
|
|
||||||
self.status_message = ERR_MAP_ROBO.format(map_file)
|
|
||||||
|
|
||||||
# on peu ajouter plein d'autres controles ici
|
# on peu ajouter plein d'autres controles ici
|
||||||
|
|
||||||
# carte consideree utilisable
|
# carte consideree utilisable
|
||||||
|
@ -133,9 +117,17 @@ class Map:
|
||||||
self.status = False
|
self.status = False
|
||||||
self.status_message = ERR_MAP_FILE.format(map_file)
|
self.status_message = ERR_MAP_FILE.format(map_file)
|
||||||
|
|
||||||
def map_print(self):
|
def map_print(self, game_network):
|
||||||
""" Affiche la carte avec la position de jeu courante """
|
""" Affiche la carte avec la position de jeu courante """
|
||||||
print(self._data_text)
|
|
||||||
|
game_network.broadcast(
|
||||||
|
'server',
|
||||||
|
'\n'.join(['',
|
||||||
|
self._data_text,
|
||||||
|
self.status_message,
|
||||||
|
MSG_CHOOSE_MOVE.format(COMMANDS[1],COMMANDS_LABEL[1])]
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def move_to(self, move):
|
def move_to(self, move):
|
||||||
"""
|
"""
|
||||||
|
@ -220,7 +212,7 @@ class Map:
|
||||||
|
|
||||||
return move_status
|
return move_status
|
||||||
|
|
||||||
def place_element(self, element):
|
def place_element(self, element, player):
|
||||||
"""
|
"""
|
||||||
Place l'element sur la carte.
|
Place l'element sur la carte.
|
||||||
|
|
||||||
|
@ -231,9 +223,9 @@ class Map:
|
||||||
|
|
||||||
:param str element: element a placer sur la carte
|
:param str element: element a placer sur la carte
|
||||||
"""
|
"""
|
||||||
pos = self._robo_position
|
pos = self._robo_position[player]
|
||||||
txt = self._data_text
|
txt = self._data_text
|
||||||
self._data_text = txt[:pos] + element + txt[pos + 1:]
|
self._data_text = txt[:pos] + str(element) + txt[pos + 1:]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -48,9 +48,6 @@ print(MSG_DISCLAMER)
|
||||||
# Affiche le menu de selection de la carte
|
# Affiche le menu de selection de la carte
|
||||||
MAP_FILENAME = choose_maps_menu()
|
MAP_FILENAME = choose_maps_menu()
|
||||||
|
|
||||||
# Genere la carte
|
|
||||||
GAME_MAP = Map(MAP_FILENAME)
|
|
||||||
|
|
||||||
# Démarre le réseau
|
# Démarre le réseau
|
||||||
GAME_NETWORK = ConnectSocket()
|
GAME_NETWORK = ConnectSocket()
|
||||||
|
|
||||||
|
@ -94,20 +91,16 @@ while 1:
|
||||||
|
|
||||||
old_count_clients = count_clients
|
old_count_clients = count_clients
|
||||||
|
|
||||||
|
# Genere la carte
|
||||||
|
GAME_MAP = Map(MAP_FILENAME, count_clients)
|
||||||
|
|
||||||
# DEBUT DE BOUCLE DE TOUR DE JEU
|
# DEBUT DE BOUCLE DE TOUR DE JEU
|
||||||
|
|
||||||
# Affichage de la carte tant que status == True
|
# Affichage de la carte tant que status == True
|
||||||
while GAME_MAP.status:
|
while GAME_MAP.status:
|
||||||
# Affiche la carte et le message
|
|
||||||
GAME_MAP.map_print()
|
|
||||||
print(GAME_MAP.status_message)
|
|
||||||
|
|
||||||
# Demande a l'utilisateur son choix du deplacement
|
# Affiche la carte et le message
|
||||||
user_move = input(MSG_CHOOSE_MOVE.format(
|
GAME_MAP.map_print(GAME_NETWORK)
|
||||||
COMMANDS[1], COMMANDS_LABEL[1])
|
|
||||||
).upper()
|
|
||||||
cls() # vide l'ecran de la console
|
|
||||||
|
|
||||||
# Traitement de la commande utilisateur
|
# Traitement de la commande utilisateur
|
||||||
if user_move == COMMANDS[0]: # quitter
|
if user_move == COMMANDS[0]: # quitter
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
- [x] ~~conversion to client/server mode: client creation TODO03~~
|
- [x] ~~conversion to client/server mode: client creation TODO03~~
|
||||||
- [x] ~~verify if user name is already used TODO17~~
|
- [x] ~~verify if user name is already used TODO17~~
|
||||||
- [x] ~~add max player number TODO19~~
|
- [x] ~~add max player number TODO19~~
|
||||||
|
- [x] ~~each player has a differant robot TODO05~~
|
||||||
|
- [x] ~~starting position has to be random TODO06~~
|
||||||
- [ ] multiplayer turn-by-turn TODO04
|
- [ ] multiplayer turn-by-turn TODO04
|
||||||
- [ ] each player has a differant robot TODO05
|
|
||||||
- [ ] starting position has to be random TODO06
|
|
||||||
- [ ] one movement unit per tour: ex «e3» = 3 turns TODO07
|
- [ ] one movement unit per tour: ex «e3» = 3 turns TODO07
|
||||||
- [ ] add new game command: 'm' (walling door) TODO11
|
- [ ] add new game command: 'm' (walling door) TODO11
|
||||||
- [ ] add new game command: 'p' (drilling door) TODO12
|
- [ ] add new game command: 'p' (drilling door) TODO12
|
||||||
|
|
Loading…
Reference in New Issue