업무에 파이썬 활용할 줄 알기
Day22 | 중급 | 벽돌깨기의 시초, 퐁 게임 만들기 본문
Day22 | 중급 | 벽돌깨기의 시초, 퐁 게임 만들기
SEO 데이터분석가 2024. 1. 11. 16:5122일차 목표: 오늘 하루 작업할 것
which components would we need to write code for,
which components might fit well in its own separate class,
and how might we break down the logic of this game so that we can solve it piece by piece
which components you think could be separated into their own classes.
<My structure>
left(컴퓨터) vs. right(유저)
Ball, Scoreboard, Paddle
Ball) 공이 왔다갔다 해야함
Padle) 패들 움직임
Ball) 공과 패들이 만나면 공이 다시 반대편으로 튕겨져 나가기
Ball) 공이 패들을 지나쳐서 화면밖으로 나가면 게임 끝 > Scoreboard) 점수 갱신
이 문제를 풀고 다시 뱀게임으로 돌아가서 클래스 구성과 요소들이 각 클래스에서 어떻게 혼재되어있는지를 봐야겠다
→복습결과:
ball과 paddle의 상호작용, 그를 통해 scoreboard가 업데이트 되는것들이 각각의 클래스에 적용되는 건 아니다.
ball, paddle, scoreboard가 해야하는 행동들만 클래스에 적용이 되는 것이고
각 클래스 개체들의 상호작용은 main.py에서 거리나 위치요소들로 판단해준다
공 만들기 4. Create the ball and make it move
공의 움직임 4. Create the ball and make it move
패들 만들기 2. Create and move a paddle
왼쪽 패들 움직임 만들기 2. Create and move a paddle
오른쪽 패들 조작하기 3. Create another paddle
공이 패들에 튕겨져 나가도록 하기 6. Detect collision with paddle
스코어보드 만들기 8. Keep score
중간 라인 만들기 1. Create the screen
<Angela's structure>
1. Create the screen
2. Create and move a paddle
3. Create another paddle
4. Create the ball and make it move
5. Detect colliion with wall and bounce
6. Detect collision with paddle
7. Detect when paddle misses
8 Keep score
메인화면 구성하기
My solution
Angela's solution
from turtle import Screen
screen = Screen()
screen.setup(width=800, height=600)
screen.bgcolor("black")
screen.title("Pong")
screen.exitonclick()
키로 조작할 수 있는 패들 만들기
My solution
※주의사항: Screen.onkey()메서드에서 fun 매개변수에 함수를 적을 때는 () 제외하고 적어야함
추가 챌린지) 패들이 중앙에서 만들어져서 끝으로 가는 움직임을 보지 않으려면?
Screen.tracer(), Screen.update() 메서드 이용하기
Angela's solution
from turtle import Screen, Turtle
screen = Screen()
screen.setup(width=800, height=600)
screen.bgcolor("black")
screen.title("Pong")
screen.tracer(0)
paddle= Turtle(shape="square")
paddle.penup()
paddle.color("white")
paddle.shapesize(stretch_wid=5, stretch_len=1)
paddle.goto(x=350, y=0)
def go_up():
new_y = paddle.ycor() + 20
paddle.goto(paddle.xcor(), new_y)
def go_down():
new_y = paddle.ycor() - 20
paddle.goto(paddle.xcor(), new_y)
screen.listen()
screen.onkey(go_up, "Up")
screen.onkey(go_down, "Down")
game_is_on = True
while game_is_on:
screen.update()
screen.exitonclick()
Paddle 클래스를 만들고, 두 번째 패들 만들기
My solution
Ball 클래스를 만들고, 공 움직이기
오른쪽 상단으로 움직이게하기
공이 튕기는 로직 추가하기
위아래 모서리에 닿으면 튕겨나오게 하고
위아래 벽과 충돌 감지하기
충돌하면 공 움직임의 방향 변경하기
hint: consider creating two new attributes in the Ball class to track movement
My solution
if ball.ycor() = 290 or ball.ycor() = -290에서 왜 빨간줄이 쳐지지?
힌트를 활용못함..
Angela's solution
어렵다............................................단순히 y 방향만 역으로 변경해주기만 하면된다고 절대 생각못할 것 같다....
일단 초기세팅할 때부터 공이 그냥 단순히 우측 상단으로 향하도록 시작했는데.....
왼쪽/오른쪽 모서리에 닿으면 지나가게
패들이 공을 받아냈는지 알아내기
패들이 세로로 길기 때문에 공과 패들사이의 거리가 일정하지 않다
그렇기 때문에 ball의 x좌표를 함께 조건에 추가해준다: '패들이 위치한 x좌표보다 넘어가면'
패들이 공을 놓쳤는지 알아내기
ball이 스크린의 좌우 경계선을 넘어가면 볼의 위치를 중앙으로 리셋
다른 플레이어를 향해 움직이도록 한다
R paddle이 공을 놓쳤을 때 L paddle의 점수를 더해주고
L paddle이 공을 놓쳤을 때 R paddle의 점수를 더해주기 위해 각각 따로 함수를 작성해야함
점수를 기록하고, 공의 속도 올리기
점수 기록
공의 속도 올리기
오잉 왜 turtle.speed로 조절하지 않고, time.sleep(숫자) 메서드의 '숫자'로 조절하는거지?
time.sleep의 역할을 아직도 잘 모르겠다.........
아 공이 한발자국씩 움직일 때마다 timesleep을 줬던거니까, 이 시간을 줄임으로서 공의속도를 조절할 수 있는거구나~~~~~~
'Python > [Udemy] 100개의 프로젝트로 Python 개발 완전 정복' 카테고리의 다른 글
Day24 | 파일과 디렉토리, 경로 (0) | 2024.01.18 |
---|---|
Day23 | 중급 | 터틀 크로싱 프로젝트 (0) | 2024.01.17 |
Day21 | 중급 | 뱀 게임 만들기 2편: 클래스 상속 & 리스트 슬라이싱 (2) | 2024.01.08 |
Day20 | 중급 | 뱀 게임 만들기 1편: 애니메이션 & 좌표 (0) | 2024.01.04 |
Day19 | 중급 | 인스턴스, 상태 및 고차함수 (0) | 2024.01.03 |