Capstone Project - Turtle Crossing Game

게임규칙

  • 거북이는 전진만 할 수 있음
  • 자동차는 y축 범위 내에서 무작위로 생성되고, 오른쪽 가장자리에서 왼쪽 가장자리로 움직임
  • 거북이가 제일 윗부분에 도착하면, 거북이는 원래 위치로 돌아가고 다음 레벨로 넘어감
  • 거북이가 자동차와 충돌하면, 게임 종료
  1. Move the turtle with keypress
  2. Create and move the cars
  3. Detect collision with car
  4. Detect when turtle reaches the other side
  5. Create a scoreboard


Move the turtle with keypress

1️⃣ 거북이 세팅

1


2️⃣ 이동키 설정

2


3️⃣ player.py에 go_up함수 정의

3



Create and move the cars

1️⃣ 새로운 모듈에 carManager클래스 생성

  • 클래스에서 정의될 때 self를 갖고 있어야 함
  • 시작 시점 y축 랜덤 수치 설정 후 좌표에 넣어주기
  • 생성 후 리스트에 넣기

4


2️⃣ main.py에 객체 생성 후 반복문으로 자동차 생성

3️⃣ 자동차가 움직이게 하는 함수 생성

  • 리스트에 생성된 자동차들을 for문으로 이동

5

  • main.py 반복문에 넣어주기


4️⃣ 만들어지는 자동차 수 조절하기

  • 6번 중 1번의 확률을 갖게끔 random_chance

6



Detect collision with car

main.py에 모든 자동차가 있는 리스트를 반복문 돌려서 간격이 20(거북이 20x20, 자동차 20x40)이하면 충돌로 감지

7



Detect when turtle reaches the other side

1️⃣ player.py에 끝지점 감지 메소드 생성

8


2️⃣ 끝까지 도달 후 다시 시작지점으로 가는 메소드

9


3️⃣ 끝까지 도달했을 때 속도 올리기

10


4️⃣ main.py에 적용



Create a scoreboard

1️⃣ Scoreboard 클래스 생성

11


2️⃣ main.py에 객체 생성


3️⃣ 플레이어의 레벨 증가 메소드 생성


4️⃣ 초기 속성에서 self.write를 따로 메소드로 분리

12


5️⃣ game_over메소드 생성 후 main.py에 넣어주기



Final code for main.py

import time
from turtle import Screen
from player import Player
from car_manager import CarManager
from scoreboard import Scoreboard

screen = Screen()
screen.setup(width=600, height=600)
screen.tracer(0)

player = Player()
car_manager = CarManager()
scoreboard = Scoreboard()

screen.listen()
screen.onkey(player.go_up, "Up")

game_is_on = True
while game_is_on:
    time.sleep(0.1)
    screen.update()

    car_manager.create_car()
    car_manager.move_cars()

    for car in car_manager.all_cars:
        if car.distance(player) < 20:
            game_is_on = False
            scoreboard.game_over()

    if player.is_at_finish_line():
        player.go_to_start()
        car_manager.level_up()
        scoreboard.increase_level()


screen.exitonclick()



Final code for player.py

from turtle import Turtle

STARTING_POSITION = (0, -280)
MOVE_DISTANCE = 10
FINISH_LINE_Y = 280


class Player(Turtle):
    def __init__(self):
        super().__init__()
        self.shape("turtle")
        self.penup()
        self.go_to_start()
        self.setheading(90)

    def go_up(self):
        self.forward(MOVE_DISTANCE)

    def go_to_start(self):
        self.goto(STARTING_POSITION)

    def is_at_finish_line(self):
        if self.ycor() > FINISH_LINE_Y:
            return True
        else:
            return False



Final code for car_manager.py

from turtle import Turtle

STARTING_POSITION = (0, -280)
MOVE_DISTANCE = 10
FINISH_LINE_Y = 280


class Player(Turtle):
    def __init__(self):
        super().__init__()
        self.shape("turtle")
        self.penup()
        self.go_to_start()
        self.setheading(90)

    def go_up(self):
        self.forward(MOVE_DISTANCE)

    def go_to_start(self):
        self.goto(STARTING_POSITION)

    def is_at_finish_line(self):
        if self.ycor() > FINISH_LINE_Y:
            return True
        else:
            return False



Final code for scoreboard.py

from turtle import Turtle

FONT = ("Courier", 24, "normal")


class Scoreboard(Turtle):
    def __init__(self):
        super().__init__()
        self.level = 1
        self.hideturtle()
        self.penup()
        self.goto(-280, 250)
        self.update_scoreboard()

    def update_scoreboard(self):
        self.clear()
        self.write(f"Level: {self.level}", align="left", font=FONT)

    def increase_level(self):
        self.level += 1
        self.update_scoreboard()

    def game_over(self):
        self.goto(0, 0)
        self.write(f"GAME OVER", align="center", font=FONT)