| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # -*- coding: utf-8 -*-
- """outils de gestion de l'occupation de l'espace sur le plateau
- - la matrice occupation [mO] est de la forme {(x,y):{z0: 0, z1:N, z2:N, z3:N...}}
- ou N est le numero du pion, et 0 le niveau du sol, et zi est l'altitude ABSOLUE de la case
- """
- class Occupation():
- def __init__(self):
- self._mO = {}
-
- def majMo(self, mo):
- self._mO = mo
- def mo(self):
- return self._mO
-
- def generer(self, plateau):
- """genere la matrice"""
- self._mO = {key:{value.altitude:0} for key, value in plateau.cases.items()}
- for num in plateau.pions:
- pion = plateau.pions[num]
- for x, y in pion.forme.listeCases(pion.position, pion.nbRotations):
- for z in range(1, pion.hauteur + 1):
- zAbs = (plateau.cases[(x,y)].altitude + pion.z + z)
- self._mO[(x,y)][zAbs] = num
-
-
- def maj(self, *args):
- """met a jour l'occupation, selon ce qui est apsse en parametre:
- - si (liste de coord, altitude), met a jour l'altitude des cases correspondantes et celle des pions qui les occupent
- - si (pion), met a jour l'occupation en fonction de sa nouvelle situation (deplace, pivote, supprime, nouveau)
- - si (plateau), regenere
- """
- if len(args) == 1:
- if args[0].__class__.__name__ == "Plateau":
- self.generer(args[0])
-
- else:
- print "pion"
-
- elif len(args) == 2:
- self._majAltitudes(args[0], args[1])
-
- def _altitudeCase(self, coord):
- for key, val in self._mO[coord].items():
- if val == 0: return key
- return 0
-
- def _majAltitudes(self, lstCoord, altitude):
-
- for coord in lstCoord:
- ancien = self._mO[coord]
- self._mO[coord] = {}
-
- for z in ancien:
- if ancien[z] == 0:
- dz = altitude - z
- for z in ancien:
- self._mO[coord][(z + dz)] = ancien[z]
- def _majPion(self, pion):
- #on efface son ancienne occupation
- num = pion.numero
- for coord in self._mO:
- for key, val in self._mO[coord].items():
- if val == num: del self._mO[coord][key]
-
- #on l'ajoute la ou il se trouve maintenant
- for x, y in pion.forme.listeCases(pion.position, pion.nbRotations):
- for z in range(1, pion.hauteur + 1):
- zAbs = (self._altitudeCase((x,y)) + pion.z + z)
- self._mO[(x,y)][zAbs] = num
- def occupant(self, coord, zAbs = None):
- """renvoie l'occupant de la case a l'altitude precisee, a celle du sol sinon"""
- if not zAbs: zAbs = self._altitudeCase(coord)
- return (self._mO[coord][zAbs] if zAbs in self._mO[coord] else None)
-
- def estOccupee(self, coord, zAbs = None):
- return (self.occupant(coord, zAbs) != None)
-
-
- o = Occupation()
- o.majMo({(0,0): {0: 0, 2: 1}, (1,1): {0: 0, 2: 1}})
- o.majAltitudes([(1,1)], 10)
- print o.mo()
-
-
|