SOLDIER_HP = 20 SOLDIER_SPEED = 5 TANK_HP = 35 TANK_SPEED = SOLDIER_SPEED BIRDMAN_HP = 10 BIRDMAN_SPEED = 13 def distance(loc1, loc2): '''distance between two (x,y) tuples''' dx, dy = loc2[0]-loc1[0], loc2[1]-loc1[1] return (dx**2 + dy**2)**.5 class Unit(): '''base unit class, everything added to the map should be a subclass of this''' def __init__(self, pos, hp = 0): self.pos = pos self.hp = hp def getPos(self): return self.pos def setPos(self, newpos): self.pos = newpos def getHp(self): return self.hp def setHp(self, n): self.hp = n class Soldier(Unit): '''basic soldier''' def __init__(self, pos, hp = SOLDIER_HP): Unit.__init__(self, pos, hp = hp) def canMove(self, loc): '''loc is a (x,y) tuple''' print(' Called Soldier.canMove') return distance(self.getPos(), loc) < SOLDIER_SPEED and world.traversable(loc) def act(self): pass class Tank(Soldier): '''is stronk, generally slower''' def __init__(self, pos, hp = TANK_HP): Soldier.__init__(self, pos, hp=hp) self.nitro = 0 def __str__(self): return 'Tank at: ' + str(self.pos) def canMove(self, loc): print(' Called Tank.canMove') if self.getHp() < TANK_HP/2: return Soldier.canMove(self, loc) else: return True class BirdMan(Soldier): '''can fly''' def __init__(self, pos, hp = BIRDMAN_HP): Soldier.__init__(self, pos, hp=hp) def __str__(self): return 'Birdman at: ' + str(self.pos) def canMove(self, loc): '''doesn't call traversable, because wings''' print(' Called BirdMan.canMove') return distance(self.getPos(), loc) < BIRDMAN_SPEED class World(): def __init__(self, sz = (800, 800)): self.sz = sz self.units = [] self.environment = [] def traversable(self, loc): '''returns if this position can be moved onto (for ground units)''' x, y = loc[0], loc[1] for element in self.environment: ex, ey = element.getPos() ew, eh = element.getHitbox() if x >= ex and x <= (ex+ew) and y >= ey and y <= (ey+eh): return False return True def addUnit(self, unit): print('Added ' + str(unit)) self.units.append(unit) def addEnviron(self, e): print('Added ' + str(e) + ' to environment.') self.environment.append(e) class Element(Unit): def __init__(self, pos): Unit.__init__(self, pos) def getHitbox(self): return (0,0) class Rock(Element): def __init__(self, pos): Element.__init__(self, pos) def __str__(self): return 'Rock at: ' + str(self.pos) def getHitbox(self): return (5,5) if __name__ == '__main__': tnk = Tank((50,73)) b_man = BirdMan((50,85)) world = World() world.addUnit(tnk) world.addUnit(b_man) rock = Rock((50, 75)) world.addEnviron(rock) print('Can tank move to (50,75)\n', tnk.canMove((50,75))) print('Can birdman move to (50,75)\n', b_man.canMove((50,75))) tnk.setHp(1) print('Can injured tank move to (50,75)\n', tnk.canMove((50,75)))