알고리즘 숫자야구 게임 만들기 (수정)

노우석·2022년 9월 7일
0
post-custom-banner

요구조건에 맞게 숫자야구 게임 틀을 잡았다.

1번째 (컴퓨터 랜덤 숫자 고르기) #랜덤이니까 import random

숫자를 입력받고 입력받는 값(int)에 맞는 자릿수에 대한 #(최대 10까지)

숫자를 입력밧는 값 갯수로 랜덤으로 고른다.

2번째 (사용자 숫자 고르기)

사용자가 생각하는 중복없는 숫자 int 에 수 만큼 숫자를 입력

받는다

3번째 ( 서로 맞는지 판단하고 s b o 올리기)

사용자의 숫자와 컴퓨터의 숫자가 서로 맞는지 판단하고

서로 위치랑 숫자가 같은면 스트라이크 (if ~ strike +=1)

숫자만 같으면 볼 (if ~ ball +=1)

위치랑 숫자 모두 다르면 아웃 (else out +=1)

으로 출력한다.

4번째 ( 게임 완료 후 출력해야하는 목록 + 게임 도중 종료 기능넣기)

3strike 가 된 경우

정답을 맞추기까지 입력한 횟수

게임을 시작해서 정답을 맞추기까지 소요된 시간

정답을 맞춘 시점의 날짜/시간 이 출력되고

게임을 진행하던 도중 "exit"를 입력할 경우 프로그램을 종료하는 기능

을 넣어놔야한다.

1번째 기능코드(자릿수 선택 후 랜덤 숫자 받기)

from random import randint
import time
from datetime import datetime
import sys

print("게임에서 입력받을 자릿수를 정해주세요")

Str = input()
if Str.isdigit(): ## 만약에 위에 Str변수안에 입력값 정수면 true이기 때문에

			## Pnum = int(str) 을 통해 정수값으로 변경해준다.

			 ##isdigit(): 앞에 있는 변수 내용이 정수일경우 true이고 문자일경우 false가 된다.

Pnum = int(Str)
elif Str == "exit":
sys.exit(0)

start_time = time.time()

def PC_numbers():
Pnumbers = []
i = 0
new_number = 0
while i < Pnum:
new_number = randint(0, 9)
if new_number not in Pnumbers:
Pnumbers.append(new_number)
i += 1
return Pnumbers

radint 를 사용하기 위해 import random 에서 from random import randint 로 수정했다.

코드를 실행했을때 시작시간과 게임을 끝냈을때까지 걸린시간을 출력하기 위해서 time 함수를 사용했다.

if 문과 isdigit함수를 이용해서 종료 명령코드를 만드는 게 많이 힘들었다.

2번째 기능코드(사용자가 선택할 숫자 고르기)

def take_mynumber():
print(f"숫자 {Pnum}개를 하나씩 차례대로 입력하세요.")
i = 0
mynumber = []
while i < Pnum:

    gue_number = input("{}번째 숫자를 입력하세요: ".format(i + 1))
    if gue_number.isdigit():
        gue_number = int(gue_number)
    elif gue_number == "exit":
        sys.exit(0)

    if gue_number > 9:
        print("범위를 벗어나는 숫자입니다. 다시 입력하세요.")
        continue
    if gue_number in mynumber:
        print("중복되는 숫자입니다. 다시 입력하세요. ")
    else:
        mynumber.append(gue_number)
        i += 1

return mynumber

입력받은 숫자만큼 배열이 돌아가게 Pnum을 넣어놨고 위에 있던 Pnum지역 변수를 전역변수로 바꿔서 첫번째에서 받은 입력 변수를 두번째 기능에서도 사용 가능하게 했다.

3번째 기능코드( 두 숫자를 비교하여 스트라이크 볼 갯수 출력하기)

def get_score(guess, solution):
strike_count = 0
ball_count = 0
i = 0

while i < len(guess):

    if guess[i] == solution[i]:
        strike_count += 1
        i += 1
    elif guess[i] in solution:
        ball_count += 1
        i += 1
    else:
        i += 1

return strike_count, ball_count

ANSWER = PC_numbers()
tries = 0

while 1:
GUESS = take_mynumber()
strike, ball = get_score(GUESS, ANSWER)

print("{}S {}B ".format(strike, ball))
tries +=1

if strike == Pnum:
    break

end_time = time.time()
print(f"정답입니다. {tries}번 만에 결과를 맞추셨습니다. 정답까지 걸린 시간 : {end_time - start_time:.5f}초입니다."
f"현재 시각은 :{datetime.now()}입니다.")

위에 while문은 배열의 위치와 숫자가 같을때, 숫자만 같을때 , 그 외 라는 조건문으로 코딩했다.

tries를 통해 스트라이크와 볼이 출력될때마다 숫자를 카운트해서 출력되게 하였다.

profile
중요한건 버그에게 꺾이지 않는 마음
post-custom-banner

0개의 댓글