"숫자야구는 겹치지 않는 세 숫자를 무작위로 정해 상대방이 그 숫자를 맞추는 게임이다"
여기서 본인은 '겹치지 않는다', '세 숫자를 무작위로 정한다'가 이번 코딩의 핵심이라고 생각함
먼저 무작위로 수를 정하기 위해 random 모듈을 불러옴
from random import *
import * 은 random 모듈에 모든 함수를 import 한다고 보면 된다.
이제 하나부터 차근차근 해보도록하자
일단 처음에 플레이어가 맞출 무작위 세 숫자를 불러오도록 함
a = list(range(0, 10))
answer = sample(a, 3)
0~9 범위를 가지는 리스트를 생성한 후
random모듈에 sample함수를 이용하여 list a에 세 숫자를 무작위로 추출함
이로써 플레이어가 맞출 숫자는 정해짐
이제 플레이어의 숫자를 입력받고
입력받은 숫자와 위에서 추출한 숫자를 비교하고
스트라이크와 볼 판단을 해야 함
count = 0
while True: # 플레이어가 정답을 맞추기 전까지 계속 반복
strike = 0
ball = 0 # 입력 할 때마다 스트라이크, 볼 값은 계속 바뀜
user = input("세 숫자를 입력하세요: ")
try: # 플레이어가 세 숫자가 아닌 다른것을 입력 할 때 예외처리
if len(user) != 3:
raise ValueError # 숫자가 세자리가 아니면 ValueError 발생시킴
f = int(user[0])
s = int(user[1])
t = int(user[2]) #수 비교를 위해 type을 정수형(int)으로 변환
if f == s or f == t or s == t:
raise ValueError # 중복되는 숫자를 입력할시 ValueError 발생시킴
except ValueError: # ValueError발생시 실행할 코드
print("다시 입력하세요")
continue
print("입력한 숫자는 {}입니다".format(user))
if f == answer[0]:
strike += 1
elif f == answer[1] or f == answer[2]:
ball += 1
if s == answer[1]:
strike += 1
elif s == answer[0] or s == answer[2]:
ball += 1
if t == answer[2]:
strike += 1
elif t == answer[0] or t == answer[1]:
ball += 1 # 하나하나 비교하며 스트라이크 볼 판단
if strike != 3:
print("{} 스트라이크, {} 볼 입니다".format(strike, ball))
count += 1 # 한번 입력할 때마다 카운트 1씩 증가
elif strike == 3:
count += 1
break # 3스트라이크면 반복문 탈출
print("{} 정답입니다. {}번만에 맞추셨습니다.".format(user, count))
위 코드를 요약하자면
1. 반복문(While)을 이용해 플레이어가 정답을 맞힐 때까지 반복해주고 정답을 맞히면 break를 통해 반복문 탈출
2. 예외 처리(try excep)를 이용해 플레이어가 잘못된 값( 문자, 중복 숫자 등)을 입력하면 재입력하라는 문구 출력
3. 조건문(if, elif)을 이용해 플레이어가 입력한 수와 위에서 만든 answer를 비교하여 ball, strike값 조정
4. 마지막으로 몇 번 만에 맞췄는지 출력해주면서 마무리
이렇게 마무리된 게임을 txt 파일에 기록으로 남겨보자
먼저 파이썬과 같은 파일에 메모장을 하나 만들어 이와 같이 입력해 준다.
이름 + (Tab키) + 횟수 + (Enter키) 다 스페이스바는 사용하지 않는다.
이제 게임이 끝나면 플레이어의 이름을 입력받아 메모장에 저장해보자
name = input("성함을 입력하세요: ")
with open("score.txt", "a", encoding="utf8") as score: #score.txt를 a모드로 연다.
score.write("{}\t{}\n".format(name, count)) #플레이어의 이름과 횟수 쓰기
"a" 모드는 파일을 쓰기 위해 열고 파일의 끝에 이어서 추가하는 모드다.
이름과 횟수 사이를 Tab(\t)으로 구분하고 Enter(\n)을 입력해줌
이렇게 실행시키면 아래와 같이 잘 입력되는 것을 볼 수 있다.
이제 마지막으로 플레이어들의 기록을 불러와보자
with open("score.txt", "r", encoding="utf8") as score: #"r"모드로 score.txt 파일을 연다
print("\n현재까지의 플레이어 기록입니다\n")
print(score.read()) #sceor.txt파일의 내용을 읽음
"r" 모드는 파일을 읽기용으로 여는 모드다.
이러면 지금까지의 모든 플레이어들의 기록들이 다 불러와지는 것을 볼 수 있다.
모든 코드를 한 번에 보면 이와 같다.
from random import *
a = list(range(0, 10))
answer = sample(a, 3)
count = 0
while True:
strike = 0
ball = 0
user = input("3자리 숫자를 입력하세요: ")
try:
if len(user) != 3:
raise ValueError
f = int(user[0])
s = int(user[1])
t = int(user[2])
if f == s or f == t or s == t:
raise ValueError
except ValueError:
print("다시 입력하세요")
continue
print("입력한 숫자는 {}입니다".format(user))
if f == answer[0]:
strike += 1
elif f == answer[1] or f == answer[2]:
ball += 1
if s == answer[1]:
strike += 1
elif s == answer[0] or s == answer[2]:
ball += 1
if t == answer[2]:
strike += 1
elif t == answer[0] or t == answer[1]:
ball += 1
if strike != 3:
print("{} 스트라이크, {} 볼 입니다".format(strike, ball))
count += 1
elif strike == 3:
count += 1
break
print("{} 정답입니다. {}번만에 맞추셨습니다.".format(user, count))
name = input("성함을 입력하세요: ")
with open("score.txt", "a", encoding="utf8") as score:
score.write("{}\t\t{}\n".format(name, count))
with open("score.txt", "r", encoding="utf8") as score:
print("\n현재까지 플레이어들의 기록입니다.\n")
print(score.read())
이로써 숫자야구 프로그램 완성-!