파이썬_실전 프로젝트

숫자 맞추기 게임 2 (스트라이크 볼 게임)

이번에는 숫자 야구라는 간단한 게임을 만들어 보겠습니다.

앞에서 만든 숫자 맞추기 게임을 조금만 수정하면 됩니다.

게임의 규칙은 사용자가 값을 입력해서, 정답과 자리가 정확하게 같으면 스트라이크, 자리는 다르지만 숫자가 존재하기만 하면 볼이라고 알려주는 규칙입니다.

정답이 195일때

123 을 입력하면, 1 스트라이크

193 을 입력하면, 2 스트라이크

951 은 3볼,

159 는 1스트라이크 2볼입니다.

(중복숫자까지 처리하게 되면, 코드가 좀더 복잡해지는데, 이건 다음토픽에서 다뤄보겠습니다.)

 

 

1. 앞서 만든 코드 가져오기

앞서 만든 숫자맞추기 게임입니다.

import random
number = random.randint(1,999)
print(number)

while True:
    try:
        guess = int(input('숫자를 입력하세요 :'))
        if guess == number:
            print('정답입니다')
            break
        elif guess > number:
            print('더 작은 수 입니다')
        else:
            print('더 큰 수 입니다.')
    except:
        print('1-999중의 숫자를 입력하세요')

 

2. 숫자를 문자로 바꾸고, 자릿수는 0으로 채우기.

각 자릿수를 비교해야 하므로, 문자가 비교하기 편합니다. 난수는 문자로 바꿔주고, 사용자가 세자리를 입력안했을경우도 대비를 해서, 왼쪽은 0으로 채워서, 문자로 처리하기 편하게 만들어 주겠습니다.

import random
number = str(random.randint(1,999)).zfill(3)
print(number)

 zfill() 함수는 괄호안의 숫자만큼 0으로 채우라는 명령입니다.

 

나머지 루프문 중에 예외처리(try , except)부분은 일단 제거를 해주었습니다. 그리고 크기 비교 if 문도 필요없기때문에 일단 제거를 했습니다.

while True:
    guess = input('숫자를 입력하세요 :')
    if guess == number:
        print('정답입니다')
        break
    else:
        print('틀렸습니다.')

 
3. 스트라이크, 볼 판단

스트라이크 볼을 판단하는 원리는, 자리가 완전히 일치할경우 strike 변수에 1증가, 자릿수가 달라도 숫자가 존재하면 ball 변수에 1증가 시키도록 했습니다.

import random
number = str(random.randint(1,999)).zfill(3)
print(number)

while True:
    guess = input('숫자를 입력하세요 :')
    if guess == number:
        print('정답입니다')
        break
    else:
        strike = 0
        ball = 0
        for i in range(3):
            if guess[i] == number[i]:
                strike += 1
            elif guess[i] in number:
                ball+=1
        print("스트라이크:{} 볼:{}".format(strike,ball))
195
숫자를 입력하세요 :190
스트라이크:2 볼:0
숫자를 입력하세요 :295
스트라이크:2 볼:0
숫자를 입력하세요 :951
스트라이크:0 볼:3
숫자를 입력하세요 :159
스트라이크:1 볼:2
숫자를 입력하세요 :195
정답입니다

 

댓글

댓글 본문
작성자
비밀번호
  1. 쿨피
    네 맞습니다.
    초보라 어렵게 짠듯요..-.-;;
    대화보기
    • nomadlife
      아 코드 감사합니다. 살짝 어렵네요 ^^; 초보가 아니신거 같은데요? 100, -50은 스트라이크/볼을 양수음수로 구분하실려고 넣으신건가요?
      대화보기
      • 쿨피
        허접하지만 아래 처럼 해보니 중복처리 되네요 아직 초짜라서 ^^
        for j in [0,1,2]:
        TempRST = 0
        for k in [0, 1, 2]:

        if j == k and random_num[j] == guess[k]:
        Result[k][j] = 100
        elif j != k and random_num[j] == guess[k]:
        Result[k][j] = -50
        else:
        Result[k][j] = 0
        TempRST = TempRST+Result[k][j]

        print(TempRST)
        if TempRST > 0:
        STK = STK + 1
        elif TempRST < 0:
        BALL = BALL + 1
        print(Result)
        print("%d strikes and %d Balls " % (STK, BALL))
        대화보기
        • nomadlife
          제가 중복처리를 안해줬네요 뭔가 깔끔한 코드가 생각이 안서서, 그냥 저대로 뒀던듯 합니다. ^^; 혹시 아이디어 있으시면 공유 부탁드릴게요. 저도 고민해보겠습니다.
          대화보기
          • 쿨피
            number 198 guess 181 인 경우 1S1B 이어야 맞을 듯 한데 위 로직으로는 1S2B 이 나오네요,
          버전 관리
          nomadlife
          현재 버전
          선택 버전
          graphittie 자세히 보기