야구 게임

Apic·6일 전
0

코딩

목록 보기
21/24

  1. 랜덤으로 생성된 숫자에는 중복된 숫자가 있어서는 안된다.
  2. 숫자가 같고, 자리수가 같으면 Strike
  3. 숫자는 같지만 자리수가 다르면 Ball
  4. 랜덤으로 생성된 숫자를 모두 맞추면 게임 종료

베이스 코드

메인 코드

# GameMain.py
from GameData import Baseball

class GameMain:
    def __init__(self):
        self.gameList = []
    
    def start(self):
        while True:
            print("1.게임시작")
            print("2.통계")
            print("0.종료")
            sel = input("선택 : ")
            if sel =="1":
                self.gamestart() 
            elif sel=="2":
                self.showStatistics()
            else:
                return 
            
    def gamestart(self):
        b = Baseball()
        b.start() 
        self.gameList.append(b)
    
    def showStatistics(self):
        for b in self.gameList:
            print(b.computer)
            for item in b.personList:
                print(item["person"], item["strike"], 
                    item["ball"], item["out"], b.count)


if __name__ == "__main__":
    g = GameMain()
    g.start()

게임 코드

# GameData.py
import random 

class Baseball:
    def __init__(self):
        self.computer = [-1, -1, -1, -1] #아무값도 없다 
        self.person = [-1, -1, -1, -1] #아무값도 없다
        self.count=0 #몇번했는지를 저장하기 위한 변수 
        self.personList=[]
    
    def init_computer(self):
        cnt=1 #랜덤값 3개를  추출해야 하는데 중복되면 안됨 
        while cnt<=3:
            v = random.randint(0,9)
            if v not in self.computer:#중복아닐때
                self.computer[cnt]=v 
                cnt +=1
          
    def init_person(self):
        s = input("숫자 3개(0~9사이의)를 입력하세요(예시 0 1 2)")
        numberList = s.strip().split(" ")
        self.person[1]=int( numberList[0])
        self.person[2]=int( numberList[1])
        self.person[3]=int( numberList[2])

    def getResult(self):
        #수트라이크, 볼, out개수 
        strike=0
        ball=0
        out=0

        for i in range(1, 4):         
            if self.person[i] in self.computer :
                if self.computer[i] == self.person[i]:
                    strike+=1
                else:
                    ball+=1  
            else:
                out+=1
        return strike, ball, out 

    def start(self):
        #3strike 이거나 5번의 기회를 다 사용했을경우에 종료한다 
        flag = False #아직 3strike가 아님을 나타내기위한 변수 
        self.init_computer()
        print(self.computer) 
        while  flag==False and self.count<=5:
            self.init_person()
            strike, ball, out = self.getResult()
            print(f"strike:{strike} bal:{ball} out:{out}")
            self.personList.append( 
                 {"person":[x for x in self.person], 
                "strike":strike, "ball":ball, "out":out})
            if strike ==3:
                flag=True 
            self.count+=1


if __name__ == "__main__":
    b = Baseball()
    # b.init_computer()
    # b.init_person()
    # print(b.computer)
    # print(b.person)
    # print(b.getResult())    
    b.start()

내가 수정한 코드

  1. 자리수를 입력받는다.
    1-1. 중복이 없어야 하기 때문에 최대 10자리 숫자여야 한다.
    1-2. 따라서 숫자의 개수가 1개 ~ 10개이어야 한다.
  2. 예측 숫자 체크
    2-1. 예측 숫자가 정상적인지 확인할 때 입력된 숫자가 숫자인지 확인한다.
    2-2. 입력한 숫자가 초기에 설정한 자리수와 같은지 확인한다.
    (3자리수로 했으면 예측하는 숫자도 3자리여야 함)
  3. 스트라이크와 볼을 개별적으로 판단한다.
    3-1. 중복되는 숫자를 넣었을 때 (random->123, predict->122) 2s, 2b이 나온다.
    이것을 방지하기 위해 temp_list를 만들고 strike가 된 숫자는 제거하여 중복을 없앤다.
    3-2. Ball를 확인할 때는 제거된 리스트(temp_list)를 가지고 비교하여 확인한다.
  4. 정답 기회는 자리수*2 번 만큼 제공한다.

메인 코드

# GameMain.py
from Baseball import BaseBall

