* Udemy의 PythonBootcamp 수업 내용을 참고하여 작성
지난 포스팅에 이어 파이썬 turtle을 활용하면서 더 고차원적인 함수들을 생성해볼 것이다.
지난 포스팅 : https://ysryuu.tistory.com/44
고차 함수와 이벤트 리스너
고차 함수 (Higher order function)
고차 함수란, 다른 함수와 함께 작동하는 함수이다.
아래 간단한 예시에서 calculator 함수는 func (더하기, 빼기, 나누기, 곱하기 등)을 숫자들과 함께 입력받아 해당 기능에 대해서 계산을 수행한다.
def add(n1, n2) :
return n1 + n2
def calculator(n1, n2, func):
return func(n1,n2)
result = calculator(2, 3, add)
print(result) # 5가 출력
이벤트 리스너 (Event listener)
이제 다음 예시를 보자.
turtle이 움직이는 방식을 키보드가 눌릴때, 10씩 앞으로 전진하도록 하는 코드는 아래와 같다.
아래 코드에서 listen() 메소드는 이벤트 리스너로 특정 이벤트가 발생할때에 해당 이벤트를 감지하고 작동하는 함수를 생성한다.
onkey() 메소드의 function 부분에 함수를 아규먼트로 받아서 사용한다.
from turtle import Turtle, Screen
tim = Turtle()
screen = Screen()
def move_forwards():
tim.forward(10)
screen.listen()
screen.onkey(key='space', fun= move_forwards) # 함수를 아규먼트로
screen.exitonclick()
Etch-a-Sketch 앱 만들기
앞서 언급한 고차함수 개념, 이벤트 리스너를 활용해서 다양하게 키보드로 turtle을 움직일 수 있는 Etch-a-Sketch 게임을 구현해보도록 하겠다.
from turtle import Turtle, Screen
tim = Turtle()
screen = Screen()
def move_forwards():
tim.forward(10)
def move_backwards():
tim.backward(10)
def turn_left():
new_heading = tim.heading() + 10
tim.setheading(new_heading)
def turn_right():
new_heading = tim.heading() - 10
tim.setheading(new_heading)
def clear():
tim.clear() # turtle이 그린 모든 것을 삭제
tim.penup()
tim.home() # 원점으로 돌아감
tim.pendown()
screen.listen()
screen.onkey(key='w', fun= move_forwards)
screen.onkey(key='s', fun= move_backwards)
screen.onkey(key='a', fun= turn_left)
screen.onkey(key='d', fun= turn_right)
screen.onkey(key='c', fun= clear)
screen.exitonclick()
객체 및 인스턴스 생성
이제 여러개의 turtle을 만들어보자.
다수의 작업을 반복 (객체 생성) 하기 위해서는 클래스를 활용할 수 있다. 클래스를 활용해
서로 독립적인 별개의 인스턴스 객체를 생성해 서로가 다른 속성을 가지도록, 다른 상태(State)에 있어 서로 경쟁할 수 있도록 경주 게임을 만들어 볼 것이다.
객체 vs 인스턴스
그 전에 객체와 인스턴스의 개념을 살펴보자.
객체 (Object)는 : 속성과 메서드로 구성된, 클래스에 의해 정의된 프로그램의 독립적인 단위이자 객체다. 자동차, 동물, 사람 등이 모두 객체가 될 수 있고 객체는 고유 속성을 가지는 물리적, 추상적인 모든 대상을 일컫는다.
인스턴스 (Instance) 는 : 특정한 클래스의 객체가 구체적으로 실체화 된 것을 말한다. 클래스라는 설계도에 따라서 생성된 것이 인스턴스이다. 클래스에서 생성된 객체를 그 클래스의 인스턴스라고 한다.
객체는 모든 인스턴스를 포괄하는 넓은 의미를 가지고, 인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조하는 개념으로 보면 된다.
거북이 경주 만들기 (Turtle Race)
1) 팝업창 띄워서 참가할 색깔 받기
from turtle import Turtle, Screen
tim = Turtle()
screen = Screen()
screen.setup(width=500,height=400) # 스크린의 크기 픽셀, 키워드 아규먼트
# 팝업창 메모 : 입력
user_bet = screen.textinput(title='Make your bet',prompt='Which turtle will wi the race? Enter a color: ')
print(user_bet)
screen.exitonclick()
2) 거북이를 출발선으로 이동
from turtle import Turtle, Screen
screen = Screen()
screen.setup(width=500,height=400) # 스크린의 크기 픽셀, 키워드 아규먼트
# 팝업창 메모 : 입력
user_bet = screen.textinput(title='Mae your bet',prompt='Which turtle will wi the race? Enter a color: ')
print(user_bet)
# 거북이 출발선으로
tim = Turtle(shape='turtle')
tim.penup()
tim.goto(x=-230, y=-100)
screen.exitonclick()
3) 여러 거북이 객체를 생성하고 출발선으로 이동
from turtle import Turtle, Screen
screen = Screen()
screen.setup(width=500,height=400) # 스크린의 크기 픽셀, 키워드 아규먼트
# 팝업창 메모 : 입력
user_bet = screen.textinput(title='Mae your bet',prompt='Which turtle will wi the race? Enter a color: ')
print(user_bet)
colors = ['red','orange','yellow','green','blue','purple']
turtles = []
# 거북이 출발선으로
for i in range(6) :
turtles.append(Turtle(shape='turtle'))
turtles[i].color(colors[i])
turtles[i].penup()
turtles[i].goto(x=-230, y= 100-30*i)
screen.exitonclick()
# 동일한 코드 : turtles 리스트 생성 없이 객체 생성
colors = ['red','orange','yellow','green','blue','purple']
y_position = [-70, -40, -10, 20, 50, 80]
# 거북이 출발선으로
for i in range(6) :
tim = Turtle(shape='turtle')
tim.color(colors[i])
tim.penup()
tim.goto(x=-230, y= y_position[i])
screen.exitonclick()
4) 거북이 레이싱
서로다른 State (위치, 색깔, 속도)의 거북이 인스턴스들이 경주하도록 게임을 만들기
from turtle import Turtle, Screen
import random
is_race_on = False # 꺼진 상태로 시작
screen = Screen()
screen.setup(width=500,height=400) # 스크린의 크기 픽셀, 키워드 아규먼트
# 팝업창 메모 : 입력
user_bet = screen.textinput(title='Mae your bet',prompt='Which turtle will wi the race? Enter a color: ')
colors = ['red','orange','yellow','green','blue','purple']
y_position = [-70, -40, -10, 20, 50, 80]
all_turtles = []
for i in range(6) :
new_turtle = Turtle(shape='turtle')
new_turtle.color(colors[i])
new_turtle.penup()
new_turtle.goto(x=-230, y= y_position[i])
all_turtles.append(new_turtle)
if user_bet : # user가 베팅할 경우
is_race_on = True
while is_race_on :
for turtle in all_turtles :
if turtle.xcor() > 230 :
is_race_on = False
winning_color = turtle.pencolor()
if winning_color == user_bet :
print(f'You\'ve won! the {winning_color} turtle is the winner!')
else :
print(f'You\'ve lost! the {winning_color} turtle is the winner!')
rand_distance = random.randint(0,10)
turtle.forward(rand_distance)
screen.exitonclick()
'Dev' 카테고리의 다른 글
[Python] 7. 클래스 상속 (1) | 2024.05.04 |
---|---|
[Python] 5. 뱀 게임 만들기 (1) (0) | 2024.05.04 |
[Python] 3. 파이썬 터틀 그래픽 (feat.모듈 사용) (0) | 2024.05.03 |
[Python] 2. 객체 지향 프로그래밍 (feat. OX 퀴즈 게임) (0) | 2024.05.03 |
[Python] 1. 기본 개발 프로그래밍 (feat. 커피머신 프로젝트) (0) | 2024.05.02 |