コード例 #1
0
ファイル: TestUpdate.py プロジェクト: vargasjeffrey52/cs61b
	def checkUpdate(self):
		print("Checking update...")

		p1 = Planet(1.0, 1.0, 3.0, 4.0, 5.0, "jupiter.gif")

		p1.update(2.0, 1.0, -0.5)

		self.checkEquals(7.8, p1.xxPos, "update()", 0.01)
		self.checkEquals(8.6, p1.yyPos, "update()", 0.01)
		self.checkEquals(3.4, p1.xxVel, "update()", 0.01)
		self.checkEquals(3.8, p1.yyVel, "update()", 0.01)
コード例 #2
0
class Game:
    def __init__(self, screen, level):
        self.screen = screen
        self.level = level
        self.level_data = ''
        self.FPS = 30

        self.in_game = True
        self.hurled = False

        self.__load_level()
        self.__create_objects()
        self.__load_positions()
        self.__game_loop()

    ##
    def __load_level(self):
        try:
            path = '../data/levels/level_{}.lvl'.format(self.level)
            self.level_data = open(path)
            self.level_data = self.level_data.read().split('\n')
        except:
            self.in_game = False

        if self.level_data == ['']:
            self.in_game = False

    def __create_objects(self):
        if self.in_game:
            self.earth = ''
            self.black_hole = ''
            self.stars = []
            self.neutron_stars = []

    def __load_positions(self):
        for data in self.level_data:
            name, x, y = self.__break_data(data)

            if name == 'earth':
                self.earth = Planet(x, y)
            if name == 'black_hole':
                self.black_hole = Black_Hole(x, y)
            if name == 'star':
                self.stars.append(Star(x, y))
            if name == 'neutron_star':
                self.neutron_stars.append(Neutron_Star(x, y))

    def __break_data(self, data):
        data = data.split()
        return data[0], int(data[1]), int(data[2])

    def __game_loop(self):
        while self.in_game:
            self.__clear_screen()
            self.__check_events()
            self.__show()
            self.__update()
            self.__gravity_interation()
            self.__set_fps()
            self.__check_game_status()
            pygame.display.update()

    ##
    def __check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.in_game = False

            if event.type == pygame.MOUSEBUTTONUP:
                x, y = event.pos[0], event.pos[1]
                if not self.hurled:
                    self.earth.throw(x, y)
                    self.hurled = True

            if event.type == pygame.KEYDOWN and event.unicode == ' ':
                self.__init__(self.screen, self.level)

    def __clear_screen(self):
        self.screen.fill((10, 0, 20))

    def __show(self):
        self.earth.show(self.screen)
        self.black_hole.show(self.screen)
        for star in self.stars:
            star.show(self.screen)
        for star in self.neutron_stars:
            star.show(self.screen)

    def __update(self):
        self.earth.update()

    def __gravity_interation(self):
        if self.hurled:
            for i in self.stars:
                self.earth.gravity(i)

            for i in self.neutron_stars:
                self.earth.gravity(i)

            self.earth.gravity(self.black_hole)

    def __set_fps(self):
        pygame.time.Clock().tick(self.FPS)

    def __check_game_status(self):
        if self.earth.contact(self.black_hole):
            self.next_level()
            return

        for i in self.stars:
            if self.earth.contact(i):
                self.in_game = False
                return

        for i in self.neutron_stars:
            if self.earth.contact(i):
                self.in_game = False
                return

    def next_level(self):
        new_level = self.level + 1
        self.__init__(self.screen, new_level)
