2018-02-06 16:59:29 +00:00
|
|
|
"""
|
|
|
|
Author: freezed <freezed@users.noreply.github.com> 2018-02-06
|
|
|
|
Version: 0.1
|
|
|
|
Licence: `GNU GPL v3` GNU GPL v3: http://www.gnu.org/licenses/
|
|
|
|
|
|
|
|
Ce fichier fait partie du projet `roboc`
|
|
|
|
|
|
|
|
"""
|
2018-02-11 14:02:26 +00:00
|
|
|
|
2018-02-06 16:59:29 +00:00
|
|
|
import os
|
2018-02-12 14:39:42 +00:00
|
|
|
from configuration import MAZE_ELEMENTS, ERR_MAP_FILE, MIN_MAP_SIDE, \
|
|
|
|
ERR_MAP_SIZE, ERR_MAP_ROBO
|
2018-02-06 16:59:29 +00:00
|
|
|
|
2018-02-10 06:54:54 +00:00
|
|
|
|
2018-02-06 16:59:29 +00:00
|
|
|
class Map:
|
|
|
|
"""
|
|
|
|
Classe gerant les cartes disponibles et la carte utilisee en cours
|
|
|
|
de partie.
|
|
|
|
|
|
|
|
:Example:
|
2018-02-09 23:29:04 +00:00
|
|
|
>>> TestMap = Map("cartes/test.txt")
|
2018-02-09 16:23:10 +00:00
|
|
|
|
2018-02-09 23:29:04 +00:00
|
|
|
>>> PrisonMap = Map("cartes/prison.txt")
|
|
|
|
|
|
|
|
>>> print("_data_text: {}".format(TestMap._data_text))
|
|
|
|
_data_text: O1234
|
|
|
|
abcde
|
|
|
|
ABCDE
|
2018-02-12 14:39:42 +00:00
|
|
|
zyXwv
|
2018-02-09 23:29:04 +00:00
|
|
|
|
|
|
|
>>> print("_column_nb: {}".format(TestMap._column_nb))
|
|
|
|
_column_nb: 5
|
|
|
|
|
|
|
|
>>> print("_line_nb: {}".format(TestMap._line_nb))
|
|
|
|
_line_nb: 4
|
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
>>> print("_init_robo_position: {}".format(TestMap._init_robo_position))
|
2018-02-12 15:01:31 +00:00
|
|
|
_init_robo_position: 20
|
2018-02-10 21:38:43 +00:00
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
>>> print("_robo_position: {}".format(TestMap._robo_position))
|
2018-02-12 15:01:31 +00:00
|
|
|
_robo_position: 20
|
2018-02-11 14:02:26 +00:00
|
|
|
|
2018-02-09 23:29:04 +00:00
|
|
|
>>> type(TestMap._data_text)
|
2018-02-09 16:23:10 +00:00
|
|
|
<class 'str'>
|
2018-02-09 15:36:48 +00:00
|
|
|
|
2018-02-09 23:29:04 +00:00
|
|
|
>>> TestMap.map_print()
|
2018-02-09 16:23:10 +00:00
|
|
|
O1234
|
|
|
|
abcde
|
|
|
|
ABCDE
|
2018-02-12 14:39:42 +00:00
|
|
|
zyXwv
|
2018-02-09 16:23:10 +00:00
|
|
|
|
2018-02-06 16:59:29 +00:00
|
|
|
"""
|
|
|
|
|
2018-02-09 15:11:31 +00:00
|
|
|
def __init__(self, map_file):
|
2018-02-06 16:59:29 +00:00
|
|
|
"""
|
2018-02-09 15:11:31 +00:00
|
|
|
Initialisation de la carte utilise
|
|
|
|
:param map_file:
|
2018-02-06 16:59:29 +00:00
|
|
|
"""
|
2018-02-09 15:11:31 +00:00
|
|
|
# Chargement du fichier carte choisi
|
|
|
|
if os.path.isfile(map_file) is True:
|
|
|
|
with open(map_file, "r") as map_data:
|
2018-02-12 15:01:31 +00:00
|
|
|
|
2018-02-10 06:54:54 +00:00
|
|
|
# contenu de la carte en texte
|
|
|
|
self._data_text = map_data.read()
|
2018-02-12 15:01:31 +00:00
|
|
|
|
2018-02-10 06:54:54 +00:00
|
|
|
# contenu de la carte ligne a ligne
|
2018-02-12 14:39:42 +00:00
|
|
|
map_data_list = self._data_text.splitlines()
|
2018-02-12 15:01:31 +00:00
|
|
|
|
2018-02-10 06:54:54 +00:00
|
|
|
# nbre de colonne de la carte (1ere ligne)
|
2018-02-12 15:01:31 +00:00
|
|
|
try:
|
|
|
|
self._column_nb = len(map_data_list[0])
|
|
|
|
except IndexError:
|
|
|
|
self._column_nb = 0
|
|
|
|
|
2018-02-10 06:54:54 +00:00
|
|
|
# nbre de ligne de la carte
|
2018-02-12 15:01:31 +00:00
|
|
|
try:
|
|
|
|
self._line_nb = len(map_data_list)
|
|
|
|
except IndexError:
|
|
|
|
self._line_nb = 0
|
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
# positior du robot
|
|
|
|
self._robo_position = self._data_text.find(MAZE_ELEMENTS['robo'])
|
2018-02-06 16:59:29 +00:00
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
# Erreur de chargement du fichier
|
2018-02-09 15:11:31 +00:00
|
|
|
else:
|
2018-02-12 14:39:42 +00:00
|
|
|
self.status = False
|
|
|
|
self.status_message = ERR_MAP_FILE.format(map_file)
|
|
|
|
|
|
|
|
# Quelques controle sur la carte:
|
|
|
|
# - a t elle des dimensions mini?
|
|
|
|
if self._column_nb < MIN_MAP_SIDE or self._line_nb < MIN_MAP_SIDE:
|
|
|
|
self.status = False
|
|
|
|
self.status_message = ERR_MAP_SIZE.format(
|
|
|
|
map_file, self._column_nb, self._line_nb
|
|
|
|
)
|
|
|
|
|
|
|
|
# - a t elle un robo ( TODO : hors mur)?
|
|
|
|
elif self._robo_position == -1:
|
|
|
|
self.status = False
|
|
|
|
self.status_message = ERR_MAP_ROBO.format(map_file)
|
2018-02-09 17:10:32 +00:00
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
# - a t elle une sortie (dans mur) TODO?
|
|
|
|
# - a t elle du mur tout autour TODO?
|
2018-02-09 15:36:48 +00:00
|
|
|
|
2018-02-12 14:39:42 +00:00
|
|
|
self._init_robo_position = self._robo_position
|
|
|
|
self.status = True
|
|
|
|
|
|
|
|
def __getattr__(self, name):
|
|
|
|
"""
|
|
|
|
Si un attribut manque a l'appel (_robo_position ou
|
|
|
|
_init_robo_position)
|
|
|
|
"""
|
|
|
|
return None
|
2018-02-06 16:59:29 +00:00
|
|
|
|
2018-02-09 15:36:48 +00:00
|
|
|
def map_print(self):
|
|
|
|
""" Affiche la carte avec la position de jeu courante """
|
2018-02-09 16:23:10 +00:00
|
|
|
print(self._data_text)
|
2018-02-09 15:36:48 +00:00
|
|
|
|
|
|
|
def move_on_map(self, start, move):
|
|
|
|
"""
|
|
|
|
Deplace le «robo» sur la carte
|
|
|
|
|
|
|
|
:param start: coordonnee de depart
|
|
|
|
:param move: mouvement souhaite
|
|
|
|
:return: 0: wall, 1: sortie, 2: door, 3: ok
|
|
|
|
"""
|
|
|
|
# verifie que le start est dans la carte
|
|
|
|
|
|
|
|
# verifie que le move est possible sur la carte
|
|
|
|
|
|
|
|
# effectue le move et met a jour la carte
|
|
|
|
|
|
|
|
def restore_backup(self, position):
|
|
|
|
""" Charge une carte issue d'une sauvegarde """
|
|
|
|
|
|
|
|
|
2018-02-06 16:59:29 +00:00
|
|
|
if __name__ == "__main__":
|
|
|
|
""" Starting doctests """
|
|
|
|
|
|
|
|
import doctest
|
2018-02-12 14:39:42 +00:00
|
|
|
doctest.testmod()
|