일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- HTTP
- 파이썬
- Sheety
- HTML
- API플랫폼
- ndarray
- twilio
- 상태코드
- Tequila
- udemy
- 웹페이지
- 오류
- SMTP
- class
- 유데미
- 게임
- Python
- 프로그램
- 프로젝트
- Game
- phython
- 계산기
- API
- 부트스트랩
- 최저가
- 파싱
- Pygame
- Endpoint
- 웹크롤링
- 쉬티
- Today
- Total
데이터 분석가
파이썬 퐁 게임(PongGame) 프로젝트 본문
안녕하세요
이번 시간은 저번 시간에 이어 게임을 만들어 보겠습니다
아래는 참고 자료입니다 참고 자료를 바탕으로
main.py를 작성해봅시다 !
이 게임은 Pong Game이라고 불리는데 과거에 정말 유명한 pub 게임이었는데 해보신 분이 있을까요??
main 파일을 만들기 위해
1. paddle.py
2. ball.py
3. scoreborad.py
4. main.py
순으로 만들어 보겠습니다.
1.paddle.py
paddle이란 배를 젓는 도구인 '노'를 뜻하는데요, 이 게임에서는 양쪽에 있는 흰색 바를 뜻합니다
from turtle import Turtle
class Paddle(Turtle): #부모 클래스로부터 메소드(함수)를 가져옵니다
def __init__(self, position):
super().__init__()
self.shape("square")
self.color("white")
self.shapesize(stretch_wid=5, stretch_len=1)
self.penup() #펜 허용
self.goto(position) #위치 이동
def go_up(self): #막대의 위로 움직임
new_y = self.ycor() + 20 #ycor() y축 위로 이동
self.goto(self.xcor(), new_y) #위 new_y y축 이동을 +20씩 증가하여 갱신
def go_down(self): #막대의 아래 움직임
new_y = self.ycor() - 20 #ycor() y축 아래로 이동
self.goto(self.xcor(), new_y) #위 new_y y축 이동을 -20씩 증가하여 갱신
class Paddle(Turtle): 은 부모 클래스(Turtle)로부터 빌려옵니다
가져온 내부 변수들을 수정합니다.
막대 사이즈 shapesize(stretch_wid=5, stretch_len=1) 높이 5칸, 너비 1칸 설정
def go_uo(self):
paddle 막대의 위로 움직임을 갱신합니다. 방향키 한번에 y축을 +20 만큼 위로 올라갑니다
def go_down(self):
paddle 막대의 아래로 움직임을 갱신합니다. 방향키 한번에 y축을 -20 만큼 아래로 내려갑니다
2.ball.py
from turtle import Turtle
class Ball(Turtle): #부모 클래스 Turtle로부터 메소드를 빌려온다
def __init__(self):
super().__init__()
self.color("white")
self.shape("circle")
self.penup()
self.x_move = 3 #x축의 움직임
self.y_move = 3 #y축의 움직임
self.move_speed = 0.1 #공의 움직임 속도
def move(self):
new_x = self.xcor() + self.x_move
new_y = self.ycor() + self.y_move
self.goto(new_x, new_y)
def bounce_y(self):
self.y_move *= -1 #위 아래 벽에 부딪혔을 경우 반대 방향으로 움직임(수직방향)
def bounce_x(self):
self.x_move *= -1 #왼쪽 오른쪽 막대에 부딪혔을 경우 반대 방향으로 움직임(수평)
self.move_speed *= 0.9 #속도는 10% 만큼 빨라집니다
def reset_position(self): #공의 설정을 초기화
self.goto(0, 0) #공이 양쪽 x축 범위를 벗어났을 경우
self.move_speed = 0.1 #원래 속도 0.1으로 복구
self.bounce_x() #
def __init__(self): 움직이는 공을 설정합니다.
def move(selft): 공의 x,y 축 좌표를 각각 +=3씩 증가시키며 이동시킵니다
def bounce_y(self): y축은 위, 아래에 벽인데 벽에 닿을 경우 y축에 -1을 곱하여 반사시킵니다
def rset_position(self): 공이 x축에서 막대에 부딪히지 않고 관통하여 넘어간 경우,
정 중앙 (0, 0) 위치시키고, 공의 속도를 원래대로 초기화 합니다.
3.scoreboard.py
게임의 결과를 바탕으로 점수를 갱신합니다 !
자고로 게임은 내기를 안하면 재미 없죠
from turtle import Turtle
class Scoreboard(Turtle):
def __init__(self):
super().__init__()
self.color("white")
self.penup()
self.hideturtle()
self.l_score = 0
self.r_score = 0
self.update_scoreboard() #기존 점수는 초기화
class Scoreboard(Turtle): 부모 클래스 Turtle로부터 메소드를 가져오고
l_score(왼쪽 사용자 스코어), r_score(오른쪽 사용자 스코어) 는 각각 0점부터 시작하고
점수판은 갱신됩니다. 그리고 기존에 있던 점수는 초기화 됩니다.
def update_scoreboard(self):
self.clear()
self.goto(-100, 200)
self.write(self.l_score, align="center", font=("Courier", 80, "normal"))
self.goto(100, 200)
self.write(self.r_score, align="center", font=("Courier", 80, "normal"))
def l_point(self):
self.l_score += 1
self.update_scoreboard()
def r_point(self):
self.r_score += 1
self.update_scoreboard()
def update_scoreboard(self):
왼쪽 사용자의 점수판은 (-100, 200)에 위치시킵니다
오른쪽 사용자 점수판은 (100, 200)에 위치시킵니다
def l_point(self):
왼쪽 사용자가 1점을 획득하고 이를 업데이트 시킵니다.
def r_point(self):
오른쪽 사용자가 1점을 획득하고 이를 업데이트 시킵니다
4.main.py 부모 클래스 Turtle을 가지고 있는 파일.
자 드디어 메인 코드 파일을 작성 해봅시다.
from turtle import Screen, Turtle
from paddle import Paddle
from ball import Ball
from scoreboard import Scoreboard
import time
screen = Screen() #화면 불러오기
screen.bgcolor("black") #배경 검은색
screen.setup(width=800, height=600) #화면 너비 높이 설정
screen.title("Pong") #화면 텝의 제목 "Pong"
screen.tracer(0) #애니메이션 제거
r_paddle = Paddle((350, 0)) #오른쪽 막대 좌표
l_paddle = Paddle((-350, 0)) #왼쪽 막대 좌표
ball = Ball() #볼 추가
scoreboard = Scoreboard() #점수판 불러오기
screen.listen() #키보드 조작 명령어
screen.onkey(r_paddle.go_up, "Up") #오른쪽 사용자의 위
screen.onkey(r_paddle.go_down, "Down") #오른쪽 사용자의 아래
screen.onkey(l_paddle.go_up, "w") #왼쪽 사용자의 위
screen.onkey(l_paddle.go_down, "s") #왼쪽 사용자의 아래
1. paddle.py
2.ball.py
3.scoreboard.py
를 차례대로 불러오고
time은 동작 지연 함수로 처리 속도를 설정할 수 있습니다
game_is_on = True
while game_is_on:
time.sleep(0.1)
screen.update() #화면 최신화하면 tracer 작동
ball.move()
if ball.ycor() > 280 or ball.ycor() < -280:
ball.bounce_y()
if ball.distance(r_paddle) < 50 and ball.xcor() > 320 or ball.distance(l_paddle) < 50 and ball.xcor() < -320:
ball.bounce_x()
if ball.xcor() > 380:
ball.reset_position()
scoreboard.l_point()
if ball.xcor() < -380:
ball.reset_position()
scoreboard.r_point()
screen.exitonclick()
while game_is_on:
게임을 지속시키는 반복문으로 이번 시간에는 false를 반환하는 문구가 없고
screen.exitonclick()가 있는데 게임 배경을 클릭함으로써 종료 시킬 수 있습니다
import Time을 불러 왔었으므로 time.sleep(0.1)을 설정합니다.
이는 while 문을 반복할때마다 0.1초씩 지연 후 진행합니다.
if ball.ycor() > 280 or ball.ycor() < -200:
ball 메소드에서 y축을 위 아래를 벽이라고 설명을 했었는데 이 아래, 위 '벽'에 닿으면 튕겨 나갑니다.
if ball.distance(r_paddle) < 50 and ball.xcor() > 320 or ball.distance(l_paddle) < 50 and ball.xcor() < -320:
조건이 상당히 긴데, 오른쪽 사용자의 막대(노)에 닿거나 왼쪽 사용자의 막대(노)에 닿으면,
x축 방향의 반대방향으로 튕겨 나갑니다.
if ball.xcor() > 380:
x축은 800사이즈 인데 공의 크기 20을 제외하여, 공이 막대에 부딪히지 않고 오른쪽으로 넘어갈 경우
왼쪽 사용자가 1점을 얻고 이를 갱신합니다.
if ball.xcor() < -300:
위 설명과 마찬가지로 공이 막대에 부딪히지 않고 왼쪽으로 넘어갈 경우 오른쪽 사용자가 1점을 얻고
점수판은 갱신됩니다.
최대한 설명을 잘 하려고 적긴 했는데 설명이 충분했는지는 모르겠네요..
이번 시간에는 공이 막대에 부딪히면 부딪힌 방향의 반대쪽으로 튕기는 것을 표현하는게 관건이었던거 같네요
여기서 조금만 더 나아가면 디펜스 같은 게임도 구현할 수 있을거 같습니다 !
한번씩 생각하면서 도전해 봅시다 !
'파이썬(python) 프로젝트 모음' 카테고리의 다른 글
파이썬(Python) 생일 축하 이메일 보내기(Smtp) (0) | 2023.04.04 |
---|---|
파이썬 마일변환기 GUI 인터페이스 구현 프로젝트 (0) | 2023.04.03 |
파이썬 뱀 게임(Snake game) Turtle Game 프로젝트 (0) | 2023.03.29 |
파이썬(Python) 거북이 경주(turtle race) 프로젝트 (0) | 2023.03.28 |
파이썬(Python) 스피로 그래프 & Spot painting (0) | 2023.03.28 |