본문 바로가기

Programming/Algorithm

[Python3] 숫자 야구 게임

앞으로 갑자기 생각난 알고리즘을 여기에다가 끄적여 볼까 한다. 갑자기 생각난 프로그램이니 조금 부실하여도 이해해주길 바란다


"숫자 야구"무엇인가 굉장히 엄청날 것 같지만 쉽게 생각하면 숫자로 행맨 하는 놀이이다. 둘이서 하고 서로가 1~10자리 숫자를 생각한 후(보통은 3,4) 차례로 상대의 숫자를 맞춘다. 규칙은 아래와 같다.


  ● 사용되는 숫자는 0에서 9까지이며 중복은 허용치 않는다.(맨 처음숫자가 0이어도 상관없다.)

  ● 숫자는 맞지만 위치가 틀리면 볼

  ● 숫자와 위치가 둘다 맞으면 스트라이크

  ● 숫자와 위치가 둘다 틀리면 아웃

  ● 무슨 숫자가 볼이고 스트라이크인지는 알려주지 않는다


단순해 보이지만 랜덤, 중복체크, 숫자배열 등등 여러개가 쓰인다.

알고리즘을 짜본다면(컴퓨터와 하니 내가 일방적으로 맞출 수 밖에없다. 후에 1 vs computer 추가예정)

몇자리수로 할건지 n에 입력 받는다.

     중복되지않게 n자리 guess 리스트를 만든다.

사용자의 입력을 usr_guess에 입력받는다.

하나씩 입력받은게 guess와 자리까지 같다면 strike에 1추가

guess안에 있다면 ball에 1추가

usr_guess==guess 또는 strike==n이라면 라면 게임끝내기

from random import randint

def unique(x): #중복입력방지를 위한 함수

    for i in x:

        if(x.count(i)>=2):

            return False

    return True

    

while(1):

    count=0

    check=True

    n=0

    try: n=int(input("몇자리수??(1~10)"))

    

    except ValueError:

        print("숫자!!!")

        check=False #숫자가 아니면 처음으로

        

    if(n>10 and check):

        print("0~10까지 정수만!!")


    elif(n<=10 and check):

        num=['0','1','2','3','4','5','6','7','8','9']

        guess=[]

        for I in range(n):

            temp=randint(0,len(num)-1)

            guess.append(num[temp])

            del(num[temp]) #guess 설정


        print("띄어쓰기 하지말고! 0~9까지 숫자를 중복안되게 조합해서 불러봐")

        

        while(1):

            count+=1

            usr_guess=str(input("\n음..이건가?"))

            check=True

            try: temp=int(usr_guess)

            

            except ValueError:

                print("\n숫자!!!")

                check=False

            if(len(usr_guess)!=n and check): print(n,"자리 숫자야!")

                

            elif(not unique(usr_guess)): print("\n중복은 허용 안돼")


            elif(check):   #볼,스트라이크 출력구문

                strike=0

                ball=0

                for k in range(n):

                    if (usr_guess[k]==guess[k]): strike+=1

                    elif (usr_guess[k] in guess): ball+=1

                if(strike==n): #정답

                    print("\n맞았어",count,"번 만에 맞췄네")    #맞출 시

                    if(count==1): print("와우 1/"+str(10**n)+"의 확률이야")

                    q=input("\n한번 더할래?(N/Y): ").lower()

                    if(q=='n'): exit()

                

                    elif(q=='y'): break

                    

                    else:

                        print("\n똑바로 입력 안한자에겐 기횐 없다.")

                        exit()

                else:        

                    print("\n",strike," 스트라이크,",ball," 볼")


<실행화면>


'Programming > Algorithm' 카테고리의 다른 글

[Python3] 올바른 괄호 판단하기1  (0) 2016.12.06
[Python3] 디지털 숫자 찍기  (0) 2016.12.04
[Python3] 바퀴벌레 문제  (2) 2016.12.02
[Python3] 올바른 괄호  (2) 2016.11.17
[Python3] 집합, 자연수 분할  (0) 2016.11.09