이전 내용
주사위 클래스 만들기
주사위 클래스를 만들어 주사위의 값을 반환하는 프로그래밍을 구현해 본다.
from random import *
class Dice:
def __init__(self, x, y):
self.__x = x
self.__y = y
self.size = 30 # 주사위 크기 (중요하지 않음)
self.__value = 1
def roll_dice(self): # 주사위 굴리기
self.__value = randint(1, 6) # 1에서 6까지
print("주사위를 굴립니다.")
def print_dice(self): # 주사위 굴려 나온 값 표시
print(f"주사위의 값: {self.__value}")
d1 = Dice(100, 100) # 도화지 100 * 100 사이즈에 주사위를 굴린다는 느낌
d1.roll_dice()
d1.print_dice()
주사위를 굴리는 roll_dice() 메서드의 값은 randint(1, 6)로 1부터 6까지의 임의의 정수를 생성하여 print_dice() 메서드로 출력하도록 했다. random 모듈을 사용해야 하므로 random 모듈을 import 한다.
그리하여 굴릴 때 마다 (roll_dice() 메서드와 print_dice() 메서드를 호출할 때마다) 출력 값이 달라진다.
Develop1. 주사위를 두 개로 늘려보자
이번에는 주사위를 하나 더 늘려 주사위 두 개의 눈이 출력되도록 해본다.
(역시 주사위 눈 = 임의의 정수 이므로, random 모듈 import 필요)
class Two_Dices():
def __init__(self):
self.__x = 1
self.__y = 1
print("게임을 시작합니다.")
def roll_dices(self): # 주사위 굴리기
self.__x = randint(1, 6) # 1에서 6까지
self.__y = randint(1, 6) # 1에서 6까지
print("주사위를 굴립니다.")
def print_dices(self): # 주사위 굴려 나온 값 표시
print(f"주사위의 값: ({self.__x},{self.__y})")
print(f"앞으로 {self.__x + self.__y}칸 전진합니다.")
if self.__x == self.__y:
print("더블 입니다. 한 번 더 굴려주세요")
self.roll_dices()
self.print_dices()
dice1 = Two_Dices()
dice1.roll_dices()
dice1.print_dices()
코드를 실행하면 주사위의 눈금이 출력되는데,
- roll_dice() 메서드를 roll_dices() 메서드로 수정하고, 두 번째 주사위인 self.y 변수도 추가해 주었다.
- print_dice() 메서드 역시 print_dices() 메서드로 수정하고,
- 두 개의 주사위 눈이 표시되도록 하는 것
- 두 눈을 합한 수 만큼 전진하겠다는 메시지가 출력
- 그리고 두 눈의 값이 똑같으면 '더블'이라고 하여 주사위를 한 번 더 굴리도록 설정해주었다.
두 주사위의 값이 똑같을 경우, 이렇게 두 메서드가 다시 실행된다.
Develop2. 게임판을 추가해 보자.
첫 번째 코드를 보면 아래와 같이 게임판을 의미하는 코드가 있다.
d1 = Dice(100, 100) # 도화지 100 * 100 사이즈에 주사위를 굴린다는 느낌
그런데, 정작 첫 번째와 두 번째 코드에서는 이 게임판이 있어도 사용되는 부분이 없다. 따라서, 게임판 클래스를 추가하여 주사위의 총 칸의 갯수를 정해놓고 주사위를 굴려서 전진하여 남은 칸이 사라지면 종료가 되게끔 코드를 구현해 본다.
(역시 random 모듈 import 필요)
class Two_Dices():
def __init__(self):
self.x = 1
self.y = 1
print("게임을 시작합니다.")
def roll_dices(self): # 주사위 굴리기
self.x = randint(1, 6) # 1에서 6까지
self.y = randint(1, 6) # 1에서 6까지
print("주사위를 굴립니다.")
def print_dices(self): # 주사위 굴려 나온 값 표시
print(f"주사위의 값: ({self.x},{self.y})")
if self.x == self.y:
print("더블 입니다. 한 번 더 굴려주세요")
self.roll_dices()
self.print_dices()
# 게임판
class DiceGameBoard(Two_Dices):
distance = 100
serialNumber = 0
def __init__(self):
super().__init__()
self.distance = 100 # 초깃값
self.serialNumber += 1 # 주사위 1회 던질 때마다 올라감 (게임 횟수)
def play(self):
print("게임을 시작합니다.")
while self.distance > 0:
self.go()
self.distance -= self.x + self.y
self.serialNumber += 1
print(f"남은 칸: [{self.distance}], 총 게임횟수: [{self.serialNumber}]")
if self.distance <= 0:
print(f"게임이 종료되었습니다.[총 게임횟수: {self.serialNumber}]")
break
def go(self):
self.roll_dices()
self.print_dices()
game_board1 = DiceGameBoard()
game_board1.play()
DiceGameBoard 라는 클래스를 생성하는데, Two_dices 클래스를 상속하도록 한다.
distance 변수는 게임판의 칸 수를 의미하며, 기본 100 칸으로 지정했다.
또한, serialNumber 클래스 변수를 추가하여 게임이 몇 판 진행되는지 출력되도록 했다. (이를 위해 게임이 진행될 때마다 serialNumber 변수가 1씩 증가하도록 설정했다.)
play() 메서드는 distance 변수가 0보다 클 때까지 반복되도록 while 문을 이용했고, while문이 True인 동안 go() 메서드가 실행되며 distance는 두 주사위의 눈금을 의미하는 self.x와 self.y 변수의 합만큼 차감되도록 했다.
또한, 게임 횟수를 의미하는 serialNumber 변수 역시 증가하도록 했다.
그리고 print 문을 사용하여 게임이 한 판 진행될 때마다 남은 칸과 총 게임횟수를 출력하도록 했으며, 만약 distance가 0과 같거나, 0보다 작게되면 게임 종료를 선언하고 break를 불러와 게임이 중단되도록 했다.
go() 메서드는 roll_dices() 메서드와 print_dices() 메서드를 호출하도록 했다.
이 코드를 실행하면,
말이 게임판을 모두 순회할 때까지 남은 칸과 게임횟수가 출력되며, 0이하가 되면 게임이 종료된다.
다음 내용
'[파이썬 Projects] > <파이썬 기초>' 카테고리의 다른 글
[파이썬] 넘파이 보완 - 불리언 값, 배열 전치 , 내적 (2) | 2025.01.24 |
---|---|
[파이썬] 파이썬 기초 - 클래스 보완 (은행 계좌, ATM 프로그램 만들기) (0) | 2025.01.23 |
[파이썬] 파이썬 기초 - 클래스 보완 (0) | 2025.01.22 |
[파이썬] 파이썬 기초 - 예외 처리 보완 (0) | 2025.01.21 |
[파이썬] 파이썬 기초 - 파일 복사, 디렉토리 (0) | 2025.01.21 |