class Player: RADIUS = 10 COLOR1 = "#80d6ff" COLOR2 = "#ff867c" OUTLINE = "#000000" @property def right(self): return self.pos.sub(Vector(Player.RADIUS, 0)) @property def left(self): return self.pos.add(Vector(Player.RADIUS, 0)) @property def color(self): if self.team == 1: return Player.COLOR1 elif self.team == 2: return Player.COLOR2 def __init__(self, canvas, team): self.canvas = canvas self.team = team self.pos = Vector(0, 0) self.old_pos = Vector(0, 0) self.shape = None def set(self, v): self.old_pos = self.pos self.pos = v self.paint() def move(self, v: Vector): self.set(self.pos.add(v)) def move_to_point(self, point: Vector): v = randint(1, 10) / 10 self.move(point.sub(self.pos).norm().mul(Vector(v, v))) def get_ball(self, ball): if self.team == 1: ball.set(self.right) elif self.team == 2: ball.set(self.left) def paint(self): if self.shape is None: self.shape = self.canvas.create_rectangle(-Player.RADIUS, -Player.RADIUS, Player.RADIUS, Player.RADIUS, outline=Player.OUTLINE, fill=self.color) delta = self.pos.sub(self.old_pos) self.canvas.move(self.shape, delta.x, delta.y) def rectangle(self) -> Rectangle: return self.pos.rect(Player.RADIUS) def ball_hit_test(self, ball: Ball) -> bool: return self.rectangle().hit(ball.pos)
class Goalkeeper: RADIUS = 10 COLOR1 = "#0077c2" COLOR2 = "#b61827" @property def left(self): return self.pos.sub(Vector(Goalkeeper.RADIUS, 0)) @property def right(self): return self.pos.add(Vector(Goalkeeper.RADIUS, 0)) @property def color(self): if self.team == 1: return Goalkeeper.COLOR1 elif self.team == 2: return Goalkeeper.COLOR2 def __init__(self, canvas, team): self.canvas = canvas self.team = team self.pos = Vector(0, 0) self.old_pos = Vector(0, 0) self.shape = None self.miss_ball = False def set(self, new_pos): self.old_pos = self.pos self.pos = new_pos self.paint() def get_ball(self, ball, team): if team == 1: ball.set(self.right) elif team == 2: ball.set(self.left) def move_to_ball_y(self, ball: Ball, field: Field): if field.goal_start_y <= ball.pos.y <= field.goal_end_y: y = field.center_y + (ball.pos.y - field.center_y) / 2 self.set(Vector(self.pos.x, y)) def set_on_center(self, field: Field): if self.team == 1: self.set(Vector(field.start_x + Field.BOX / 3, field.center_y)) elif self.team == 2: self.set(Vector(field.end_x - Field.BOX / 3, field.center_y)) def ball_hit_test(self, ball: Ball) -> bool: if not self.miss_ball and self.rectangle().hit(ball.pos): if randint(0, 5) == 3: self.miss_ball = True return False else: ball.rebound_x() return True else: return False def paint(self): if self.shape is None: self.shape = self.canvas.create_rectangle(-Goalkeeper.RADIUS, -Goalkeeper.RADIUS, Goalkeeper.RADIUS, Goalkeeper.RADIUS, outline='black', fill=self.color) delta = self.pos.sub(self.old_pos) self.canvas.move(self.shape, delta.x, delta.y) def rectangle(self) -> Rectangle: return self.pos.rect(Goalkeeper.RADIUS)