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
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))
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)
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)
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)
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!")