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)]
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)
b = random.randrange(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())
print("카운터 a의 값은", a.count)
b = Counter()
a.reset()
b.reset()
a.increment()
print("카운터 a의 값은", a.get())
print("카운터 b의 값은", b.get())
객체 지향 프로그래밍의 장점
- 생산성 향상: 잘 설계된 클래스 재사용
- 자연적인 모델링: 일상 개념을 프로그래밍으로 표현
- 유지보수 용이성: 수정 및 기능 추가가 쉬움
- 캡슐화: 데이터와 함수를 하나로 묶어 관리
기말고사 예상 문제
객관식 문제
- 파이썬에서 객체는 다음 중 무엇으로 구성되는가?
a) 함수와 변수
b) 인스턴스 변수와 메소드
c) 클래스와 상속
d) 속성과 프로퍼티
- 다음 중 객체지향 프로그래밍의 장점이 아닌 것은?
a) 생산성 향상
b) 자연적인 모델링
c) 유지보수의 용이성
d) 메모리 사용량 감소
- 파이썬에서 클래스의 메소드를 정의할 때 첫 번째 매개변수로 주로 사용되는 것은?
a) cls
b) self
c) this
d) method
- 객체지향 프로그래밍에서 데이터와 알고리즘을 하나로 묶고 공용 인터페이스만 제공하고 구현 세부 사항을 감추는 것을 무엇이라고 하는가?
a) 추상화
b) 다형성
c) 캡슐화
d) 상속
- 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)]
단답형 문제
- 객체지향 프로그래밍에서 클래스로부터 만들어지는 각각의 객체를 무엇이라고 하는가?
- 파이썬에서 인스턴스 변수를 생성하려면 메소드 안에서 어떤 키워드를 변수 앞에 붙여야 하는가?
- Tic-Tac-Toe 게임에서 컴퓨터가 랜덤한 위치에 표시를 하기 위해 사용하는 파이썬 모듈은 무엇인가?
- 객체지향 프로그래밍에서 기존 클래스의 기능을 확장하여 새로운 클래스를 만드는 기법을 무엇이라고 하는가?
- Tic-Tac-Toe 게임에서 승리 조건을 확인하기 위해 사용되는 패턴의 세 가지 종류는 무엇인가?
코드 분석 문제
- 다음 코드의 실행 결과는 무엇인가?
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())
- 다음 Tic-Tac-Toe 게임 코드에서 빈칸에 들어갈 올바른 코드는?
python
dia0 = []
dia1 = []
for i in range(5):
dia0.append(board[i][i])
for i in range(5):
_________________
코드 작성 문제
- 아래 Counter 클래스를 완성하되, 다음 요구사항을 만족시키시오:
- reset() 메소드: count를 0으로 초기화
- increment() 메소드: count를 1 증가
- decrement() 메소드: count를 1 감소 (단, 0보다 작아지지 않도록)
- get() 메소드: 현재 count 값 반환
python
class Counter:
- Tic-Tac-Toe 게임에서 사용자의 입력을 받아 보드에 표시하는 코드를 작성하시오. 이미 표시된 위치에는 중복해서 표시할 수 없어야 합니다.
- 객체지향 프로그래밍 개념을 이용하여 간단한 TV 클래스를 설계하고 구현하시오. TV 클래스는 다음 속성과 메소드를 가져야 합니다:
- 속성: 채널번호, 볼륨, 전원상태
- 메소드: 켜기, 끄기, 채널 변경하기, 볼륨 변경하기
서술형 문제
- 객체지향 프로그래밍의 주요 특징과 장점을 세 가지 이상 설명하시오.
- Tic-Tac-Toe 게임에서 승리 조건을 확인하는 방법에 대해 설명하고, 코드로 구현하는 방법을 서술하시오.
- 파이썬에서 "모든 것이 객체"라는 말이 의미하는 바를 설명하고, 예시를 들어 서술하시오.
종합 문제
- 객체지향 방법론을 활용하여 Tic-Tac-Toe 게임을 클래스로 구현하는 방법을 설명하고, 주요 메소드와 속성을 설계하시오.
- 다음과 같은 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):