Пример #1
0
class LaserGame:
    def __init__(self):
        self.won_by_ufo = 0
        self.won_by_laser = 0

        self.reset()
    
    def reset(self):
        self.laser = Laser()
        self.ufo = Ufo()

        self.alpha = 0 #angle between laserbeam and ufo
        self.gamma = 0 #angle between center and left/right end of ufo circle
        self.hit = False
    
    def rotate_laser(self, clockwise):
        self.laser.rotate(clockwise)
    
    def fire_laser(self):
        self.laser.fire()
    
    def set_ufo_target(self, x, y):
        self.ufo.set_target_pos(x, y)

    def update(self):
        self.ufo.update()
        self.laser.update()
        self.__calculate_angles()
        self.hit = self.laser.fires and self.alpha <= self.gamma

        if (self.hit):
            self.ufo.receive_damage(self.laser.power)
        
        if(not self.ufo.alive):
            self.won_by_laser += 1
            self.reset()
        elif(self.ufo.jumped):
            self.won_by_ufo += 1
            self.reset()

    def __calculate_angles(self):
        lx = math.sin(self.laser.rotation)
        ly = -math.cos(self.laser.rotation)

        ltx = self.ufo.x - 0.5
        lty = self.ufo.y - 0.5

        dot = lx * ltx + ly * lty
        det = lx * lty - ly * ltx
        self.alpha = abs(math.atan2(det, dot))

        d = math.sqrt(ltx * ltx + lty * lty)
        self.gamma = math.asin(self.ufo.radius / d) if d > self.ufo.radius else 2 * math.pi
Пример #2
0
def test_firing_laser_removes_hit_asteroid():
    asteroid_map = MagicMock()
    laser_position = Coord(3, 4)

    asteroid_map.all_asteroids_in_line_of = MagicMock(
        return_value=iter([Coord(42, 55)]))

    laser = Laser(asteroid_map, laser_position)

    laser.fire()

    asteroid_map.remove_asteroid.assert_called_with(Coord(42, 55))
Пример #3
0
def test_rotating_to_next_asteroid():
    ## Laser map:
    ## #.
    ## X#
    asteroid_map = AsteroidMap.from_string("##\n##")
    laser_position = Coord(0, 1)

    laser = Laser(asteroid_map, laser_position)

    laser.fire()
    laser.rotate_to_next_asteroid()

    assert laser.laser_direction == Coord(1, -1)
Пример #4
0
def test_laser_rotates_to_hit_next_thing():
    amap, laser_pos = laser_test()

    laser = Laser(amap, laser_pos)

    asteroid_hit = laser.fire()
    laser.rotate_to_next_asteroid()
    asteroid_hit = laser.fire()
    laser.rotate_to_next_asteroid()

    assert asteroid_hit == Coord(9, 0)

    asteroid_hit = laser.fire()

    assert asteroid_hit == Coord(9, 1)
Пример #5
0
def test_first_thing_laser_shoots_is_correct():
    amap, laser_pos = laser_test()

    laser = Laser(amap, laser_pos)

    asteroid_hit = laser.fire()

    assert asteroid_hit == Coord(8, 1)
Пример #6
0
            if event.key == pygame.K_x:
                carryOn = False

    # === User input handling ===
    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        playerRocket.moveUp(10)
    elif keys[pygame.K_s]:
        playerRocket.moveDown(10)
    if keys[pygame.
            K_SPACE]:  # This is an if so you can hold spacebar and move.
        if newLaser.fired == False:
            effect = pygame.mixer.Sound('laser.wav')
            effect.set_volume(1)
            effect.play()
            newLaser.fire(playerRocket.rect.x,
                          playerRocket.rect.y + playerRocket.height // 2)

    # Creates boundaries by moving in the opposite direction, at the same speed so the rocket can't move past these points
    if playerRocket.rect.y == 105:
        playerRocket.moveDown(10)
    if playerRocket.rect.y == 555:
        playerRocket.moveUp(10)

    newLaser.move(70)

    #Detect if laser hits an asteroid
    if newLaser.fired:
        asteroid_collision_list = pygame.sprite.spritecollide(
            newLaser, all_asteroids, False)
        for asteroid in asteroid_collision_list:
            print("Asteroid Hit!")