룰
- 랜덤으로 생성된 숫자에는 중복된 숫자가 있어서는 안된다.
- 숫자가 같고, 자리수가 같으면 Strike
- 숫자는 같지만 자리수가 다르면 Ball
- 랜덤으로 생성된 숫자를 모두 맞추면 게임 종료
베이스 코드
메인 코드
from GameData import Baseball
class GameMain:
def __init__(self):
self.gameList = []
def start(self):
while True:
print("1.게임시작")
print("2.통계")
print("0.종료")
sel = input("선택 : ")
if sel =="1":
self.gamestart()
elif sel=="2":
self.showStatistics()
else:
return
def gamestart(self):
b = Baseball()
b.start()
self.gameList.append(b)
def showStatistics(self):
for b in self.gameList:
print(b.computer)
for item in b.personList:
print(item["person"], item["strike"],
item["ball"], item["out"], b.count)
if __name__ == "__main__":
g = GameMain()
g.start()
게임 코드
import random
class Baseball:
def __init__(self):
self.computer = [-1, -1, -1, -1]
self.person = [-1, -1, -1, -1]
self.count=0
self.personList=[]
def init_computer(self):
cnt=1
while cnt<=3:
v = random.randint(0,9)
if v not in self.computer:
self.computer[cnt]=v
cnt +=1
def init_person(self):
s = input("숫자 3개(0~9사이의)를 입력하세요(예시 0 1 2)")
numberList = s.strip().split(" ")
self.person[1]=int( numberList[0])
self.person[2]=int( numberList[1])
self.person[3]=int( numberList[2])
def getResult(self):
strike=0
ball=0
out=0
for i in range(1, 4):
if self.person[i] in self.computer :
if self.computer[i] == self.person[i]:
strike+=1
else:
ball+=1
else:
out+=1
return strike, ball, out
def start(self):
flag = False
self.init_computer()
print(self.computer)
while flag==False and self.count<=5:
self.init_person()
strike, ball, out = self.getResult()
print(f"strike:{strike} bal:{ball} out:{out}")
self.personList.append(
{"person":[x for x in self.person],
"strike":strike, "ball":ball, "out":out})
if strike ==3:
flag=True
self.count+=1
if __name__ == "__main__":
b = Baseball()
b.start()
내가 수정한 코드
- 자리수를 입력받는다.
1-1. 중복이 없어야 하기 때문에 최대 10자리 숫자여야 한다.
1-2. 따라서 숫자의 개수가 1개 ~ 10개이어야 한다.
- 예측 숫자 체크
2-1. 예측 숫자가 정상적인지 확인할 때 입력된 숫자가 숫자인지 확인한다.
2-2. 입력한 숫자가 초기에 설정한 자리수와 같은지 확인한다.
(3자리수로 했으면 예측하는 숫자도 3자리여야 함)
- 스트라이크와 볼을 개별적으로 판단한다.
3-1. 중복되는 숫자를 넣었을 때 (random->123, predict->122) 2s, 2b이 나온다.
이것을 방지하기 위해 temp_list를 만들고 strike가 된 숫자는 제거하여 중복을 없앤다.
3-2. Ball를 확인할 때는 제거된 리스트(temp_list)를 가지고 비교하여 확인한다.
- 정답 기회는 자리수*2 번 만큼 제공한다.
메인 코드
from Baseball import BaseBall
class GameMain:
def __init__(self):
pass
def start(self):
while True:
print("1.게임시작")
print("2.통계")
print("0.종료")
sel = input("선택 : ")
sel_func = {'1': self.game_start, '2': self.game_record}
if sel == '0':
return
elif sel in sel_func.keys():
sel_func[sel]()
else:
print('잘못 입력하셨습니다.')
def game_start(self):
baseball = BaseBall()
while True:
NUM = input('자리수 입력: ')
NUM, isbreak = baseball.CheckCountNum(NUM)
if isbreak:
break
baseball.initNum(NUM)
baseball.start(NUM)
def game_record(self):
pass
if __name__ == '__main__':
g = GameMain()
g.start()
게임 코드
import random
class BaseBall:
def __init__(self):
self.computer = []
self.computer_temp_list = []
self.game_num = 0
self.display = []
self.strike_count = 0
self.ball_count = 0
def initNum(self, NUM):
self.computer = random.sample([0,1,2,3,4,5,6,7,8,9], NUM)
def CheckNum(self, num, NUM):
if num.isdigit():
if len(num) == NUM:
return 'break'
else:
print('자리수가 다릅니다.')
else:
print('잘못 입력하였습니다.')
return ''
def isBall(self, num):
for i in num:
i = int(i)
if i in self.computer_temp_list:
self.ball_count += 1
def isStrike(self, predict_num):
predict_temp_list = [int(i) for i in predict_num]
self.computer_temp_list = [i for i in self.computer]
for i, j in zip([int(i) for i in predict_num], self.computer):
if i == j:
self.strike_count += 1
predict_temp_list.remove(i)
self.computer_temp_list.remove(i)
return ''.join([str(i) for i in predict_temp_list])
def gameEnd(self):
if self.strike_count == 3:
print('종료')
return 'break'
else:
return ''
def CheckCountNum(self, num):
if num.isdigit():
if (int(num) < 11) and (int(num) >= 0):
return int(num), 'break'
else:
print('자리수를 벗어났습니다.')
return 0, ''
else:
print('잘못 입력하셨습니다.')
return 0, 0
def start(self, NUM):
for _ in range(NUM*2):
self.display = []
while True:
predict_num = input('숫자 입력')
isbreak = self.CheckNum(predict_num, NUM)
if isbreak:
break
predict_num = self.isStrike(predict_num)
isbreak = self.gameEnd()
if isbreak:
break
self.isBall(predict_num)
print(f'{self.strike_count} Strike, {self.ball_count} Ball')
self.strike_count = 0
self.ball_count = 0
if __name__ == '__main__':
baseball = BaseBall()
NUM = input('자리수 입력: ')
while True:
NUM, isbreak = baseball.CheckCountNum(NUM)
if isbreak:
break
baseball.initNum(NUM)
for _ in range(NUM*2):
baseball.display = []
while True:
predict_num = input('숫자 입력')
isbreak = baseball.CheckNum(predict_num)
if isbreak:
break
predict_num = baseball.isStrike(predict_num)
isbreak = baseball.gameEnd()
if isbreak:
break
baseball.isBall(predict_num)
print(f'{baseball.strike_count} Strike, {baseball.ball_count} Ball')
baseball.strike_count = 0
baseball.ball_count = 0