2. 해외선물/2-2. 해외선물 알고리즘 연구

(해외선물 자동매매 알고리즘) (2) 틱택톡 만들기 (컴퓨터와 대결)

봄이오네 2024. 1. 1. 08:09
반응형

 

목 차
1. 들어가며
2. 사전설명
3. 코드설명
4. 전체코드
5. 마치며

 
 

1. 들어가며

지난글에서는 2인용 틱택톡 만드는 코드(2인 대결) 구성을 알아보았다. x플레이어와 o플레이어를 번갈아서 게임을 하면 승/패와 무승부 3가지 경우를 생각하며서 코드를 작성하면 된다. 총 3가지 방법(3x3 공간 구성, 플레이어들의 입력데이터, 승패유무) 코드를 구성할 수 있으면, 이번글도 쉽게 이해를 할 것이다.
 
이번글에서는 임의로 인정하는 pc와의 대결을 통해 승/패, 무승부를 하는 방법을 알아볼 것이다. pc가 데이터를 입력할 수 있다면, 향후에는 지도학습을 통해 MCTS를 구성할 수 있을 것으로 생각된다.
 
코드출처는 아래와 같다. 
 ※ 틱택톡 코드 출처(tokyoEdtech님) : https://www.youtube.com/watch?v=7Djh-Cbgi0E
 


2. 사전설명

여기서 수정해야 하는 내용은 o플레이어가 1~9까지 입력하는 내용을 수정한다.
이전글에서 o플레이어는 수동으로 1~9까지 입력(input 함수)했다. 이 내용을 코드구성의 간결성을 위해 pc가 1~9까지 임의로 입력하도록 코드를 구성한다.
 


3. 코드설명

지난글과 중복되는 내용은 설명을 생략한다.
 

그림1. pc가 입력할 데이터를 정의한다.

 
55줄~65줄 : 컴퓨터의 행동을 입력한다.
56줄~59줄 : 당초 코드(tokyoEdtech님)에 들어가 있는 내용이다. o, x 플레이어가 번갈아가며 틱택톡을 진행할 때 쓰인다. 필자는 이글에서는 활용하지 않을 예정이다.
 
62줄~65줄 : 1~9칸이 빈칸(63줄)이면, 1~9까지 o플레이어는 3x3 공간에 순서대로 데이터를 빈칸에 넣어라. 유감스럽게도 랜덤(random)은 아니다.
 

그림2. pc가 입력하는 함수를 실행한다.

 
 
89줄~90줄 : 수동으로 데이터를 입력한 o플레이어의 "입력 코드"를 주석처리한다.
102줄~103줄 : 89줄~90줄에서 입력한 데이터를 3x3공간에서 입력한 내용을 주석처리한다.
105줄 : 55줄~65줄에서 정의한 함수에 "o"를 넣어서 실행한다.
 


4. 전체코드

전체코드는 아래와 같다.
 

더보기
class Board():
    def __init__(self):
        self.cells = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " "]

    def display(self):
        print()
        print(" %s | %s | %s " %(self.cells[1], self.cells[2], self.cells[3]))
        print("-----------")
        print(" %s | %s | %s " %(self.cells[4], self.cells[5], self.cells[6]))
        print("-----------")
        print(" %s | %s | %s " %(self.cells[7], self.cells[8], self.cells[9]))

    def print_header(self):
        print("Welcome to Tic-Tac-Toe")

    def refresh_screen(self):
        # clear the screen
        # os.system('cls')

        # print the header
        board.print_header()

        # show the board
        board.display()

    def update_cell(self, cell_no, player):
        if self.cells[cell_no] == " ":
            self.cells[cell_no] = player

    def who_is_winner(self, player):
        for combo in [[1,2,3], [4,5,6], [7,8,9], [1,4,7], [2,5,8], [3,6,9], [3,5,7], [1,5,9]]:
            self.result = True
            for cell_no in combo:
                if self.cells[cell_no] != player:
                    self.result = False

            if self.result == True:
                return True

        return False

    def reset_board(self):
        self.cells = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " "]

    def tie_game(self):
        used_cells = 0
        for cell in self.cells:
            if cell != " ":
                used_cells +=1
        if used_cells == 9:
            return True
        else:
            return False

    def ai_move(self, player):
        if player == "x":
            enemy = "o"
        if player == "o":
            enemy = "x"

        # choose random
        for i in range(1,10):
            if self.cells[i] == " ":
                self.update_cell(i, player)
                break

    def game_start(self):
        while True:
            board.refresh_screen()  # 스크린 새로 고치기
            #### 플레이어 #####
            # get x input
            x_choice = int(input("\nx) please choose 1-9. > "))

            # updata board
            board.update_cell(x_choice, "x")

            board.refresh_screen()  # 스크린 새로 고치기

            # check for an x win
            if board.who_is_winner("x") == True:
                print("\nx wins!\n")
                play_again = input("would you like to lpay again? (Y/N)").upper()
                if play_again == "Y":
                    board.reset_board()
                    continue
                else:
                    break

            ## get o input
            # o_choice = int(input("\no) please choose 1-9. > "))

            # check for a tie game
            if board.tie_game():
                print("\ntie game!\n")
                play_again = input("would you like to lpay again? (Y/N)").upper()
                if play_again == "Y":
                    board.reset_board()
                    continue
                else:
                    break

            # updata board
            # board.update_cell(o_choice, "o")

            board.ai_move("o")

            # check for an o win
            if board.who_is_winner("o") == True:
                print("\no wins!\n")
                play_again = input("would you like to lpay again? (Y/N)").upper()
                if play_again == "Y":
                    board.reset_board()
                    continue
                else:
                    break

if __name__ == "__main__":
    board = Board()

    board.game_start()

 


5. 마치며

지금까지 pc가 입력한 내용을 통해 틱택톡 대결을 하는 방법을 알아보았다. pc가 입력하는 1~9까지의 데이터를 랜덤으로 입력하게 구성했으면 조금더 그럴싸하게 보였을것 같다. 단조롭게 1~9까지 순서대로 pc가 입력하니 조금은 답답하기도 하다. 그래도, 머신러닝에서 말하는 지도학습을 어떻게 구성해야할지 조금은 감이 잡혀서 좋다.
 
다만, 필자가 최종적으로 구현하고 싶은 것은 MCTS를 활용한 승률이 높은 알고리즘을 구성이다. 쉽지 않을 것 같다. 일단 개인 기록용으로 틱택톡 구성코드를 작성해 보았다.
 
좌절은 하지 말자. 해외선물 수익을 내기 위해 이것저것 고민해보는 것도 나쁘지 않다. 지금 고민하는 것들이 언젠가 나에게 큰 수익으로 돌아올 것을 믿어 의심치 않는다. 기운내자! ^^
 

반응형