HomeBlogGuestbookLab 

JDM's Blog

온갖 테스트 결과가 기록되는 이곳은 JDM's Blog입니다. :3

파이썬 야구 게임(Python Baseball Game)

* 이 포스팅은 네이버 블로그에서 작성(2013.03.18)한 내용을 옮겨온 것입니다.

JAVA에 익숙해져서 그런지 정말 인덴트는 적응이 안된다. 게다가 코드가 왜 이렇게 난잡해 보이는지... 아마도 나의 기술 부족인 듯 하다. 어떻게 하면 더 깔끔하게 처리를 할 수 있을까? 몇가지 인자만 더 받는다면 맞춰야할 자릿수 조정 및 맞출 기회 갯수도 자유자재로 변경할 듯 싶다.

다음번에 이 코드를 개선시킬때 고민해 봐야겠다. 일단 연습한게 아까워서 블로그 포스팅. 혹시 더 개선된 코드를 공유해 주실 수 있으신 분 리플 부탁드립니다.

# [PYTHON 3.X]
# -*- coding:utf-8 -*-
# 파일 인코딩은 "UTF-8"로 맞춰주시길 바랍니다.
# 사용 버전 : 파이썬 3.3

# import

import os
import random

# 유틸리티 클래스
class Util:
    # 화면 정리
    def clearDisplay():
        os.system( [ 'clear', 'cls' ][ os.name == 'nt' ] )

# 난수 생성 클래스

class Random:
    LIMIT_NUM_CNT = 4    # createNumberList 호출시 최대 반환 되는 숫자 갯수
    NumList = []

    def __init__(self, limit):
        self.LIMIT_NUM_CNT = limit

    def createNumberList(self):
        i = 0
        while True:
            num = self.createRandomNumber()
            if not self.isNumber(num):
                self.NumList.append(num)
                i = i + 1
            if i >= self.LIMIT_NUM_CNT : break
        return self.NumList

    def isNumber(self, chkNum):
        for i in range(len(self.NumList)):
            if int(self.NumList[i]) == chkNum :
                return True
        return False

    def createRandomNumber(self):
        return random.randrange(0,10)

# 야구게임 클래스
class BBGame:

    MODE_INIT = { 'title':'게임 초기화', 'value':0 }
    MODE_START = { 'title':'게임 시작', 'value':1 }
    MODE_EXIT = { 'title':'게임 종료', 'value':2 }

    MODE_LIST = [ MODE_INIT, MODE_START, MODE_EXIT ]

    STATE_WIN = True
    STATE_LOSE = False

    LIMIT_NUM_CNT = 4 # 맞춰야할 숫자 갯수
    LIMIT_CNT = 10    # 기회 제한 횟수

    # 초기화 메소드
    def __init__(self):
        self.mode = self.MODE_INIT['value']    # 게임 모드를 "초기화"

    # 비즈니스 로직 시작 메소드
    def start(self):
        Util.clearDisplay()    # 화면 정리
        if self.mode == self.MODE_INIT['value']: self.startInit()
        elif self.mode == self.MODE_START['value']: self.startGame()
        elif self.mode == self.MODE_EXIT['value']: self.exitGame()
        
        return self.state

    # 게임 초기화 메소드
    def startInit(self):
        self.state = self.STATE_LOSE    # 상태는 "패배" 로 초기화.

        # 메뉴명 출력
        for i in range(1,len(self.MODE_LIST)):
            print(str(self.MODE_LIST[i]['value'])+". "+self.MODE_LIST[i]['title'])

        # 메뉴 선택
        try:
            cmd = int(input("번호 입력>> "))
            self.mode = cmd
            self.start()
        except:
            print("해당 번호가 없거나 입력이 잘못 되었습니다.")
            input("아무 키나 누르세요.")
            self.mode = self.MODE_INIT['value']
            self.start()
    
    # 게임 플레이 메소드
    def startGame(self):
        print("난수 생성중입니다..")
        randomCls = Random(self.LIMIT_NUM_CNT)
        numList = randomCls.createNumberList()
        print("게임을 시작합니다..")
        print("숫자 입력방법) 1 2 4 6 ")
        print("게임에서 나가고 싶으면 999 를 입력하세요. 대신 게임은 패배합니다.")

        strike = 0
        ball = 0
        out = 0

        for i in range(0, self.LIMIT_CNT):
            remainPoint = int(self.LIMIT_CNT) - int(i)
            print("남은 기회 : "+str(remainPoint))
            inputList = input("숫자 입력>> ")

            chkList = inputList.split()

            # 게임 종료
            if int(chkList[0]) == 999 and len(chkList) == 1 : 
                self.state = self.STATE_LOSE
                self.mode = self.MODE_EXIT['value']
                break
            
            if len(chkList) == self.LIMIT_NUM_CNT :

                strike = 0
                ball = 0
                out = 0

                # 스트라이크 판정
                for j in range(0, self.LIMIT_NUM_CNT):
                    if int(chkList[j]) == int(numList[j]) : 
                        strike = strike + 1
                
                # 볼 판정
                for j in range(0, self.LIMIT_NUM_CNT):
                    if chkList.count(str(numList[j])) > 0 and int(chkList[j]) != int(numList[j]):
                        ball = ball + 1

                # 아웃 판정
                out = self.LIMIT_NUM_CNT - strike - ball

                print( str(strike)+"S "+str(ball)+"B "+str(out)+"O" )

                # 모두 스트라이크면 게임 승리
                if int(strike) == self.LIMIT_NUM_CNT :
                    self.state = self.STATE_WIN
                    self.mode = self.MODE_EXIT['value']
                    break
            else:
                print("입력이 잘못 되었습니다.")

            if int(remainPoint) == 1 :
                self.mode = self.MODE_EXIT['value']
                break

        self.start()

    # 게임 종료 메소드
    def exitGame(self):
        print("게임이 종료되었습니다.")

# main logic

game = BBGame()
result = game.start()
if result : print("당신이 이겼습니다.")
else: print("당신이 졌습니다.")

다음은 실행화면이다.