Python/Chapter11. 틱택토, 객체지향프로그래밍

lullaby ·2025년 10월 1일

Python

목록 보기
11/13
post-thumbnail

1. Tic-Tac-Toe 게임 프로그래밍

핵심 개념

  • 2차원 리스트를 활용한 게임 보드 표현
  • 반복문과 조건문을 활용한 게임 로직 구현
  • 랜덤 함수를 활용한 컴퓨터 플레이어 구현
  • 승리 조건 확인 로직

주요 코드 구조


python
# 게임 초기화
me = input("Tic-Tac_Toe게임입니다. 원하는 기호를 O, X 중에서 선택하시오 : ")
if me == "X":
    com = "O"
else:
    com = "X"
board = [[' ' for x in range(5)] for y in range(5)]# 5x5 게임 보드 생성
result = ""
import random

# 게임 루프
while True:
# 현재 보드 상태 출력
    for r in range(5):
        print(" "+board[r][0]+"| "+board[r][1]+"| "+board[r][2]+"| "+board[r][3]+"| "+board[r][4])
        if (r!=4):
            print("---|---|---|---|---")

# 게임 종료 확인
    if result == "win_me":
        print("당신이 컴퓨터를 이겼습니다.")
        break
    elif result == "win_com":
        print("컴퓨터가 당신을 이겼습니다.")
        break

# 사용자 입력 받기
    x = int(input("(0 ~ 4)사이의 x좌표를 입력하시오:"))
    y = int(input("(0 ~ 4)사이의 y좌표를 입력하시오:"))

# 입력 위치 확인
    if board[x][y] != ' ':
        print("잘못된 위치입니다.")
        continue
    else:
        board[x][y] = me

# 컴퓨터 차례
    while True:
        a = random.randrange(0, 5)# 0 이상 5 미만의 랜덤 숫자
        b = random.randrange(0, 5)# 0 이상 5 미만의 랜덤 숫자
        if board[a][b] == ' ':
            board[a][b] = com
            break

# 승리 조건 확인 (수직, 수평, 대각선)# 수직 패턴 확인
    ver0 = []
    ver1 = []
    ver2 = []
    ver3 = []
    ver4 = []
    for i in range(5):
        ver0.append(board[i][0])
    for i in range(5):
        ver1.append(board[i][1])
    for i in range(5):
        ver2.append(board[i][2])
    for i in range(5):
        ver3.append(board[i][3])
    for i in range(5):
        ver4.append(board[i][4])

# 수평 패턴 확인
    hori0 = []
    hori1 = []
    hori2 = []
    hori3 = []
    hori4 = []
    for i in range(5):
        hori0.append(board[0][i])
    for i in range(5):
        hori1.append(board[1][i])
    for i in range(5):
        hori2.append(board[2][i])
    for i in range(5):
        hori3.append(board[3][i])
    for i in range(5):
        hori4.append(board[4][i])

# 대각선 패턴 확인
    dia0 = []
    dia1 = []
    for i in range(5):
        dia0.append(board[i][i])
    for i in range(5):
        dia1.append(board[i][4-i])

# 승리 조건 검사
    w_m = [me, me, me, me, me]# 사용자 승리 패턴
    w_c = [com, com, com, com, com]# 컴퓨터 승리 패턴

    if ((ver0 == w_m) or (ver1 == w_m) or (ver2 == w_m) or (ver3 == w_m) or (ver4 == w_m) or
        (hori0 == w_m) or (hori1 == w_m) or (hori2 == w_m) or (hori3 == w_m) or (hori4 == w_m) or
        (dia0 == w_m) or (dia1 == w_m)):
        result = "win_me"
    elif ((ver0 == w_c) or (ver1 == w_c) or (ver2 == w_c) or (ver3 == w_c) or (ver4 == w_c) or
          (hori0 == w_c) or (hori1 == w_c) or (hori2 == w_c) or (hori3 == w_c) or (hori4 == w_c) or
          (dia0 == w_c) or (dia1 == w_c)):
        result = "win_com"

2. 객체 지향 프로그래밍

핵심 개념

  • 객체(Object): 상태(인스턴스 변수)와 동작(메소드)을 가진 요소
  • 클래스(Class): 객체의 설계도
  • 인스턴스(Instance): 클래스로부터 만들어진 객체
  • 인스턴스 변수: 객체의 상태를 나타내는 변수(self.변수명)
  • 메소드(Method): 객체의 동작을 정의하는 함수
  • 캡슐화(Encapsulation): 데이터와 알고리즘을 하나로 묶는 것

클래스 구조

class 클래스이름:
    def 메소드1(self, 매개변수들):
# 메소드 내용
        self.인스턴스변수 =def 메소드2(self, 매개변수들):
# 메소드 내용

객체 생성 및 사용

객체변수 = 클래스이름()# 객체 생성
객체변수.메소드()# 메소드 호출

Counter 클래스 예제


python
class Counter:
    def reset(self):
        self.count = 0

    def increment(self):
        self.count += 1

    def get(self):
        return self.count

# 사용 예시
a = Counter()
a.reset()
a.increment()
print("카운터 a의 값은", a.get())# 카운터 a의 값은 1
print("카운터 a의 값은", a.count)# 카운터 a의 값은 1# 두 개의 독립적인 객체 생성
b = Counter()
a.reset()
b.reset()
a.increment()
print("카운터 a의 값은", a.get())# 카운터 a의 값은 1
print("카운터 b의 값은", b.get())# 카운터 b의 값은 0

