29-75 / running-car

머신러닝을 기반으로 장애물을 피해 달리는 자동차를 만들어보자
0 stars 3 forks source link

개인 코드 리뷰 및 동작 설명을 한다. #15

Open gon-park opened 4 years ago

gon-park commented 4 years ago

개인별로 각자 정리 해봅시다.

jeonhyunji commented 4 years ago

python running car game

  • 키보드 방향키의 입력에 따라 track에서 자동차를 주행하는 게임
  • 자동차가 track과 충돌시 자동차는 죽는다
  • 머신러닝에 사용할 게임으로 track과 충돌하지 않고 주행을 완료하는것이 목표인 게임

동작과정

  1. 키보드 방향키 입력
    • user input 에 따라 car acceleration&steering을 결정
    • car position&angle 갱신
      • K_UP&K_DOWN -> acceleration (속도)
      • K_RIGHT&K_LEFT -> steering (진행방향)
  2. 자동차 업데이트
  3. 자동차 충돌 판단
  4. 자동차 정보 출력
    • 자동차의 위치, 속도 출력
mbj0528 commented 4 years ago

https://github.com/29-75/running-car/blob/ByeongJu-Min/game.py 방향키에 따라 차량 운행.

sungwon-ahn commented 4 years ago

@sungwon-ahn

Main.py


## update func
    - 차량의 속도와 각도에 따라 차량의 위치를 매 round 별로 update 하는 함수.
```py
        self.velocity += (self.acceleration * dt, 0)
        self.velocity.x = max(-self.max_velocity,
                              min(self.velocity.x, self.max_velocity))

        if self.steering:
            turning_radius = self.length / sin(radians(self.steering))
            angular_velocity = self.velocity.x / turning_radius
        else:
            angular_velocity = 0

        self.position += self.velocity.rotate(-self.angle) * dt
        self.angle += degrees(angular_velocity) * dt

        # Make car rect
        self.rotated = pygame.transform.rotate(self.car_image, self.angle)
        rotated_rect = self.rotated.get_rect()

        # Calculate position
        self.real_position = self.position * PPU

        self.center_position.x = self.real_position.x + rotated_rect.width / 2
        self.center_position.y = self.real_position.y + rotated_rect.height / 2

draw func

- 특정값을 화면에 출력해주는 함수.
            # Drawing
            self.screen.fill((0, 0, 0, 0))
            self.screen.blit(self.map_surface, (0, 0))
            self.printText("car position: " + str(car.position), 3, 3)
            self.printText("car steering: " + str(car.steering), 3, 20)
            self.printText("car velocity: " + str(car.velocity[0]), 3, 37)
            self.printText("car acceleration: " + str(car.acceleration), 3, 54)
            self.printText("car angle : " + str(car.angle), 3, 71)
gon-park commented 4 years ago

@gon-park

Main 함수

Simple game 생성/시작

if __name__ == "__main__":
    # Declare game
    race_game = game.Game(auto=True)

    # Run car in builded map
    race_game.run_car()

Game class

맵 그리기

        map_path = os.path.join(RESOURCE_DIR, "map.png")
        self.map_surface = pygame.image.load(map_path)

Map mask 그리기

        self.map_mask = pygame.mask.from_surface(self.map_surface)

        mask_fx = pygame.mask.from_surface(
            pygame.transform.flip(self.map_surface, True, False))
        mask_fy = pygame.mask.from_surface(
            pygame.transform.flip(self.map_surface, False, True))
        mask_fx_fy = pygame.mask.from_surface(
            pygame.transform.flip(self.map_surface, True, True))
        self.flipped_masks = [[self.map_mask, mask_fy], [mask_fx, mask_fx_fy]]

Car 객체 생성

       self.car = car.Car(*START_POINT)

run_car() 함수를 통해 실제 car 달리는 것 표현

     while(true) :
            # init screen
            self.init_screen()

            # Event queue
            event = pygame.event.poll()
            if event.type == pygame.QUIT:
                self.action_status = EXIT

            # Process moving
            self.process_moving_car()

            # Car update
            self.car.update(self.dt)

            # Car check position
            self.check_position_and_reset_position()

            # Calculate distance
            self.car.point_zero_angle = self.calculate_distance(
                self.car.center_position, self.car.angle)
            self.car.point_plus_45_angle = self.calculate_distance(
                self.car.center_position, self.car.angle + 45)
            self.car.point_minus_45_angle = self.calculate_distance(
                self.car.center_position, self.car.angle - 45)

            # Car check distance and reset position
            if self.car.center_position.distance_to(self.car.point_zero_angle) < 5:
                self.car.__init__(*START_POINT, angle=0)
            elif self.car.center_position.distance_to(self.car.point_minus_45_angle) < 5:
                self.car.__init__(*START_POINT, angle=0)
            elif self.car.center_position.distance_to(self.car.point_plus_45_angle) < 5:
                self.car.__init__(*START_POINT, angle=0)

            # Draw
            self.draw_screen()

            self.clock.tick(self.ticks)

Car class

running-car/gon-park/race/car.py

Car 당 고유 정보(running을 표현하는 지표)를 포함하고 있는 클래스

        self.car_image = pygame.image.load(image_path)
        self.position = Vector2(x / PPU, y / PPU)
        self.real_position = Vector2(x, y)
        self.angle = angle
        self.length = length
        self.max_acceleration = MAX_ACCELERATION
        self.max_steering = MAX_STEERING
        self.max_velocity = MAX_VELOCITY
        self.free_deceleration = FREE_DECELERATION
        self.break_deceleration = BREAK_DECELERATION
        self.velocity = Vector2(*ZERO_XY)
        self.acceleration = 0.0
        self.steering = 0.0
        self.rotated = pygame.transform.rotate(self.car_image, self.angle)
        self.center_position = Vector2(
            self.real_position.x + self.car_image.get_rect().width / 2,
            self.real_position.y + self.car_image.get_rect().height / 2)

        # line
        self.point_minus_45_angle = ZERO_XY
        self.point_zero_angle = ZERO_XY
        self.point_plus_45_angle = ZERO_XY

Game time 틱당 Car update() 함수를 통해 차량의 다양한 지표를 계산하고 업데이트 수행

        self.velocity += (self.acceleration * dt, 0)
        self.velocity.x = max(-self.max_velocity,
                              min(self.velocity.x, self.max_velocity))
        # >> 속도 업데이트

        if self.steering:
            turning_radius = self.length / sin(radians(self.steering))
            angular_velocity = self.velocity.x / turning_radius
        else:
            angular_velocity = 0
        # >> 방향 업데이트

        self.position += self.velocity.rotate(-self.angle) * dt
        self.angle += degrees(angular_velocity) * dt
        # >> 위치 업데이트

        # Make car rect
        self.rotated = pygame.transform.rotate(self.car_image, self.angle)
        rotated_rect = self.rotated.get_rect()
        # >> 방향 전환 된 차 형태 업데이트

        # Calculate position
        self.real_position = self.position * PPU
        self.center_position.x = self.real_position.x + rotated_rect.width / 2
        self.center_position.y = self.real_position.y + rotated_rect.height / 2
        # >> Car 중앙 위치 업데이트