class GameMain:
    def __init__(self):
        pass
    
    # 시작 디스플레이
    def start(self):
        while True:
            print("1.게임시작")
            print("2.통계")
            print("0.종료")
            sel = input("선택 : ")
            
            sel_func = {'1': self.game_start, '2': self.game_record}
            
            if sel == '0':
                return
            elif sel in sel_func.keys():
                sel_func[sel]()
            else:
                print('잘못 입력하셨습니다.')
    # 게임 시작
    def game_start(self):
        baseball = BaseBall()
        while True:
            NUM = input('자리수 입력: ')
            NUM, isbreak = baseball.CheckCountNum(NUM)
            if isbreak:
                break
            
        baseball.initNum(NUM)
        baseball.start(NUM)
    
    def game_record(self):
        pass
        
        
if __name__ == '__main__':
    g = GameMain()
    g.start()

게임 코드

# Baseball.py
import random
class BaseBall:
    def __init__(self):
        self.computer = []                  # 컴퓨터 숫자
        self.computer_temp_list = []        # 컴퓨터 남은 숫자
        
        self.game_num = 0                   # 자리수
        self.display = []                   # 결과 출력
        
        self.strike_count = 0               # strike 개수
        self.ball_count = 0                 # ball 개수
        
    def initNum(self, NUM):
        # 자리수에 맞게 숫자 생성
        self.computer = random.sample([0,1,2,3,4,5,6,7,8,9], NUM)
        
    # 숫자인지 확인
    def CheckNum(self, num, NUM):
        if num.isdigit():
            if len(num) == NUM:
                return 'break'
            else:
                print('자리수가 다릅니다.')
        else:
            print('잘못 입력하였습니다.')
            
            return ''
    # 볼인지 확인
    def isBall(self, num):
        for i in num:
            i = int(i)
            if i in self.computer_temp_list:
                self.ball_count += 1
                
    # 스트라이크인지 확인
    def isStrike(self, predict_num):
        predict_temp_list = [int(i) for i in predict_num]
        self.computer_temp_list = [i for i in self.computer]
        
        # 숫자와 자리수가 맞으면 strike
        # strike 처리한 숫자는 삭제
        for i, j in zip([int(i) for i in predict_num], self.computer):
            if i == j:
                self.strike_count += 1
                predict_temp_list.remove(i)
                self.computer_temp_list.remove(i)
        
        return ''.join([str(i) for i in predict_temp_list])
    
    # 모두 strike면 게임 종료
    def gameEnd(self):
        if self.strike_count == 3:
            print('종료')
            return 'break'
        else:
            return ''
    
    # 자리수 숫자 오류 확인
    def CheckCountNum(self, num):
        if num.isdigit():   # 숫자인지 확인
            if (int(num) < 11) and (int(num) >= 0):    # 겹치지 않는 숫자 0 ~ 9 이기 떄문에 최대 10자리수
                return int(num), 'break'
            else:
                print('자리수를 벗어났습니다.')
                return 0, ''
        else:
            print('잘못 입력하셨습니다.')
            return 0, 0
    
    # 게임 시작
    # 자리수의 2배만큼 맞출 기회를 줌
    def start(self, NUM):
        for _ in range(NUM*2):
            self.display = []
            while True:
                predict_num = input('숫자 입력')
                isbreak = self.CheckNum(predict_num, NUM)
                
                if isbreak:
                    break
            # 스트라이크 확인
            predict_num = self.isStrike(predict_num)
            isbreak = self.gameEnd()    # 3스트라이크면 종료
            if isbreak:
                break
            # 볼 확인
            self.isBall(predict_num)  
            
            # 맞춘 내용 확인
            print(f'{self.strike_count} Strike, {self.ball_count} Ball')
            self.strike_count = 0
            self.ball_count = 0
            
    
if __name__ == '__main__':
    baseball = BaseBall()
    NUM = input('자리수 입력: ')
    while True:
        NUM, isbreak = baseball.CheckCountNum(NUM)
        if isbreak:
            break
    baseball.initNum(NUM)
    
    for _ in range(NUM*2):
        baseball.display = []
        while True:
            predict_num = input('숫자 입력')
            isbreak = baseball.CheckNum(predict_num)
            
            if isbreak:
                break
            
        predict_num = baseball.isStrike(predict_num)
        isbreak = baseball.gameEnd()
        if isbreak:
            break
        baseball.isBall(predict_num)  
        
        print(f'{baseball.strike_count} Strike, {baseball.ball_count} Ball')
        baseball.strike_count = 0
        baseball.ball_count = 0
profile
코딩 공부하는 사람

0개의 댓글