[네이버 부스트코스]프로그래밍 기초(ft. 파이썬) 9차시: 객체의 생성과 속성
1.객체 (object)로 블랙잭 카드 게임 만들기
2.객체 (object)로 애니메이션 만들기
블랙젝
블랙잭 게임은 총 52장으로 이루어진 플레잉 카드를 사용합니다.
각각의 카드는 무늬와 끗수를 가지고 있습니다.
무늬 (suit)
- 클럽
- 스페이드
- 하트
- 다이아몬드
끗수 (face)
- 2
- 3
- ...
- 10
- J (Jack)
- Q (Queen)
- K (King)
- A (Ace)
블랙잭 게임에서는 각 카드가 값(value)을 하나씩 가집니다.
숫자 카드는 카드의 끗수가, A카드는 11, J,Q,K 카드는 10이 카드의 값입니다.
각각의 카드는 (끗수, 무늬, 값) 튜플로 표현할 수 있습니다.
카드 튜플 card에서 card[0]은 카드의 끗수를, card[1]은 무늬를, card[2]는 카드의 값을 의미합니다.
처음에 2장의 카드를 받고 카드를 한장 씩 더 받을지 그만 받을지 선택합니다.
승리 조건
* 보유한 모든 카드의 값이 상대방보다 21에 가까우면 게임에서 이깁니다.
* 보유한 모든 카드의 값이 21보다 크면 게임에서 집니다.
블랙잭 게임 인터페이스
튜플로 표현한 카드
자신이 가지고 있는 카드들의 값을 합해 봅시다.
def hand_value(hand):
total = 0
for card in hand:
total += card[2]
return total
카드의 내용을 출력해봅시다.
def card_string(card):
article = "a "
if card[0] in [8, "Ace"]:
article = "an "
return article + str(card[0]) + " of " + card[1]
카드를 튜플로 표현하면 다음과 같은 실수를 할 수 있습니다.
- card[2]는 무엇을 의미하나요? card[1]과 의미가 헷갈리면 어떡하죠?
- 실수로 ("Ace", "Spades", 5)라는 튜플을 만들면 어떻게 되나요?
객체로 표현한 카드
카드를 표현하기 위한 새로운 객체 타입을 만들어봅시다.
Card 객체는 끗수, 무늬, 값을 속성 (Attribute) 으로 가집니다.
class Card(object): """A Blackjack card.""" pass c = Card() # Create Card object c.face = "Ace" # Set attributes of the card c.suit = "Spades" c.value = 11
c 객체의 형태는 사용자가 정의한 Card 입니다.
자신이 가지고 있는 카드들의 값을 합해봅시다.
def hand_value(hand): total = 0 for card in hand: total += card.value return total
카드의 내용을 출력해봅시다.
def card_string(card): article = "a " if card.face in [8, "Ace"]: article = "an " return article+str(card.face)+" of "+card.suit
카드를 객체로 표현하면 다음 실수들을 방지할 수 있습니다.
- card[2]는 무엇을 의미하나요? card[1]과 의미가 헷갈리면 어떡하죠?
- 실수로 ("Ace", "Spades", 5)라는 튜플을 만들면 어떻게 되나요?
두 개 이상의 카드
Card 클래스를 이용해서 여러 카드들을 만들 수 있습니다.
가변 객체
튜플과 Card 객체의 큰 차이점 중 하나는
튜플은 불변 객체이고, Card 객체는 가변 객체라는 점입니다.
함수는 객체이다
함수 역시 객체입니다.
함수의 인자로 함수를 사용할 수 있습니다.
def print_table(func, x0, x1, step): x = x0 while x <= x1: print(x, func(x)) x += step print_table(f, -math.pi, 3 * math.pi, math.pi/8)
#2. 객체 (object)로 애니메이션 만들기
객체: 상태와 동작
지금까지 우리는 여러 종류의 객체를 사용했습니다.
: 튜플, 문자열, 로봇, 이미지, 원이나 사각형 등의 그래픽 객체
객체는 상태(State)를 가지고 있고, 동작(Action)을 수행할 수 있습니다.
Robot: 로봇의 상태는 로봇의 위치, 방향, 들고 있는 비퍼의 갯수 정보를 가지고 있습니다.
로봇은 움직임, 회전, 비퍼 줍기/들어올리기, 그리고 로봇의 상태를 파악하는 동작이 가능합니다.
Circle: 반지름, 위치, 깊이, 외곽선 색, 채워진 색 정보를 상태로 가지고 있습니다.
색 변경, 크기 변경, 위치 변경 등의 동작이 가능합니다.
Picture: 사진의 가로 길이, 세로 길이, 각 픽셀의 색 정보를 상태로 가지고 있습니다.
각 픽셀의 색을 읽거나, 변경하는 동작이 가능합니다.
닭 가족의 여행
위 애니메이션은 2010년도 신입생인 유정은, 송금현 학생의 작품입니다.
이 애니메이션은 3개의 레이어 객체를 사용하고 있습니다 (닭, 병아리1, 병아리2).
닭과 병아리는 모두 몸통, 날개, 눈, 부리를 가지고 있습니다.
닭은 벼슬을 가지고 있지만, 병아리는 벼슬이 없습니다.
닭과 병아리의 생김새는 거의 비슷합니다.
닭과 병아리의 차이점은 닭이 더 크고, 하얀색이고, 벼슬을 가지고 있다는 점입니다.
복사해서 붙여 넣기
비슷한 객체들을 간단하게 만드는 방법 중 하나는
코드를 작성하고 그 코드를 복사해서 여러 번 붙여 넣는 것입니다.
이 방법은 큰 단점을 가지고 있습니다
: 코드에 버그가 있어서 고쳐야 할 때, 복사했던 모든 코드 역시 고쳐야 합니다.
동일한 코드가 어디에 있는지 파악하기 위해서는 시간과 노력을 많이 기울여야 합니다.
닭을 하나의 클래스로 만들어봅시다.
class Chicken(object): """Graphic representation of a chicken.""" pass
Chicken 객체는 레이어, 몸통, 날개, 눈, 부리를 속성으로 가지게 됩니다.
Chicken 객체
함수 make_chicken()은 (0,0) 위치에 Chicken 객체를 만듭니다.
def make_chicken(hen = False): layer = Layer() if hen: body = Ellipse(70,80) body.setFillColor("white") else: body = Ellipse(40,50) body.setFillColor("yellow") body.move(0, 10) body.setBorderColor("yellow") body.setDepth(20) layer.add(body) # similar for wing, eye, beak, dots
함수 make_chicken()은 (0,0) 위치에 Chicken 객체를 만듭니다.
객체의 생성이 끝나면 해당 객체를 반환합니다.
def make_chicken(hen = False): # ... see previous page ch = Chicken() ch.layer = layer ch.body = body ch.wing = wing ch.eye = eye # return the Chicken object return ch
Chicken 객체 사용하기
Chicken 객체는 객체의 속성을 (예. chick1.layer) 이용해서 움직일 수 있습니다.
hen = make_chicken(True) chick1 = make_chicken() chick1.layer.move(120, 0) herd = Layer() herd.add(hen.layer) herd.add(chick1.layer) herd.move(600, 200) chick2 = make_chicken() chick2.layer.move(800, 200)
Chicken 객체도 비슷하게 바꿔봅시다.
객체에 생성자를 추가하고, 객체를 움직이는 멤버 함수를 만들어 봅시다.
class Chicken(object): """Graphic representation of a chicken.""" def __init__(self, hen = False): layer = Layer() # make all the parts self.layer = layer self.body = body self.wing = wing self.eye = eye def move(self, dx, dy): self.layer.move(dx, dy)