Occupation2.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # -*- coding: utf-8 -*-
  2. """outils de gestion de l'occupation de l'espace sur le plateau
  3. - la matrice occupation [mO] est de la forme {(x,y):{z0: 0, z1:N, z2:N, z3:N...}}
  4. ou N est le numero du pion, et 0 le niveau du sol, et zi est l'altitude ABSOLUE de la case
  5. """
  6. class Occupation():
  7. def __init__(self):
  8. self._mO = {}
  9. def majMo(self, mo):
  10. self._mO = mo
  11. def mo(self):
  12. return self._mO
  13. def generer(self, plateau):
  14. """genere la matrice"""
  15. self._mO = {key:{value.altitude:0} for key, value in plateau.cases.items()}
  16. for num in plateau.pions:
  17. pion = plateau.pions[num]
  18. for x, y in pion.forme.listeCases(pion.position, pion.nbRotations):
  19. for z in range(1, pion.hauteur + 1):
  20. zAbs = (plateau.cases[(x,y)].altitude + pion.z + z)
  21. self._mO[(x,y)][zAbs] = num
  22. def maj(self, *args):
  23. """met a jour l'occupation, selon ce qui est apsse en parametre:
  24. - si (liste de coord, altitude), met a jour l'altitude des cases correspondantes et celle des pions qui les occupent
  25. - si (pion), met a jour l'occupation en fonction de sa nouvelle situation (deplace, pivote, supprime, nouveau)
  26. - si (plateau), regenere
  27. """
  28. if len(args) == 1:
  29. if args[0].__class__.__name__ == "Plateau":
  30. self.generer(args[0])
  31. else:
  32. print "pion"
  33. elif len(args) == 2:
  34. self._majAltitudes(args[0], args[1])
  35. def _altitudeCase(self, coord):
  36. for key, val in self._mO[coord].items():
  37. if val == 0: return key
  38. return 0
  39. def _majAltitudes(self, lstCoord, altitude):
  40. for coord in lstCoord:
  41. ancien = self._mO[coord]
  42. self._mO[coord] = {}
  43. for z in ancien:
  44. if ancien[z] == 0:
  45. dz = altitude - z
  46. for z in ancien:
  47. self._mO[coord][(z + dz)] = ancien[z]
  48. def _majPion(self, pion):
  49. #on efface son ancienne occupation
  50. num = pion.numero
  51. for coord in self._mO:
  52. for key, val in self._mO[coord].items():
  53. if val == num: del self._mO[coord][key]
  54. #on l'ajoute la ou il se trouve maintenant
  55. for x, y in pion.forme.listeCases(pion.position, pion.nbRotations):
  56. for z in range(1, pion.hauteur + 1):
  57. zAbs = (self._altitudeCase((x,y)) + pion.z + z)
  58. self._mO[(x,y)][zAbs] = num
  59. def occupant(self, coord, zAbs = None):
  60. """renvoie l'occupant de la case a l'altitude precisee, a celle du sol sinon"""
  61. if not zAbs: zAbs = self._altitudeCase(coord)
  62. return (self._mO[coord][zAbs] if zAbs in self._mO[coord] else None)
  63. def estOccupee(self, coord, zAbs = None):
  64. return (self.occupant(coord, zAbs) != None)
  65. o = Occupation()
  66. o.majMo({(0,0): {0: 0, 2: 1}, (1,1): {0: 0, 2: 1}})
  67. o.majAltitudes([(1,1)], 10)
  68. print o.mo()