이번엔 turtle graphics 을 사용하여 길 건너기 게임을 만들어보자.
화면 중앙 가장 하단부분에서 거북이가 최상단 까지 위쪽 방향키에 맞춰 이동할 것이다.
이동하는 도중에 화면 오른쪽에서 왼쪽 방향으로 무수히 많은 랜덤한 색깔 자동차들이 지나갈 것이다.
우리는 거북이를 조작하여 자동차에 치이지 말고 이동시키면 된다.
정상에 도달하면 Level 을 1 증가시키고 자동차들의 속도를 올린다.
이런식으로 게임을 진행할 것이다.
이번에도 역시 자동차 관련 내용을 다룰 car_manager.py, 거북이를 다룰 player.py, 점수판을 다룰 scoreboard.py
그리고 게임 내용을 다룰 main.py 로 파일을 구분지어 진행할 것이다.
먼저 player.py 이다.
먼저 거북이의 시작 위치를 나타낼 STARTING_POSITIONS 와 이동 속도인 MOVE_DISTANCE, 목표지점의 y 좌표인 FINISH_LINE_Y 를 설정한다.
그리고 Player class를 설정하고 Turtle을 상속받는다. ( 잊지말자 super().__init__() )
모양은 turtle, pen은 penup(), 그리고 go_to_start() 함수를 실행하고, 북쪽으로 방향을 설정하도록 setheading(90) 을
한다.
이제 위에서 실행하도록 만든 go_to_start() 함수와 go_up() 함수를 선언하자.
go_up() 함수는 main.py 에서 방향키에 연결할 것이기 떄문에 MOVE_DISTANCE 만큼 forward 하도록 선언한다.
go_to_start() 함수는 시작점으로 이동하도록 goto(STARTING_POSITIONS) 을 한다.
그리고 is_at_finish_line() 함수를 선언하여 FINISHING_LINE_Y 에 도달하면 True 값을, 아닐 경우엔 False 값을 준다.
이는 scoreboard.py에서 level 조작할 때 연결 지을 것이다.
이제 자동차를 다룰 car_manager.py이다.
역시 자동차들의 기본 세팅을 해준다.
자동차들의 색을 무작위로 끌어낼 COLORS list 를 설정한다.
1단계 자동차 이동 속도는 STARTING_MOVE_DISTANCE, 단계 상승 속도 증가는 MOVE_INCREMENT 로 설정한다.
이제 CarManager class를 생성한다.
이 때, 무작위로 생성되는 자동차들을 관리할 list 로 all_cars 라는 빈 list를 선언하고, 자동차 속력을 car_speed로 STARTING_MOVE_DISTANCE 를 넘긴다.
자동차를 생성하는 create_cars() 함수도 선언한다.
이 때 랜덤한 속도로 화면 가장 오른쪽에서 출현하도록 설정할 것이다.
여기서 랜덤한 속도를 지정해줘야하는데,
이는 random_chance라는 변수가 random.randint(1 ,4)의 결과로 1일 때 자동차를 생성하도록 할 것이다.
즉, 1부터 3까지의 랜덤값이 1일 될 경우, if 문 안에 있는 코드를 통해 자동차들 new_car 를 생성한다는 뜻이다.
장애물 역할을 할 자동차들이 만들어졌으니 이제 그 자동차들을 이동시킬 함수 move_cars 를 선언하자.
우리가 new_cars 를 선언했을 때의 머리는 화면오른쪽 즉 setheading(0) 인 상태이다.
그렇게 때문에 오른쪽에서 왼쪽으로 이동하니까 car.backward(STARTING_MOVE_DISTANCE) 으로 이동시킨다.
마지막으로 플레이어 거북이가 목표 지점에 도착하면 다음 단계로 넘어가고 자동차의 속도가 높아지는데 이와 관련된 함수 level_up() 을 선언한다.
기본적으로 설정했던 car_speed에 MOVE_INCREMENT 만큼 추가해준다.
이제 현재 레벨를 화면에 나타내주고, 게임이 종료되면 game over 를 출력할 scoreboard.py 이다.
scoreboard.py는 구현할 항목이 별로 많지 않다.
먼저 레벨을 나타낼 세팅부터 초기화하자.
역시 Turtle 을 상속받는다. 초기 level은 1, 색은 Blue, 위치는 좌측상단으로 한다.
level 이 올랐을 때, 사용할 함수 increase_level(), 과 update_level() 을 만든다.
increase_level() 은 간단하다. 초기화 때 선언했던 level 에 1을 증가시킨 후, update_level() 을 호출한다.
update_level() 가 호출되면 기존의 있던 scoreboard 는 초기화되고 새롭게 기입을 해주기 위해 처음 초기화 했을 때와 같이 write 을 사용한다.
게임이 종료되었을 때 사용할 함수 game_over() 도 만들자.
이때 이 문구는 화면 중앙에서 띄울거라 (0, 0)으로 이동시킨다.
이제 마지막 main.py 차례이다.
먼저 앞서 만들었던 파일들에서 각각 CarManager, Player, Scoreboard 클래스를 불러온다.
( 이들은 각각 car_manager, player, scoreboard 변수로 지정한다. )
그리고 Screen 을 통해 화면을 준비한다.
마찬가지로 Screen.trace(0) 을 통해 화면 출력 시점을 조절한다. ( 나중에 Screen.update() 로 불러온다. )
자동차를 이동시킬 방향키를 선언하자.
screen.listen() 을 통해 세팅준비를 하고, screen.onkey(player.go_up, "Up") 을 통해 만들어둔 메소드와 방향키를 연결시킨다.
게임 진행여부를 저장할 game_is_on 변수를 boolean 값 True 로 설정한다.
이제 while 문을 통해 게임을 진행하자.
우리는 screen 이 생성되자마자 게임을 진행시키보다 아주 작간 delay 를 줄 것이다. ( time.sleep(0.04) )
그리고 자동차를 만들고 이동시킬 것이다. ( create_cars(), move_cars() )
이제 충돌 관련 내용을 작성하자.
만들어놨던 모든 자동차들 중 어느하나 car 라도 player 와의 거리가 20 미만이면,
scoreboard.game_over() 를 호출하고 game_is_on 을 False 로 전환하여 while 문을 중단시킨다.
마지막으로 player 거북이가 목표 지점, is_at_finish_line() 에 도달했을 때,
player 는 다시 시작 지점으로 보내고, ( go_to_start() )
scoreboard 에 레벨을 올리고, ( scoreboard.increase_level() )
car 의 속도를 올린다. ( car_manager.level_up() )
'Studying > Python' 카테고리의 다른 글
21. miniProject(11) - miles / km 변환기 (feat. tkinter) (0) | 2022.08.09 |
---|---|
20. miniProject(10) - 미국 states 퀴즈 (feat. turtle, pandas) (0) | 2022.07.29 |
18. miniProject(8) - 뱀 게임 2 (feat. turtle) (0) | 2022.07.28 |
17. miniProject(8) - 뱀 게임 1 (feat. turtle) (0) | 2022.07.28 |
16. miniProject(7) - 거북이 경주 게임 (feat. turtle) (0) | 2022.07.28 |