DAY 12

2025. 3. 6. 11:24·일지

숫자야구 게임

오늘 자정 안에 개발완료보고서 올려라

 

오전: 야구게임 만들기

오후: 야구게임 디버깅

저녁: 야구게임 순서도

 

숫자 야구의 규칙
0~9 사이의 수 중 3개를 랜덤하게 뽑는다.(중복은 허용치 않는다.)
랜덤으로 뽑은 수는 사용자에게 보이지 않는다.
이 상태에서 사용자는 임의의 수 3개를 뽑아 부른다.
만약에 이 숫자들이 처음 랜덤하게 뽑은 숫자와 정확히 일치한다면 게임에서 승리하게 된다.
단, 이를 위해 스트라이크와 볼이 존재한다. 스트라이크는 사용자가 제시한 숫자 하나와 랜덤하게 뽑은 숫자 하나가 있으면서 자리도 같은 것이다.
볼은 자리는 같지 않지만 뽑은 숫자와 같은 수가 있으면 볼이다.
즉 3 스트라이크이면 승리이고, 단 하나의 볼이나 스트라이크가 발생하지 않으면 아웃이다.
이 규칙으로 특정 횟수 안에 정답을 찾으면 승리하는 게임이다.



이 숫자야구 프로그램을 만들어보자.

숫자야구 프로그램은 '플레이하기', '전적', '종료'라는 메인 화면을 가진다.
'플레이하기'를 선택한 경우, 난이도를 3개의 단계중 하나로 고른다.
각 난이도는 이번 숫자야구에서 '15회', '12회', '9회'의 기회를 준다.
플레이 중 '포기하기' 기능을 넣는다.(포기시 해당 플레이는 '포기'로 분류한다.)
각 난이도별 승/패/포기 수와 승률(승/패로만 계산) 등을 출력해서 볼 수 있다.
1판이 끝난 경우 계속 할거냐고 물어보고 계속한다고 하면 다시 난이도 선택으로 이동한다. 아닌 경우 메인화면으로 이동한다.

 

 

# 숫자야구
# 게임규칙
# 1~9 까지 숫자 3개 랜덤으로 고른다.
# 플레이어는 3자리 숫자를 추측해서 입력한다
# 결과확인:
# strilke: 숫자의 위치가 모두 맞으면 strike
# Ball: 숫자는 맞지만 위치가 다르면 Ball
# Out: 숫자도 맞지않고, 위치도 맞지 않으면 Out

# 플레이어가 정확히 3개의 숫자를 맞추면 게임 종료

# 예시
# 컴퓨터가 생성한 숫자: 4 2 9
# 사용자가 입력한 숫자: 4 9 2
# 결과: 1 Strike, 2 Ball

#############################################
# 메뉴 만들기: 1.플레이하기 2.전적 3.종료
# 1.플레이하기 > 난이도 3단계 중 고르기 (15회,12회,9회) 카운트
# 플레이 중 포기하기 버튼 > 해당 판은 '포기'로 분류
# 난이도별 승/패/포기 수 + 승률(승/패로만 계산) 출력해서 볼 수 있음 <전적
#############################################
                     #세팅

# 컴퓨터가 숫자 생성하는 함수
import random
def computer_number():
    """컴퓨터가 1부터 9까지의 숫자 중에서 중복 없이 3자리 숫자 생성"""
    return random.sample(range(1, 10), 3) # type: list

# 유저가 숫자 고르는 함수
def user_pic():
    while True:
        try:
            # 사용자로부터 숫자 3개를 입력받음
            a, b, c = map(int, input("3자리 숫자를 입력하세요 (예: 1 2 3): ").split())

            # 입력받은 숫자가 3개인 경우 반복문 탈출
            return [a, b, c]  # type: list

        except ValueError:
            # 숫자 입력이 잘못되었거나 3개가 아닐 경우, 다시 입력을 요청
            print("입력 값이 부족하거나 잘못되었습니다. 세 개의 숫자를 정확히 입력해 주세요.")


# 결과 함수 [strike/ball/out] << 만들긴 했는데 사용을 못하겠음. 작동 안됨.
def result():
    global guess #지역에서 전역언어를 부르는 법 - 게스는 튜플임
    global secret
    # 위 방법보다는 게스를 인자로 받아라 < 그게 뭔데.........

    """사용자가 추측한 숫자와 컴퓨터가 생성한 숫자 비교"""
    strike = 0
    ball = 0
    out = 0

    # 유저의 숫자와 컴퓨터 숫자 비교
    for i in range(3): #0,1,2
        if guess[i] == secret[i]: #유저의 0번 숫자와 컴퓨터의 0번 숫자가 같으면
            strike += 1
        elif guess[i] in secret:
            ball += 1
        else:
            out += 1

    return strike, ball

# 저장이 필요한 데이터들

win = 0 #승리횟수
loose = 0 #패배횟수
give_up = 0 #포기횟수
#승률은 전적에서 조회

#############################################
                    #시작

