파이썬 언어를 활용해서 간단한 게임 만들기

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>

위 코드를 통해 구현하였다.