본문 바로가기
Python

[클린 코드 이제는 파이썬이다] : 틱택토 게임 코드 에러

by Yuchulnote 2023. 10. 27.
728x90

비 객체 지향 틱택토 게임 코드와 객체 지향 틱텍토 게임 코드 모두 같은 타일에 여러번 둘 수 있는 에러가 있습니다.
추가로 객체 지향 코드에서는 아예 틀린 부분이 존재해서 제보를 한 김에 정리합니다!

isValidSpace 함수의 return 문을 수정함으로써 해결이 가능합니다!
 
에러라고 하기엔 뭐하지만
비 객체 지향코드에서 게임 진행 자체는 되기는 합니다. 다만 같은 타일에 여러번 두는 것은 안되므로 해결해보았는데요!
 

[비 객체 지향 코드]

def isValidSpace(board, space):
    """board의 space가 유효한 칸 번호이며, 그 칸이 비어 있을 경우
    True를 반환한다."""
    # return 0 < int(space) < 10 and (space in ALL_SPACES or board[space] == BLANK)
    return space in ALL_SPACES and board[space] == BLANK

책에 나와 있는 주석 부분을 위와 같이 수정해야 같은 타일에 중복으로 둘 수 있는 에러를 해결 할 수 있습니다.

추가로 에러는 아니지만, 부드러운 게임 진행을 위해 main문을 아래와 같이 수정하였습니다.

def main():
    """틱택토 게임을 실행한다."""
    print("틱택토 게임에 오신 당신을 환영합니다!")
    gameBoard = getBlankBoard()  # 틱택토 말판 딕셔너리를 생성한다.
    currentPlayer, nextPlayer = X, O  # X가 선공, O가 후공

    while True:
        print(getBoardStr(gameBoard))  # 화면에 말판을 표시한다

        # 플레이어가 1-9 사이 숫자를 입력할 때까지 계속해서 요청한다
        move = 0
        while not isValidSpace(gameBoard, move):
            print(f"{currentPlayer}의 움직임은?(1-9)")
            move = input()
            if move in ALL_SPACES and gameBoard[move] != BLANK:
                print("같은 타일을 선택할 수 없습니다!")

[객체 지향 코드]

객체 지향 버전 코드에서는 찐 에러가 있네요

def isValidSpace(self, space):
        """이 말판의 space가 칸을 가리키는 유효한 번호이며, 칸이 비어 있을 경우
        True를 반환한다."""
        # return 0 < int(space) < 10 and (space in ALL_SPACES or board[space] == BLANK)
        return space in ALL_SPACES and self._spaces[space] == BLANK

class 내의 함수이기 때문에 애초에 int(space), board[space] 처럼 사용이 불가능한데, 책에 떡하니 적혀있습니다....
위 처럼 리턴문을 수정하면 같은 타일 중복 에러를 해결 가능합니다.

이번에도 매끄러운 게임 진행을 위해 main문을 아래와 같이 조금 손봤습니다.

def main():
    """틱택토 게임을 실행한다."""
    print("틱택토 게임에 오신 당신을 환영합니다!")
    gameBoard = TTTBoard()  # TTTBoard 객체를 생성한다
    currentPlayer, nextPlayer = X, O  # X가 선공, O가 후공

    while True:
        print(gameBoard.getBoardStr())  # 화면에 말판을 표시한다

        # 플레이어가 1-9 사이 숫자를 입력할 때까지 계속해서 요청한다
        move = None
        while not gameBoard.isValidSpace(move):
            print(f"{currentPlayer}의 움직임은?(1-9)")
            move = input()
            if move in ALL_SPACES and not gameBoard.isValidSpace(move):
                print("같은 타일을 선택할 수 없습니다.")

 

모두 즐코!

해결!

728x90
반응형