#[메인화면]
round_ = 0  # 플레이횟수 / 0회로 시작
b = True  # 메인화면으로 돌아가기
while b:
    print("[menu]\n1.play\n2.score\n3.end") # 메뉴고르기
    user_input = input("메뉴를 고르시오: ")

    c = True # 플레이 메뉴 나가기
    while c:
        if user_input == '1':  # 유저가 1번 play를 고른 경우

            # 선제: 컴퓨터가 정답을 뽑아낸다.
            # 1.난이도 고르기 > 고르고나면 게임 시작
            # 2.중도포기 버튼 > 포기 카운트

            print("\n게임을 시작합니다.")

            print(f"현재 라운드 [{round_}]회차")

            # 컴퓨터가 정답 산출
            secret = computer_number() # type = list
            print(f"정답:{secret}") # 이 번호를 유저가 맞추면 됨

            # 난이도 고르기 or 메인메뉴로 나가기
            print("\n[menu]\n1.high(9회)\n2.normal(12회)\n3.low(15회)\n4.나가기")
            level = input("난이도를 고르시오: ")

            # ~난이도를 고른 경우~ 1,2,3
            # turn = 1  # 턴 1회로 시작 (난이도 모두 공통)

            ### 상
            if level == '1':  # 고난이도 high/9턴
                print("\nhigh level(9턴)을 시작합니다.")
                round_ += 1  # 플레이횟수 추가

                turn = 1  # 턴 1회로 시작 (난이도 모두 공통)
                while turn < 10:  # 카운트가 9회 일때까지만 아래로 / 9회 넘으면 종료

                        print(f"\n={turn} turn=")  # 현재 몇번째 턴인지 출력

                        input_or_giveup = input("1.숫자를 입력한다. / 2.포기한다ㅠㅠ\n입력: ")

                        if input_or_giveup == '1':  # 진행하기 선택
                            turn += 1  # 턴 횟수 추가

                            guess = user_pic()
                            print("추측:", guess)  # 유저가 고른 숫자 보여주고

                            # 결과 알려주기
                            strike = 0
                            ball = 0
                            out = 0

                            # 유저의 숫자와 컴퓨터 숫자 비교
                            for i in range(3):  # 0,1,2 > 순서대로 하나씩 차례대로 검사 / 2번까지
                                if guess[i] == secret[i]:  # 유저의 0번 숫자와 컴퓨터의 0번 숫자가 같으면
                                    strike += 1
                                elif guess[i] in secret:
                                    ball += 1
                                else:
                                    out += 1

                            if guess[0] == secret[0] and guess[1] == secret[1] and guess[2] == secret[2]:
                                # 1,2,3번 숫자가 모두 같으면 승리
                                print("승리!")
                                win += 1
                                input("메뉴로 돌아갑니다.(enter)")
                                break  # 해당 라운드 종료

                            print(f"\n결과:[strike:{strike}/ball:{ball}/out:{out}]")
                            continue #다음턴으로 돌아가기

                        elif input_or_giveup == '2':
                            print("게임을 포기 했습니다. 패배 했습니다.")
                            loose += 1
                            input("난이도 고르기로 돌아갑니다.(enter)")
                            break # 해당 라운드 종료

                else:
                    print("횟수초과 패배")
                    loose += 1

            ### 중
            if level == '2':  # 고난이도 high/9턴
                print("\nhigh level(12턴)을 시작합니다.")
                round_ += 1  # 플레이횟수 추가

                turn = 1  # 턴 1회로 시작 (난이도 모두 공통)
                while turn < 13:  # 카운트가 12회 일때까지만 아래로 / 12회 넘으면 종료

                    print(f"\n={turn} turn=")  # 현재 몇번째 턴인지 출력

                    input_or_giveup = input("1.숫자를 입력한다. / 2.포기한다ㅠㅠ\n입력: ")

                    if input_or_giveup == '1':  # 진행하기 선택
                        turn += 1  # 턴 횟수 추가

                        guess = user_pic()
                        print("추측:", guess)  # 유저가 고른 숫자 보여주고

                        # 결과 알려주기
                        strike = 0
                        ball = 0
                        out = 0

                        # 유저의 숫자와 컴퓨터 숫자 비교
                        for i in range(3):  # 0,1,2 > 순서대로 하나씩 차례대로 검사 / 2번까지
                            if guess[i] == secret[i]:  # 유저의 0번 숫자와 컴퓨터의 0번 숫자가 같으면
                                strike += 1
                            elif guess[i] in secret:
                                ball += 1
                            else:
                                out += 1

                        if guess[0] == secret[0] and guess[1] == secret[1] and guess[2] == secret[2]:
                            # 1,2,3번 숫자가 모두 같으면 승리
                            print("승리!")
                            win += 1
                            input("메뉴로 돌아갑니다.(enter)")
                            break  # 해당 라운드 종료

                        print(f"\n결과:[strike:{strike}/ball:{ball}/out:{out}]")
                        continue  # 다음턴으로 돌아가기

                    elif input_or_giveup == '2':
                        print("게임을 포기 했습니다. 패배 했습니다.")
                        loose += 1
                        input("난이도 고르기로 돌아갑니다.(enter)")
                        break  # 해당 라운드 종료

                else:
                    print("횟수초과 패배")
                    loose += 1

            ### 하
            if level == '3':  # 고난이도 high/9턴
                print("\nhigh level(15턴)을 시작합니다.")
                round_ += 1  # 플레이횟수 추가

                turn = 1  # 턴 1회로 시작 (난이도 모두 공통)
                while turn < 13:  # 카운트가 12회 일때까지만 아래로 / 12회 넘으면 종료

                    print(f"\n={turn} turn=")  # 현재 몇번째 턴인지 출력

                    input_or_giveup = input("1.숫자를 입력한다. / 2.포기한다ㅠㅠ\n입력: ")

                    if input_or_giveup == '1':  # 진행하기 선택
                        turn += 1  # 턴 횟수 추가

                        guess = user_pic()
                        print("추측:", guess)  # 유저가 고른 숫자 보여주고

                        # 결과 알려주기
                        strike = 0
                        ball = 0
                        out = 0

                        # 유저의 숫자와 컴퓨터 숫자 비교
                        for i in range(3):  # 0,1,2 > 순서대로 하나씩 차례대로 검사 / 2번까지
                            if guess[i] == secret[i]:  # 유저의 0번 숫자와 컴퓨터의 0번 숫자가 같으면
                                strike += 1
                            elif guess[i] in secret:
                                ball += 1
                            else:
                                out += 1

                        if guess[0] == secret[0] and guess[1] == secret[1] and guess[2] == secret[2]:
                            # 1,2,3번 숫자가 모두 같으면 승리
                            print("승리!")
                            win += 1
                            input("메뉴로 돌아갑니다.(enter)")
                            break  # 해당 라운드 종료

                        print(f"\n결과:[strike:{strike}/ball:{ball}/out:{out}]")
                        continue  # 다음턴으로 돌아가기

                    elif input_or_giveup == '2':
                        print("게임을 포기 했습니다. 패배 했습니다.")
                        loose += 1
                        input("난이도 고르기로 돌아갑니다.(enter)")
                        break  # 해당 라운드 종료

                else:
                    print("횟수초과 패배")
                    loose += 1


            # ~나가기를 고른 경우~
            if level == '4': # 나가기 선택
                print("play를 종료합니다.\n")
                c = False #메인화면으로 가기
                break

        # 전적
        elif user_input == '2': #유저가 2.score 를 고른 경우
            # [ 승,패,포기 / 승률 ] 볼 수 있음
            print("전적을 조회합니다.")
            print(f"플레이 횟수:{round_}회")
            print(f"승:{win}회")
            print(f"패:{loose}회")
            print(f"포기:{give_up}회")

            if win >= 1: # 이긴 횟수가 1번이라도 있어야만 승률 출력
                print(f"승률:{(win/round_)*100}%")

            else:
                print(f"승률:0%")

            print(input("메인화면으로 돌아가기(enter)"))
            break

            #odds = ((win / round_) * 100)  # 승률 = (승리한 경기 수 / 총 경기 수) x 100%
            #print(f"승률:{odds}%")

        # 종료
        elif user_input == '3': #유저가 3.end 를 고른 경우
            print("게임을 종료합니다.")
            b = False # 메인화면을 False로 바꿔서 미리 끈 다음에
            break # 메인화면 메뉴 조건문을 끈다.
            # 메인화면 반복문을 미리 꺼놨기 때문에 조건문 나가자마자 완전히 종료 가

        # 메인메뉴 잘못 골랐을 때
        else: #메인화면에서 없는 메뉴를 골랐을 때
            print("잘못 입력 하셨습니다.")
            break

# 숫자를 하나만 입력했을 때 터짐
# 포기한다가

'일지' 카테고리의 다른 글

Day 14  (0) 2025.03.10
Day 13 - (0307) / C언어  (4) 2025.03.07
DAY 11  (0) 2025.03.05
Day 8 [순서도: 반복구조]  (1) 2025.02.28
Day 8 [순서도: 선택구조]  (1) 2025.02.28
'일지' 카테고리의 다른 글
  • Day 14
  • Day 13 - (0307) / C언어
  • DAY 11
  • Day 8 [순서도: 반복구조]
joo_coding
joo_coding
2025.02.18~
  • joo_coding
    주코딩일지
    joo_coding
  • 전체
    오늘
    어제
    • 분류 전체보기 (163) N
      • 일지 (19)
      • 계획표 (7)
      • 프로젝트 (6) N
      • C언어 (35)
        • 연습장 (12)
      • C++ (3)
      • Python (28)
        • 연습장 (11)
      • TCP IP (4)
      • DB (2)
      • ubuntu (1)
      • Git (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    c언어 #vscode #gcc #윈도우 #c언어윈도우 #gcc윈도우 #vscode윈도우 #c #c++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
joo_coding
DAY 12
상단으로

티스토리툴바