파이썬 언어를 활용해서 간단한 게임 만들기
https://github.com/gusdh8380/PythonProject
숫자 야구 게임은 컴퓨터AI와 플레이어가 서로의 비밀의 수를 추측하고 추측한 수에 대한 스트라이크와 볼의 개수를 통해 추론하여 먼저 맞춘자가 승리하는 게임이다.
숫자 야구 게임 프로젝트의 가장 큰 목표는 숫자 추리 및 추축 알고리즘을 개발하여 컴퓨터AI의 적절한 난이도 조절을 구현하는 것이다.
게임에 대한 내용은 git에 정리하였다.
AI 클래스 구현
class NumberBaseballAI:
def __init__(self, length, unique, difficulty): #게임의 설정 초기화
self.length = length # 숫자의 길이
self.unique = unique # 중복숫자여부
self.difficulty = difficulty #난이도
# 가능한 모든 숫자 조합을 생성하여 후보 숫자 목록, 즉 AI가 현재 고려하고 있는 후보 숫자 목록
self.candidates = generate_combinations(length, unique)
self.history = [] # AI의 추측 기록을 저장하는 리스트
def make_guess(self):
if self.difficulty == "쉬움":
return self.make_guess_easy()
elif self.difficulty == "보통":
return self.make_guess_middle()
elif self.difficulty == "어려움":
return self.make_guess_hard()
#
def make_guess_easy(self):
if random.random() < 0.5: # 50% 확률로 무작위 추측
return generate_random_number(self.length, self.unique)
if self.history: # 이전 추측 결과를 저장한 리스트, 비어있지 않다면
last_guess, last_strike, last_ball = self.history[-1] #마지막 추측의 결과를 가져와서
possible_candidates = [g for g in self.candidates if calculate_score(g, last_guess) == (last_strike, last_ball)]
# 현재 후보군인 self.candidates에서 마지막 추측 같은 스트라이크와 볼 결과를 갖는 후보들만 필터링하여 possible_candidates 리스트에 저장
if possible_candidates:
self.candidates = possible_candidates
else:
self.candidates = generate_combinations(self.length, self.unique)
return random.choice(self.candidates) if self.candidates else generate_random_number(self.length, self.unique)
# 후보 목록이 비워져 있지 않다면, random.choice(self.candidates)후보군에서 암거나 선택
def make_guess_middle(self):
# 힌트를 덜 효과적으로 사용하도록 무작위성을 추가
if random.random() < 0.3: # 30% 확률로 무작위 추측, 쉬움 난이도와 성능차이를 위해
return generate_random_number(self.length, self.unique)
if self.history: # 이전 추측 결과를 저장한 리스트
last_guess, strike, ball = self.history[-1]
# 일부 힌트를 무시하고 필터링
possible_candidates = [g for g in self.candidates if calculate_score(g, last_guess) == (strike, ball)]
if possible_candidates:
self.candidates = possible_candidates
else:
self.candidates = generate_combinations(self.length, self.unique)
return random.choice(self.candidates) if self.candidates else generate_random_number(self.length, self.unique)
def make_guess_hard(self):
# if random.random() < 0: # 0% 확률로 무작위 추측, 없어도 되기에 주석처리
# return generate_random_number(self.length, self.unique)
if self.history:
last_guess, last_strike, last_ball = self.history[-1]
possible_candidates = [g for g in self.candidates if calculate_score(g, last_guess) == (last_strike, last_ball)]
if possible_candidates:
self.candidates = possible_candidates
else:
self.candidates = generate_combinations(self.length, self.unique)
return random.choice(self.candidates) if self.candidates else generate_random_number(self.length, self.unique)
def receive_feedback(self, guess, strike, ball):
self.history.append((guess, strike, ball))
AI의 추론 능력을 난이도에 맞게 구현하는 부분에서,
<aside> 💡 if random.random() < 1/AI의 정확도:
</aside>
위 코드를 통해 구현하였다.