コード例 #3
0
class TestPlanet(unittest.TestCase):
    """
	This class contains few basic tests for the planet class.
	"""
    def setUp(self):
        self.mock_planet1 = Planet("Test1", (0, 0, 0), 5, 1, (0, 0))
        self.mock_planet2 = Planet("Test2", (0, 0, 0), 5, 1, (0, 0))

    def test_get_gravity_force_calc(self):
        """
		A simple test to make sure we are calculating correctly the gravitional force
		"""
        Planet.G = 1
        """
		F = (G * m1 * m2) / d ** 2
		Direction = (pos1 - pos2 / d) * -1
		"""
        self.mock_planet2.pos = np.array((0, 5))
        self.mock_planet2.mass = 10
        """
		In this case we set G = 1
		d = 5
		m1 = 1
		m2 = 10
		pos1 = (0, 0)
		pos2 = (0, 5)
		therefore
		F = (1 * 1 * 10) / 5 ** 2 = 0.4
		Direction will be = (((0, 0) - (0, 5)) / 5) * -1 = (0, 1)
		so final force should be:
		F = (0, 1) * 0.4 = (0, 0.4)
		"""
        force = self.mock_planet1.get_gravity_force(self.mock_planet2)
        fx = force[0]
        fy = force[1]
        self.assertAlmostEqual(fx, 0)
        self.assertAlmostEqual(fy, 0.4)

    def test_get_gravity_force_rasies(self):
        """
		A simple test to see if the right excpetions rasies
		for spesific paramters
		"""

        self.assertRaises(ValueError, self.mock_planet1.get_gravity_force,
                          None),
        self.assertRaises(ZeroDivisionError,
                          self.mock_planet1.get_gravity_force,
                          self.mock_planet1)

    def test_apply_force_calc(self):
        """
		A test to check we are apply force correctly
		"""
        mock_force = np.array((5, 0))
        mock_mass = 1
        inital_velocity = np.array((0, 0))
        expected_vx, expected_vy = inital_velocity + (mock_force / mock_mass)

        self.mock_planet1.mass = mock_mass
        self.mock_planet1.velocity = inital_velocity
        self.mock_planet1.apply_force(mock_force)

        calc_vx, calc_vy = self.mock_planet1.velocity

        self.assertAlmostEqual(expected_vx, calc_vx)
        self.assertAlmostEqual(expected_vy, calc_vy)

    def test_apply_force_rasies(self):
        """
		A test to make sure the right exception rasies
		"""

        self.assertRaises(ValueError, self.mock_planet1.apply_force, None)

    def test_update(self):
        """
		A test to make sure we are updating the planet position
		correctly.
		"""
        mock_pos = np.array((0, 0))
        mock_inital_velocity = np.array((0, 5))

        self.mock_planet1.mass = 1
        self.mock_planet1.pos = mock_pos
        self.mock_planet1.velocity = mock_inital_velocity

        expected_px, expected_py = mock_pos + mock_inital_velocity
        self.mock_planet1.update()
        calc_px, calc_py = self.mock_planet1.pos

        self.assertAlmostEqual(expected_px, calc_px)
        self.assertAlmostEqual(expected_py, calc_py)

    def test_clicked_on(self):
        """
		A test to make sure clicked_on is working correctly.
		"""
        self.assertTrue(self.mock_planet1.clicked_on(np.array((1, 0))))
        self.assertFalse(self.mock_planet2.clicked_on(np.array((7, 0))))