객체 지향 프로그래밍의 장점

  1. 생산성 향상: 잘 설계된 클래스 재사용
  2. 자연적인 모델링: 일상 개념을 프로그래밍으로 표현
  3. 유지보수 용이성: 수정 및 기능 추가가 쉬움
  4. 캡슐화: 데이터와 함수를 하나로 묶어 관리

기말고사 예상 문제

객관식 문제

  1. 파이썬에서 객체는 다음 중 무엇으로 구성되는가?
    a) 함수와 변수
    b) 인스턴스 변수와 메소드
    c) 클래스와 상속
    d) 속성과 프로퍼티
  2. 다음 중 객체지향 프로그래밍의 장점이 아닌 것은?
    a) 생산성 향상
    b) 자연적인 모델링
    c) 유지보수의 용이성
    d) 메모리 사용량 감소
  3. 파이썬에서 클래스의 메소드를 정의할 때 첫 번째 매개변수로 주로 사용되는 것은?
    a) cls
    b) self
    c) this
    d) method
  4. 객체지향 프로그래밍에서 데이터와 알고리즘을 하나로 묶고 공용 인터페이스만 제공하고 구현 세부 사항을 감추는 것을 무엇이라고 하는가?
    a) 추상화
    b) 다형성
    c) 캡슐화
    d) 상속
  5. Tic-Tac-Toe 게임 프로그래밍에서 게임판(board)을 초기화하는 코드로 올바른 것은?
    a) board = [' ' for x in range(5)]
    b) board = [[' ' for x in range(5)]]
    c) board = [[' ' for x in range(5)] for y in range(5)]
    d) board = [for x in range(5) for y in range(5)]

단답형 문제

  1. 객체지향 프로그래밍에서 클래스로부터 만들어지는 각각의 객체를 무엇이라고 하는가?
  2. 파이썬에서 인스턴스 변수를 생성하려면 메소드 안에서 어떤 키워드를 변수 앞에 붙여야 하는가?
  3. Tic-Tac-Toe 게임에서 컴퓨터가 랜덤한 위치에 표시를 하기 위해 사용하는 파이썬 모듈은 무엇인가?
  4. 객체지향 프로그래밍에서 기존 클래스의 기능을 확장하여 새로운 클래스를 만드는 기법을 무엇이라고 하는가?
  5. Tic-Tac-Toe 게임에서 승리 조건을 확인하기 위해 사용되는 패턴의 세 가지 종류는 무엇인가?

코드 분석 문제

  1. 다음 코드의 실행 결과는 무엇인가?

python
class Counter:
    def reset(self):
        self.count = 0
    def increment(self):
        self.count += 1
    def get(self):
        return self.count

a = Counter()
a.reset()
a.increment()
a.increment()
print("카운터 a의 값은", a.get())
  1. 다음 Tic-Tac-Toe 게임 코드에서 빈칸에 들어갈 올바른 코드는?

python
# 대각선 패턴 win append
dia0 = []
dia1 = []
for i in range(5):
    dia0.append(board[i][i])
for i in range(5):
    _________________# 이 부분에 들어갈 코드는?

코드 작성 문제

  1. 아래 Counter 클래스를 완성하되, 다음 요구사항을 만족시키시오:
    • reset() 메소드: count를 0으로 초기화
    • increment() 메소드: count를 1 증가
    • decrement() 메소드: count를 1 감소 (단, 0보다 작아지지 않도록)
    • get() 메소드: 현재 count 값 반환

python
class Counter:
# 코드를 작성하시오
  1. Tic-Tac-Toe 게임에서 사용자의 입력을 받아 보드에 표시하는 코드를 작성하시오. 이미 표시된 위치에는 중복해서 표시할 수 없어야 합니다.
  2. 객체지향 프로그래밍 개념을 이용하여 간단한 TV 클래스를 설계하고 구현하시오. TV 클래스는 다음 속성과 메소드를 가져야 합니다:
    • 속성: 채널번호, 볼륨, 전원상태
    • 메소드: 켜기, 끄기, 채널 변경하기, 볼륨 변경하기

서술형 문제

  1. 객체지향 프로그래밍의 주요 특징과 장점을 세 가지 이상 설명하시오.
  2. Tic-Tac-Toe 게임에서 승리 조건을 확인하는 방법에 대해 설명하고, 코드로 구현하는 방법을 서술하시오.
  3. 파이썬에서 "모든 것이 객체"라는 말이 의미하는 바를 설명하고, 예시를 들어 서술하시오.

종합 문제

  1. 객체지향 방법론을 활용하여 Tic-Tac-Toe 게임을 클래스로 구현하는 방법을 설명하고, 주요 메소드와 속성을 설계하시오.
  2. 다음과 같은 Counter 클래스를 상속받아 새로운 기능을 추가한 AdvancedCounter 클래스를 작성하시오. AdvancedCounter 클래스는 기존 기능에 추가로 reset_to(n) 메소드로 특정 값으로 초기화 기능과 현재까지의 increment 호출 횟수를 저장하는 기능을 가져야 합니다.

python
class Counter:
    def reset(self):
        self.count = 0
    def increment(self):
        self.count += 1
    def get(self):
        return self.count

class AdvancedCounter(Counter):
# 코드를 작성하시오

0개의 댓글