본문 바로가기

기타 잡 코딩

폴란드 테트리스를 플레이하는 AI를 만드는 방법

예전에 했던 잡코딩 중 하나를 소개하려 한다.

 

테트리스는 전세계에서 오랫동안 많은 사랑을 받은 고전 게임이다.

너무 유명하니까 자세한 설명은 생략한다.

 

게임의 목적은 5가지 모양으로 구성된 블록들을 통해

 

한 층을 빼곡히 채우도록 하면 점수를 얻는 간단한 게임이다.

 

게임 룰 자체는 간단하지만 빠른 속도와 T 스핀 등의 기술을 통해 많은 점수를 얻을 수 있는 만큼

 

테트리스 고인물도 전세계에 많이 분포해 있다. 

 

 

테트리스는 넷마블, tetris.io 등 다양한 플랫폼에서 할 수 있는데,

 

이번 시간에 만져볼 테트리스는 Online Poland Tetris로 정했다.

 

왜 이름이 폴란드 테트리스 인지는 모르겠다.

 

준비물은 폴란드 테트리스(TetrisOnlinePoland)와 pycharm(python IDE)

폴란드 테트리스 게임의 시작화면

 

게임을 키면 위 화면과 같이 나온다.

training을 가보자

Training 눌렀을 때의 화면

Training 버튼을 누르면 위 화면과 같이 나온다. 

 

단계가 높아질 수록 테트리스 블록의 속도가 빨라지기 때문에 어렵다

 

테트리스를 잘하는 친구가 13 레벨까지 플레이해서 위 화면처럼 보인다. 

 

실제 본인의 테트리스 실력은 대략 3~4 레벨 정도 된다.

 

시험삼아 테트리스를 해봤다.

 

엉망으로 두었지만 앞으로의 코딩에 있어서 해야할 여러가지 정보를 얻을 수 있었다.

 

첫번째, 총 블록의 가지 수는 총 7가지라는 것

 

두 번째, 넥스트에 보이는 부분을 통해 다음에 나올 블록의 정확한 종류를 파악할 수 있다는 것

세번째, 화살표 위 버튼을 누르면 항상 시계 방향으로 블록이 변화한다는 것.

 

python프로그램이 게임화면을 보고 상황을 판단할 수 있도록 전처리 코딩을 해보자.

 

if __name__ == "__main__":
    # finding windows handle of tetris
    windows_list = []
    toplist = []

    def enum_win(hwnd, result):
        win_text = win32gui.GetWindowText(hwnd)
        windows_list.append((hwnd, win_text))


    win32gui.EnumWindows(enum_win, toplist)

    game_hwnd = 0
    for (hwnd, win_text) in windows_list:
        if "TetrisOnline" in win_text:
            game_hwnd = hwnd

    # set to foreground
    win32gui.SetForegroundWindow(game_hwnd)
    # get image fr om the window
    position = win32gui.GetWindowRect(game_hwnd)
    
    while True:
        # Take screenshot
        screenshot = grab_screen(position)

위 코드는 TetrisOnline이라는 이름의 윈도우를 활성화시키고 캡쳐하는 코드이다.

 

grab_screen은 외부 사이트에서 가져온것으로, 추후에 설명하도록 하겠다.

 

screenshot은 아래와 같이 나온다.

 

 

게임화면이 잘 캡쳐된 것을 확인할 수 있다.

 

이제 화면 정보를 통해서 AI를 만들어보자

 

2부에서 계속