Example #1
0
    def test_r0_moves_into_r1_once(self):
        self._r0.get_move = lambda: direction.EAST
        self._game._do_round(self._round)

        self.assertEquals(len(self._history._rounds), 2)
        a0 = self._history._rounds[1]._actions[self._r0]
        a1 = self._history._rounds[1]._actions[self._r1]
        p0 = position.Position(1, 1)
        p1 = position.Position(2, 1)

        self.assertEquals(a0.starting_health, self._options.robot_health)
        self.assertEquals(
            a0.ending_health,
            self._options.robot_health - self._options.collision_damage)
        self.assertEquals(a0.starting_position, p0)
        self.assertEquals(a0.ending_position, p0)
        self.assertEquals(a0.shot_direction, None)
        self.assertEquals(a0.shot_distance, None)
        self.assertEquals(a0.radar_direction, None)
        self.assertEquals(a0.radar_return, None)
        self.assertEquals(a0.move_direction, direction.EAST)
        self.assertEquals(a0.move_distance, 0)
        self.assertEquals(len(a0.damage_dealt), 1)
        self.assertEquals(a0.damage_dealt[0].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_dealt[0].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(len(a0.damage_taken), 1)
        self.assertEquals(a0.damage_taken[0].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_taken[0].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(a0.lose_reason, None)

        self.assertEquals(a1.starting_health, self._options.robot_health)
        self.assertEquals(
            a1.ending_health,
            self._options.robot_health - self._options.collision_damage)
        self.assertEquals(a1.starting_position, p1)
        self.assertEquals(a1.ending_position, p1)
        self.assertEquals(a1.shot_direction, None)
        self.assertEquals(a1.shot_distance, None)
        self.assertEquals(a1.radar_direction, None)
        self.assertEquals(a1.radar_return, None)
        self.assertEquals(a1.move_direction, None)
        self.assertEquals(a1.move_distance, None)
        self.assertEquals(len(a1.damage_dealt), 1)
        self.assertEquals(a1.damage_dealt[0].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_dealt[0].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(len(a1.damage_taken), 1)
        self.assertEquals(a1.damage_taken[0].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_taken[0].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(a1.lose_reason, None)
Example #2
0
  def _find_empty_position(self):
    """Emplace robts onto the map.

    Brute force attempt to randomly place a robot somewhere sane.  Simpler to
    just do a lot of tries rather than to enumerate the available spots and
    randomly pick one.  Eventually, if terrain acquires a lot of features,
    may need to prove that all robots can eventually travel to the point
    where they can see and/or shoot one another.
    """

    patience = 3
    while patience > 0:
      patience -= 1

      # Pick a spot.
      destination = position.Position(
          random.randint(1, self._map.width - 2),
          random.randint(1, self._map.height - 2))

      # Don't drop the robot onto anything unpleasant.
      if not self._map.get(destination).can_move_onto:
        continue

      # Or onto another robot.
      other_robot, other_robot_data = self._find_robot(destination)
      if other_robot:
        continue

      return destination

    raise RuntimeError("Tried too many times to place a robot.  "
                       "Perhaps there are too many robots for the available "
                       "space on the map?")
Example #3
0
    def test_mutual_radar(self):
        self._r0.get_radar = lambda: direction.EAST
        self._r1.get_radar = lambda: direction.WEST
        self._game._do_round(self._round)

        self.assertEquals(len(self._history._rounds), 2)
        a0 = self._history._rounds[1]._actions[self._r0]
        a1 = self._history._rounds[1]._actions[self._r1]
        p0 = position.Position(1, 1)
        p1 = position.Position(2, 1)

        self.assertEquals(a0.starting_health, self._options.robot_health)
        self.assertEquals(a0.ending_health, self._options.robot_health)
        self.assertEquals(a0.starting_position, p0)
        self.assertEquals(a0.ending_position, p0)
        self.assertEquals(a0.shot_direction, None)
        self.assertEquals(a0.shot_distance, None)
        self.assertEquals(a0.radar_direction, direction.EAST)
        self.assertEquals(
            a0.radar_return,
            robot_module.RadarReturn(direction.EAST, 1,
                                     self._options.robot_health, None, None))
        self.assertEquals(a0.move_direction, None)
        self.assertEquals(a0.move_distance, None)
        self.assertEquals(len(a0.damage_dealt), 0)
        self.assertEquals(len(a0.damage_taken), 0)
        self.assertEquals(a0.lose_reason, None)

        self.assertEquals(a1.starting_health, self._options.robot_health)
        self.assertEquals(a1.ending_health, self._options.robot_health)
        self.assertEquals(a1.starting_position, p1)
        self.assertEquals(a1.ending_position, p1)
        self.assertEquals(a1.shot_direction, None)
        self.assertEquals(a1.shot_distance, None)
        self.assertEquals(a1.radar_direction, direction.WEST)
        self.assertEquals(
            a1.radar_return,
            robot_module.RadarReturn(direction.WEST, 1,
                                     self._options.robot_health, None, None))
        self.assertEquals(a1.move_direction, None)
        self.assertEquals(a1.move_distance, None)
        self.assertEquals(len(a1.damage_dealt), 0)
        self.assertEquals(len(a1.damage_taken), 0)
        self.assertEquals(a1.lose_reason, None)
Example #4
0
    def test_move_south(self):
        self._r0.get_move = lambda: direction.SOUTH
        self._round = self._game._do_round(self._round)

        self.assertEquals(len(self._history._rounds), 2)
        a0 = self._history._rounds[1]._actions[self._r0]
        self.assertEquals(a0.starting_health, self._options.robot_health)
        self.assertEquals(a0.ending_health, self._options.robot_health)
        self.assertEquals(a0.starting_position, position.Position(1, 1))
        self.assertEquals(a0.ending_position, position.Position(1, 1))
        self.assertEquals(a0.shot_direction, None)
        self.assertEquals(a0.shot_distance, None)
        self.assertEquals(a0.radar_direction, None)
        self.assertEquals(a0.radar_return, None)
        self.assertEquals(a0.move_direction, direction.SOUTH)
        self.assertEquals(a0.move_distance, 0)
        self.assertEquals(len(a0.damage_dealt), 0)
        self.assertEquals(len(a0.damage_taken), 0)
        self.assertEquals(a0.lose_reason, None)
Example #5
0
    def test_round_zero(self):
        self.assertEquals(len(self._history._rounds), 1)
        a0 = self._history._rounds[0]._actions[self._r0]
        p0 = position.Position(1, 1)

        self.assertEquals(a0.starting_health, self._options.robot_health)
        self.assertEquals(a0.ending_health, self._options.robot_health)
        self.assertEquals(a0.starting_position, p0)
        self.assertEquals(a0.ending_position, p0)
        self.assertEquals(a0.shot_direction, None)
        self.assertEquals(a0.shot_distance, None)
        self.assertEquals(a0.radar_direction, None)
        self.assertEquals(a0.radar_return, None)
        self.assertEquals(a0.move_direction, None)
        self.assertEquals(a0.move_distance, None)
        self.assertEquals(len(a0.damage_dealt), 0)
        self.assertEquals(len(a0.damage_taken), 0)
        self.assertEquals(a0.lose_reason, None)
Example #6
0
 def test_one_space_one_robot(self):
     world_map = terrain.TerrainMap(' ', '')
     r = robot_module.Robot(0, world_map)
     game = master.Master(self._options, [r], world_map, self._history)
     self.assertEquals(game._robot_data[r].position,
                       position.Position(1, 1))
Example #7
0
    def test_sneeches(self):
        self._r0.get_shot = lambda: direction.EAST
        self._r0.get_move = lambda: direction.EAST
        self._r0.get_radar = lambda: direction.EAST

        self._r1.get_shot = lambda: direction.WEST
        self._r1.get_move = lambda: direction.WEST
        self._r1.get_radar = lambda: direction.WEST

        self._game.run()

        self.assertEquals(len(self._history._rounds), 3)

        # Check results of round #1; expect both to have moved, radared, and shot
        # sucessfully, but not conclusively.
        a0 = self._history._rounds[1]._actions[self._r0]
        a1 = self._history._rounds[1]._actions[self._r1]

        self.assertEquals(a0.starting_health, self._options.robot_health)
        self.assertEquals(
            a0.ending_health,
            self._options.robot_health - self._options.shot_damage)
        self.assertEquals(a0.starting_position, position.Position(1, 1))
        self.assertEquals(a0.ending_position, position.Position(2, 1))
        self.assertEquals(a0.shot_direction, direction.EAST)
        self.assertEquals(a0.shot_distance, 3)
        self.assertEquals(a0.radar_direction, direction.EAST)
        self.assertEquals(
            a0.radar_return,
            robot_module.RadarReturn(
                direction.EAST, 1,
                self._options.robot_health - self._options.shot_damage,
                direction.WEST, 1))
        self.assertEquals(a0.move_direction, direction.EAST)
        self.assertEquals(a0.move_distance, 1)
        self.assertEquals(len(a0.damage_dealt), 1)
        self.assertEquals(a0.damage_dealt[0].amount, self._options.shot_damage)
        self.assertEquals(a0.damage_dealt[0].description,
                          'Robot(#0) shot Robot(#1)')
        self.assertEquals(len(a0.damage_taken), 1)
        self.assertEquals(a0.damage_taken[0].amount, self._options.shot_damage)
        self.assertEquals(a0.damage_taken[0].description,
                          'Robot(#1) shot Robot(#0)')
        self.assertEquals(a0.lose_reason, None)

        self.assertEquals(a1.starting_health, self._options.robot_health)
        self.assertEquals(
            a1.ending_health,
            self._options.robot_health - self._options.shot_damage)
        self.assertEquals(a1.starting_position, position.Position(4, 1))
        self.assertEquals(a1.ending_position, position.Position(3, 1))
        self.assertEquals(a1.shot_direction, direction.WEST)
        self.assertEquals(a1.shot_distance, 3)
        self.assertEquals(a1.radar_direction, direction.WEST)
        self.assertEquals(
            a1.radar_return,
            robot_module.RadarReturn(
                direction.WEST, 1,
                self._options.robot_health - self._options.shot_damage,
                direction.EAST, 1))
        self.assertEquals(a1.move_direction, direction.WEST)
        self.assertEquals(a1.move_distance, 1)
        self.assertEquals(len(a1.damage_dealt), 1)
        self.assertEquals(a1.damage_dealt[0].amount, self._options.shot_damage)
        self.assertEquals(a1.damage_dealt[0].description,
                          'Robot(#1) shot Robot(#0)')
        self.assertEquals(len(a1.damage_taken), 1)
        self.assertEquals(a1.damage_taken[0].amount, self._options.shot_damage)
        self.assertEquals(a1.damage_taken[0].description,
                          'Robot(#0) shot Robot(#1)')
        self.assertEquals(a1.lose_reason, None)

        # Check results of round #2; expect both to have attempted to move but
        # failed (collided), shot, and radared.  Both should be dead due to
        # collision.
        a0 = self._history._rounds[2]._actions[self._r0]
        a1 = self._history._rounds[2]._actions[self._r1]

        self.assertEquals(
            a0.starting_health,
            self._options.robot_health - self._options.shot_damage)
        self.assertEquals(a0.ending_health, 0)
        self.assertEquals(a0.starting_position, position.Position(2, 1))
        self.assertEquals(a0.ending_position, position.Position(2, 1))
        self.assertEquals(a0.shot_direction, direction.EAST)
        self.assertEquals(a0.shot_distance, 1)
        self.assertEquals(a0.radar_direction, None)  # died before radar sent.
        self.assertEquals(a0.radar_return, None)  # died before radar sent.
        self.assertEquals(a0.move_direction, direction.EAST)
        self.assertEquals(a0.move_distance, 0)
        self.assertEquals(len(a0.damage_dealt), 3)
        self.assertEquals(a0.damage_dealt[0].amount, self._options.shot_damage)
        self.assertEquals(a0.damage_dealt[0].description,
                          'Robot(#0) shot Robot(#1)')
        self.assertEquals(a0.damage_dealt[1].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_dealt[1].description,
                          'Robot(#1) drove into Robot(#0)')
        self.assertEquals(a0.damage_dealt[2].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_dealt[2].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(len(a0.damage_taken), 3)
        self.assertEquals(a0.damage_taken[0].amount, self._options.shot_damage)
        self.assertEquals(a0.damage_taken[0].description,
                          'Robot(#1) shot Robot(#0)')
        self.assertEquals(a0.damage_taken[1].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_taken[1].description,
                          'Robot(#1) drove into Robot(#0)')
        self.assertEquals(a0.damage_taken[2].amount,
                          self._options.collision_damage)
        self.assertEquals(a0.damage_taken[2].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(a0.lose_reason, 'Robot(#0) drove into Robot(#1)')

        self.assertEquals(
            a1.starting_health,
            self._options.robot_health - self._options.shot_damage)
        self.assertEquals(a1.ending_health, 0)
        self.assertEquals(a1.starting_position, position.Position(3, 1))
        self.assertEquals(a1.ending_position, position.Position(3, 1))
        self.assertEquals(a1.shot_direction, direction.WEST)
        self.assertEquals(a1.shot_distance, 1)
        self.assertEquals(a1.radar_direction, None)  # died before radar sent.
        self.assertEquals(a1.radar_return, None)  # died before radar sent.
        self.assertEquals(a1.move_direction, direction.WEST)
        self.assertEquals(a1.move_distance, 0)
        self.assertEquals(len(a1.damage_dealt), 3)
        self.assertEquals(a1.damage_dealt[0].amount, self._options.shot_damage)
        self.assertEquals(a1.damage_dealt[0].description,
                          'Robot(#1) shot Robot(#0)')
        self.assertEquals(a1.damage_dealt[1].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_dealt[1].description,
                          'Robot(#1) drove into Robot(#0)')
        self.assertEquals(a1.damage_dealt[2].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_dealt[2].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(len(a1.damage_taken), 3)
        self.assertEquals(a1.damage_taken[0].amount, self._options.shot_damage)
        self.assertEquals(a1.damage_taken[0].description,
                          'Robot(#0) shot Robot(#1)')
        self.assertEquals(a1.damage_taken[1].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_taken[1].description,
                          'Robot(#1) drove into Robot(#0)')
        self.assertEquals(a1.damage_taken[2].amount,
                          self._options.collision_damage)
        self.assertEquals(a1.damage_taken[2].description,
                          'Robot(#0) drove into Robot(#1)')
        self.assertEquals(a1.lose_reason, 'Robot(#0) drove into Robot(#1)')