コード例 #4
0
ファイル: Universe.py プロジェクト: atheys/Portfolio
class Universe():
    def __init__(self, zoom_factor, zoom_speed, max_zoom, min_zoom, resolution,assignment):
        print "And God said, 'Let there be light,' and there was light. A new universe was created"
        self.stars = self.generate_starfield(8000, resolution[0]*max_zoom*2, resolution[1]*max_zoom*2)
        self.rockets = []
        self.explosions = []
        self.zoom_factor = zoom_factor
        self.zoom_speed = zoom_speed
        self.min_zoom_factor = min_zoom
        self.max_zoom_factor = max_zoom
        self.planet = "Not initialized"
        self.view_manager = Viewmanager()
        self.view_manager.add_view((10,10), (300, 200))
        self.init_view = False
        self.rocket_shot = False
        self.reset_view = False
        self.assignment = assignment
        self.level=int(1)
        self.fuel_used = 0.0
        self.can_shoot = False
        self.fuel_max = 0.0

        if assignment=="RUSSIAN":
            self.assignment="Destroy All Russian Satellites"
        if assignment=="AMERICAN":
            self.assignment="Destroy All American Satellites"
        if assignment=="EUROPEAN":
            self.assignment="Destroy All European Satellites"
        if assignment=="LANDER":
            self.assignment="Destroy the Lander(s)"
        if assignment=="ROCK":
            self.assignment="Destroy All Space Rocks"
        if assignment=="ALIEN":
            self.assignment="Destroy All Alien Spacecrafts"

    def get_zoom_factor(self):
        return self.zoom_factor

    def create_planet(self, name, mass, radius, rot_speed, sprite):
        self.planet = Planet(self, name, mass, radius, rot_speed, (0,0), sprite)

    def create_launcher(self, *l):
        self.planet.create_launcher(*l)

    def create_satellite(self, distance, direction, angle, nationality, name):
        self.planet.create_satellite(distance, direction, angle, nationality, name)

    def get_planet(self):
        return self.planet

    def get_can_shoot(self):
        return self.can_shoot

    def set_can_shoot(self, b):
        self.can_shoot = b

    def change_level(self,i):
        self.level=i

    def add_fuel(self, df):
        self.fuel_used+=df

    def get_fuel_used(self):
        return self.fuel_used

    def get_fuel_max(self):
        return self.fuel_max

    def change_fuel_max(self,a):
        self.fuel_max=a

    def get_all_satellites(self):
        return self.planet.get_satellites()

    def get_satellites(self):
        if self.assignment=="Destroy All Russian Satellites":
            return self.planet.get_russian_satellites()
        if self.assignment=="Destroy All American Satellites":
            return self.planet.get_american_satellites()
        if self.assignment=="Destroy All European Satellites" or self.assignment=="Destroy the Lander(s)":
            return self.planet.get_european_satellites()
        if self.assignment=="Destroy All Space Rocks":
            return self.planet.get_rock_satellites()
        if self.assignment=="Destroy All Alien Spacecrafts":
            return self.planet.get_alien_satellites()

    def get_all_satellites(self):
        return self.planet.get_satellites()

    def get_rockets(self):
        return self.rockets

    def get_launcher(self):
        return self.planet.get_launcher()

    def get_assignment(self):
        return self.assignment

    def launch_rocket(self, pos, dir, angle, initial_speed, rocket_fuel, spr1, spr2):
        self.rockets.append(Rocket(self, pos, dir, angle, initial_speed, 1e3, 200e3, rocket_fuel, spr1, spr2))
        self.rocket_shot = True

    def get_gravity(self, pos):
        return self.planet.get_gravity(pos)

    def check_collisions(self):
        for r in self.rockets:
            if check_collision(self.planet.get_pos(), r.get_pos(), self.planet.get_radius()-10):
                self.destruct_rocket(r, r)
                break
            for s in self.planet.get_satellites():
                if check_collision(r.get_pos(), s.get_pos(), 20):
                    self.destruct_rocket(r, s)
                    self.planet.remove_satellite(s)
                    break

    def destruct_rocket(self, r, object):
        self.reset_view = True
        r.explode()
        self.reset_view = True
        self.explosions.append(Explosion(r.get_pos(), 0.04, object.get_nationality()))
        self.rockets.remove(r)
        self.planet.load_rocket()

    def draw(self, screen):
        if not self.init_view:
            self.view_manager.set_target(0, self.planet.get_launcher(), screen)
            self.init_view = True

        if self.rocket_shot:
            self.view_manager.set_target(0, self.rockets[-1], screen)
            self.rocket_shot = False

        if self.reset_view:
            self.view_manager.set_target(0, self.get_launcher(), screen)
            self.reset_view = False

        if pygame.mouse.get_pressed()[2]:
            for satellite in self.planet.get_satellites():
                s_pos = to_ints(to_screen(scale_pos(satellite.get_pos(), self.zoom_factor)))
                if get_distance_between(s_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                    self.view_manager.set_target(0, satellite, screen)
            for rocket in self.planet.get_rockets():
                rocket_pos = to_ints(to_screen(scale_pos(rocket.get_pos(), self.zoom_factor)))
                if get_distance_between(rocket_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                    self.view_manager.set_target(0, rocket, screen)
            launcher = self.get_launcher()
            launcher_pos = to_ints(to_screen(scale_pos(launcher.get_pos(), self.zoom_factor)))
            if get_distance_between(launcher_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                self.view_manager.set_target(0, launcher, screen)
            planet_pos = to_ints(to_screen(scale_pos(self.planet.get_pos(), self.zoom_factor)))
            if get_distance_between(planet_pos, pygame.mouse.get_pos()) < 30*self.zoom_factor:
                self.view_manager.set_target(0, self.planet, screen)

        self.draw_stars(screen, self.stars)
        self.planet.draw(screen, self.zoom_factor)
        for rocket in self.rockets:
            rocket.draw(screen, self.zoom_factor)
        for explosion in self.explosions:
            explosion.draw(screen, self.zoom_factor)

        self.view_manager.draw(screen, self.planet, self.rockets, 1.25)

    def draw_stars(self, screen, list):
        resolution = (screen.get_rect().width, screen.get_rect().height)
        i=0
        for pos in list:
            i+=1
            if(i%3)==0:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (200,0,0))
            if(i%3)==1:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (0,0,200))
            if(i%3)==2:
                draw_pos = to_screen(scale_pos(pos, self.zoom_factor))
                if draw_pos[0] > -10 and draw_pos[0] < resolution[0]+10 and\
                    draw_pos[1] > -10 and draw_pos[1] < resolution[1]+10:
                    pygame.gfxdraw.filled_circle(screen, int(draw_pos[0]), int(draw_pos[1]), 1, (255,255,255))

    def update(self, dt):
        self.check_collisions()
        self.planet.update(dt)
        for rocket in self.rockets:
            rocket.update(dt)
        for explosion in self.explosions:
            explosion.update(dt)
            if explosion.is_done():
                self.explosions.remove(explosion)

    def pass_event(self, event):
        if event.type == pygame.MOUSEBUTTONDOWN:
            if event.button == 4:
                self.zoom_factor *= self.zoom_speed
                if self.zoom_factor > self.max_zoom_factor:
                    self.zoom_factor = self.max_zoom_factor
            if event.button == 5:
                self.zoom_factor /= self.zoom_speed
                if self.zoom_factor < self.min_zoom_factor:
                    self.zoom_factor = self.min_zoom_factor
        self.planet.pass_event(event)
        for rocket in self.rockets:
            rocket.pass_events(event)





    def generate_starfield(self, n, width, height):
        star_list = []
        for i in xrange(n):
            tempX = random.randrange(-width, width, 1)
            tempY = random.randrange(-height, height, 1)
            pos = (int(tempX), int(tempY))
            star_list.append(pos)
        return star_list