본문 바로가기
Computer Technology 기록부/코딩기록부 : Python

n면 주사위 클래스 함수 만들기

by Amins 2022. 1. 11.

파이썬 클래스와 객체개념을 숙달하기 위해 n면체 주사위 클래스를 만들고, 랜덤으로 값을 받는 프로그램을 짜보았다.

 

먼저 main함수를 만들어, 실제 함수가 실행되는 부분을 만들었다

사용자가 직접 주사위의 면 수를 입력할 수 있게 input 함수를 사용했고

mydice라는 변수에 FunnyDice 인스턴스를 할당해 주사위 로직을 실행할 객체를 생성했다.

 

아래는 해당 코드이다.

from random import randrange


def main():
    n = get_inputs()
    mydice = FunnyDice(n)
    mydice.throw()
    print(f"행운의 숫자는? {mydice.getval()}")
    


class FunnyDice:
    
    def __init__(self, n = 6): # default of n = 6
        self.n = int(n) 
        self.numbers = list(range(1, n+1)) # n = 1일때는 (1,7)의 리스트 생성
        self.index = randrange(0, self.n) # randrange(0,6) = 범위 0~6사이 값중 랜덤값 하나 뽑음 
        #self.numbers의 index - 주사위 던지기 전 눈의 수
        self.val = self.numbers[self.index]
        #주사위 눈의 값
        
        #주사위 면 수를 입력하고 인스턴트화를 하면, 생성자부분에
        #주사위 면 수만큼의 리스트가 생성됨
        #주사위가 생성자에 의해 생성된 후, 초기 index값이 있고,
        #그 인덱스에 따른 초기 주사위 눈의 값을 존재시킴
        
    def throw(self): #던졌을때 값 지정(랜덤으로 주사위 눈 나오게)
        self.index = randrange(0, self.n)
        self.val = self.numbers[self.index]
        
        #throw를 하면, index값이 랜덤으로 다시 생성되고
        #그에 따른 val값이 다시 산출됨
    
    def getval(self):
        return self.val
        
        #나온 주사위 눈의 수를 보는 함수. 주사위 생성후 바로 본 값과
        #THROW를 통해 던지고 난 후의 값이 매번 다름

    def setval(self, val): #사용자가 주사위 눈을 세팅할 수 있게끔 하는 로직
        if val <= self.n:
            self.val = val
        else: #예외처리 - 구간 밖 숫자 입력시
            msg = "주사위에 없는 숫자입니다. 주사위는 1 ~ {0}까지 있습니다. ".format(self.n)
            raise ValueError(msg)
        
        #치트키, setval(val) 메서드에 val에 전달인자로 
        #들어온 값을 self.val값으로 지정
        #setval 하고 getval하면 당연히 그 값이 나올것이다.
        

def get_inputs():
    n = int(input("주사위 면의 개수를 입력하세요: "))
    return n


def main():
    n = get_inputs()                                #사용자에게 인풋을 받음
    mydice = FunnyDice(n)                           #mydice라는 변수에 FunnyDice()라는 인스턴트를 할당
    mydice.throw()                                  #FunnyDice class 안의 메서드 throw 이용
    print(f"행운의 숫자는? {mydice.getval()}")      #unnyDice class 안의 메서드 getval()함수 이용
    mydice.setval(7)                                #unnyDice class 안의 메서드 setval 이용, 숫자 치팅
    print(f"니가 치팅한 숫자는? {mydice.getval()}") #setting 후 다시 결과값 받아보기
    
    
if __name__ == '__main__': 
    main() #코드가 짜여진 곳 바로 아래라면, main()함수를 실행하라는 말 - 오직 이 모듈 내에서만 작동

 

결괏값

주사위 면의 개수를 입력하세요: 100
행운의 숫자는? 59
니가 치팅한 숫자는? 7

 

 

댓글