Forme.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #from __future__ import unicode_literals
  2. # -*- coding: utf-8 -*-
  3. from __future__ import division
  4. class Forme():
  5. """forme a affecter a une creature, decor ou autre..."""
  6. def __init__(self, formeCases = "H", parent=None):
  7. self.formeDef = [] #coord relatives par rapport a la case (0,0) definissant la forme (vide si forme 1*1)
  8. #les anneaux sont utilises pour les rotations (coordonnees relatives a la case centrale)
  9. #attention: il est important que les cases soient enregistrees dans le sens de la rotation (sens des aiguilles d'une montre)
  10. self.formeCases = formeCases # "C" ou "H" pour carre ou hexagone
  11. def anneau(self, distance=0):
  12. """renvoie la liste des cases situees a [distance] cases du centre, dans l'ordre des aiguilles d'une montre"""
  13. anneau = {}
  14. if self.formeCases == "H":
  15. anneau[1] = [(0,-1),(1,-0.5),(1,0.5), \
  16. (0,1),(-1,0.5),(-1,-0.5)]
  17. anneau[2] = [(0,-2),(1,-1.5),(2,-1),(2,0),(2,1),(1,1.5), \
  18. (0,2),(-1,1.5),(-2,1),(-2,0),(-2,-1),(-1,-1.5)]
  19. anneau[3] = [(0,-3),(1,-2.5),(2,-2),(3,-1.5),(3,-0.5),(3,0.5),(3,1.5),(2,2),(1,2.5), \
  20. (0,3),(-1,2.5),(-2,2),(-3,1.5),(-3,0.5),(-3,-0.5),(-3,-1.5),(-2,-2),(-1,-2.5)]
  21. anneau[4] = [(0,-4),(1,-3.5),(2,-3),(3,-2.5),(4,-2),(4,-1),(4,0),(4,1),(4,2),(3,2.5),(2,3),(1,3.5), \
  22. (0,4),(-1,3.5),(-2,3),(-3,2.5),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-3,-2.5),(-2,-3),(-1,-3.5)]
  23. anneau[5] = [(0,-5),(1,-4.5),(2,-4),(3,-3.5),(4,-3),(5,-2.5),(5,-1.5),(5,-0.5),(5,0.5),(5,1.5),(5,2.5),(4,3),(3,3.5),(2,4),(1,4.5), \
  24. (0,5),(-1,4.5),(-2,4),(-3,3.5),(-4,3),(-5,2.5),(-5,1.5),(-5,0.5),(-5,-0.5),(-5,-1.5),(-5,-2.5),(-4,-3),(-3,-3.5),(-2,-4),(-1,-4.5)]
  25. elif self.formeCases == "C":
  26. anneau[1] = [(0,-1),(1,-1),(1,0),(1,1),\
  27. (0,1),(-1,1),(-1,0),(-1,-1)]
  28. anneau[2] = [(0,-2),(1,-2),(2,-2),(2,-1),(2,0),(2,1),(2,2),(1,2),\
  29. (0,2),(-1,2),(-2,2),(-2,1),(-2,0),(-2,-1),(-2,-2),(-1,-2)]
  30. anneau[3] = [(0,-3),(1,-3),(2,-3),(3,-3),(3,-2),(3,-1),(3,0),(3,1),(3,2),(3,3),(2,3),(1,3),\
  31. (0,3),(-1,3),(-2,3),(-3,3),(-3,2),(-3,1),(-3,0),(-3,-1),(-3,-2),(-3,-3),(-2,-3),(-1,-3)]
  32. anneau[4] = [(0,-4),(1,-4),(2,-4),(3,-4),(4,-4),(4,-3),(4,-2),(4,-1),(4,0),(4,1),(4,2),(4,3),(4,4),(3,4),(2,4),(1,4),\
  33. (0,4),(-1,4),(-2,4),(-3,4),(-4,4),(-4,3),(-4,2),(-4,1),(-4,0),(-4,-1),(-4,-2),(-4,-3),(-4,-4),(-3,-4),(-2,-4),(-1,-4)]
  34. anneau[5] = [(0,-5),(1,-5),(2,-5),(3,-5),(4,-5),(5,-5),(5,-4),(5,-3),(5,-2),(5,-1),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(4,5),(3,5),(2,5),(1,5),\
  35. (0,5),(-1,5),(-2,5),(-3,5),(-4,5),(-5,5),(-5,4),(-5,3),(-5,2),(-5,1),(-5,0),(-5,-1),(-5,-2),(-5,-3),(-5,-4),(-5,-5),(-4,-5),(-3,-5),(-2,-5),(-1,-5)]
  36. if distance > 0:
  37. retour = anneau[distance]
  38. elif distance == 0:
  39. retour = anneau
  40. return retour
  41. def __repr__(self):
  42. """renvoie la liste des cases occupees par la forme"""
  43. retour = str(self.listeCases((0,0)))
  44. return retour
  45. def ajouterCase(self, coordRelatives):
  46. """ajoute une case a la liste des cases occupees de la forme"""
  47. ajoutee = False
  48. if not coordRelatives in self.formeDef:
  49. for distance in self.anneau(0):
  50. if coordRelatives in self.anneau(distance):
  51. self.formeDef.append(coordRelatives)
  52. ajoutee = True
  53. if not ajoutee:
  54. print("case non prise en charge (trop eloignee du centre)")
  55. def definirForme(self, formeDef):
  56. """utilise une forme pre-definie"""
  57. self.formeDef = []
  58. if formeDef:
  59. if len(formeDef)>0:
  60. for coordRelatives in formeDef:
  61. self.ajouterCase(coordRelatives)
  62. def retirerCase(self, coordRelatives):
  63. """retire une case a la liste des cases occupees de la forme"""
  64. if coordRelatives in self.formeDef:
  65. self.formeDef.remove(coordRelatives)
  66. def pivoter(self, nbRotations = 1):
  67. """pivote si possible la forme dans le sens '+' ou '-' et renvoie la liste des cases qui seront occupees"""
  68. sens = 1
  69. if nbRotations < 0: sens = -1
  70. formeDefPivote = []
  71. tmp = self.formeDef
  72. if self.formeCases == "H":
  73. k = 1
  74. else:
  75. k = 2 #on avance de deux cases sur l'anneau dans le cas de cases carrees
  76. if len(self.formeDef) > 0:
  77. for i in range(0,abs(nbRotations)):
  78. for coord in tmp:
  79. #on trouve dans quel anneau se situe cette case
  80. distance = 0
  81. i = 0
  82. while distance == 0 and i <= len(self.anneau(0)):
  83. i += 1
  84. if coord in self.anneau(i):
  85. distance = i
  86. #si on a trouve la case, on la deplace selon les conditions de la rotation
  87. if distance > 0:
  88. #position actuelle dans la liste des cases de l'anneau
  89. position = self.anneau(distance).index(coord)
  90. #le pivot entraine un deplacement dans la liste des cases de l'anneau egal a sa distance au centre
  91. nouvellePosition = position + k*sens*distance
  92. #retour au debut/a la fin de l'anneau si on atteint la fin/ le debut
  93. if nouvellePosition >= len(self.anneau(distance)):
  94. nouvellePosition -= len(self.anneau(distance))
  95. elif nouvellePosition < 0:
  96. nouvellePosition += len(self.anneau(distance))
  97. #on retrouve les nouvelles coordonnees relatives a partir de la position dans l'anneau
  98. nouvellesCoord = self.anneau(distance)[nouvellePosition]
  99. #on ajoute cette position a la nouvelle definition de forme
  100. formeDefPivote.append((nouvellesCoord[0], nouvellesCoord[1]))
  101. else:
  102. print("{} non trouvee dans les anneaux".format(coord))
  103. tmp = formeDefPivote
  104. formeDefPivote = []
  105. formeDefPivote = tmp
  106. return formeDefPivote
  107. def listeCases(self, coordCibles, nbRotations = 0):
  108. """renvoie la liste des cases occupees par la forme en cours"""
  109. retour = [coordCibles]
  110. if nbRotations != 0:
  111. formeEnCours = self.pivoter(nbRotations)
  112. else:
  113. formeEnCours = self.formeDef
  114. if len(formeEnCours) > 0:
  115. for coordRelatives in formeEnCours:
  116. retour.append((coordCibles[0]+coordRelatives[0], coordCibles[1]+coordRelatives[1]))
  117. return retour