본문 바로가기

코딩 공부/파이썬

파이썬 틱택토 ai 코드

파이썬 틱택토 코드

목차

1. 틱택토 게임 설명
2. 절때 지지 않는 AI 틱택토
3. 친구랑 플레이 가능한 틱택토
4. 틱택토 후기

 


 

 

틱택토 게임 설명

 

틱택토는 두 명이 번갈아 가며 3x3 격자판에 "X"나 "O"를 표시하여, 세 개의 기호를 일렬로 만드는 게임입니다. 게임의 목표는 가로, 세로, 또는 대각선 방향으로 세 개의 같은 기호를 연결하는 것입니다. 시작할 때, 게임판은 비어 있으며, 두 사람은 각각 "X"와 "O"를 사용하여 빈 칸에 차례대로 기호를 놓습니다. 게임은 간단한 규칙으로 진행되며, 첫 번째 플레이어는 "X"를, 두 번째 플레이어는 "O"를 선택합니다. 각 플레이어는 한 번에 하나의 칸을 선택해 기호를 놓습니다. 누군가가 세 개의 기호를 가로, 세로, 대각선 중 어느 한 줄에 맞추면 승리하게 되며, 모든 칸이 차면 비기게 됩니다. 게임은 끝나지 않고 계속 진행될 수도 있지만, 더 이상 빈 칸이 없으면 무승부로 끝납니다.틱택토의 가장 큰 특징은 매우 단순한 규칙을 가지고 있음에도 불구하고, 전략적인 사고를 요구한다는 점입니다. 예를 들어, 첫 번째 플레이어가 가운데 칸을 선택하면 승리할 확률이 높아지며, 두 번째 플레이어는 상대의 승리를 막는 전략을 세워야 합니다. 이러한 점에서 틱택토는 어린이부터 성인까지 누구나 즐길 수 있는 게임입니다. 게임의 장점은 종이와 펜만 있으면 어디서든 간단하게 즐길 수 있다는 것입니다. 또한, 게임을 통해 전략적 사고를 기를 수 있어 교육적인 측면에서도 활용됩니다.


 

 

AI 가 지지 않는 틱택토 게임 코드

 

최소 무승부 인 틱택토 ai 게임 코드입니다.

 

import tkinter as tk
from tkinter import messagebox
import random

# 게임 상태 초기화
current_player = "X"
board = [["" for _ in range(3)] for _ in range(3)]

# 게임 종료 여부 확인
def check_winner():
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] != "":
            return board[i][0]
        if board[0][i] == board[1][i] == board[2][i] != "":
            return board[0][i]
   
    if board[0][0] == board[1][1] == board[2][2] != "":
        return board[0][0]
    if board[0][2] == board[1][1] == board[2][0] != "":
        return board[0][2]
   
    return None

# 버튼 클릭 시 동작
def button_click(row, col):
    global current_player
    if board[row][col] == "":
        board[row][col] = current_player
        buttons[row][col].config(text=current_player, fg="white", bg="lightblue", font=("Helvetica", 18))
       
        winner = check_winner()
        if winner:
            messagebox.showinfo("게임 종료", f"{winner} 승리!")
            reset_game()
        elif all(board[i][j] != "" for i in range(3) for j in range(3)):
            messagebox.showinfo("게임 종료", "무승부!")
            reset_game()
        else:
            current_player = "O" if current_player == "X" else "X"
            if current_player == "O":  # AI의 턴
                ai_play()

# 게임 리셋
def reset_game():
    global current_player, board
    current_player = "X"
    board = [["" for _ in range(3)] for _ in range(3)]
    for row in range(3):
        for col in range(3):
            buttons[row][col].config(text="", fg="black", bg="white")

# 게임 설명
def show_instructions():
    messagebox.showinfo("게임 설명", "틱택토 게임은 3x3 보드에서 3개의 연속된 X 또는 O를 만들면 승리입니다. 이 프로그램은 ai가 절대 지지 않습니다.")

# 게임 종료
def quit_game():
    root.quit()

# AI가 최적의 수를 찾기 위한 미니맥스 알고리즘
def minimax(board, depth, is_maximizing):
    winner = check_winner()
    if winner == "O":
        return 1
    elif winner == "X":
        return -1
    elif all(board[i][j] != "" for i in range(3) for j in range(3)):
        return 0
   
    if is_maximizing:
        best = -float("inf")
        for i in range(3):
            for j in range(3):
                if board[i][j] == "":
                    board[i][j] = "O"
                    best = max(best, minimax(board, depth + 1, False))
                    board[i][j] = ""
        return best
    else:
        best = float("inf")
        for i in range(3):
            for j in range(3):
                if board[i][j] == "":
                    board[i][j] = "X"
                    best = min(best, minimax(board, depth + 1, True))
                    board[i][j] = ""
        return best

# AI가 최적의 수를 두는 함수
def ai_play():
    best_value = -float("inf")
    best_move = None
    for i in range(3):
        for j in range(3):
            if board[i][j] == "":
                board[i][j] = "O"
                move_value = minimax(board, 0, False)
                board[i][j] = ""
                if move_value > best_value:
                    best_value = move_value
                    best_move = (i, j)
   
    if best_move:
        row, col = best_move
        board[row][col] = "O"
        buttons[row][col].config(text="O", fg="white", bg="lightgreen", font=("Helvetica", 18))
        winner = check_winner()
        if winner:
            messagebox.showinfo("게임 종료", f"{winner} 승리!")
            reset_game()
        elif all(board[i][j] != "" for i in range(3) for j in range(3)):
            messagebox.showinfo("게임 종료", "무승부!")
            reset_game()
        else:
            global current_player
            current_player = "X"

# AI와 플레이 시작
def start_ai_game():
    reset_game()
    global current_player
    current_player = "X"
    ai_play()

# 친구와 플레이 시작
def start_friend_game():
    reset_game()
    global current_player
    current_player = "X"

# GUI 설정
root = tk.Tk()
root.title("ai가 지지 않는 틱택토 게임")

# 게임 판 크기 조정
window_width = 650
window_height = 415
root.config(bg="#f0f0f0")

root.geometry(f"{window_width}x{window_height}")
root.resizable(False, False)  # 창 크기 조정 비활성화

# 화면 가운데로 창 배치
screen_width = root.winfo_screenwidth()  # 화면의 가로 크기
screen_height = root.winfo_screenheight()  # 화면의 세로 크기

# 계산된 위치 값으로 창을 중앙에 배치
position_top = (screen_height // 2) - (window_height // 2)
position_left = (screen_width // 2) - (window_width // 2)

root.geometry(f"{window_width}x{window_height}+{position_left}+{position_top}")
root.resizable(False, False)  # 창 크기 조정 비활성화

root.config(bg="#f0f0f0")

buttons = [[None for _ in range(3)] for _ in range(3)]

# 게임판 버튼 배치
for row in range(3):
    for col in range(3):
        buttons[row][col] = tk.Button(root, text="", width=8, height=4, font=("Helvetica", 18),
                                      relief="solid", bd=2, command=lambda row=row, col=col: button_click(row, col))
        buttons[row][col].grid(row=row, column=col, padx=5, pady=5)

# 메뉴 버튼 (우측에 배치)
menu_frame = tk.Frame(root, bg="#f0f0f0")
menu_frame.grid(row=0, column=3, rowspan=3, padx=10, pady=10)

ai_button = tk.Button(menu_frame, text="AI가 먼저 플레이", width=20, height=2, font=("Helvetica", 14), bg="#4CAF50", fg="white", relief="solid", bd=2, command=start_ai_game)
ai_button.grid(row=0, column=0, pady=5)

friend_button = tk.Button(menu_frame, text="내가 플레이", width=20, height=2, font=("Helvetica", 14), bg="#2196F3", fg="white", relief="solid", bd=2, command=start_friend_game)
friend_button.grid(row=1, column=0, pady=5)

instructions_button = tk.Button(menu_frame, text="게임 설명", width=20, height=2, font=("Helvetica", 14), bg="#FF9800", fg="white", relief="solid", bd=2, command=show_instructions)
instructions_button.grid(row=2, column=0, pady=5)

quit_button = tk.Button(menu_frame, text="게임 종료", width=20, height=2, font=("Helvetica", 14), bg="#F44336", fg="white", relief="solid", bd=2, command=quit_game)
quit_button.grid(row=3, column=0, pady=5)

root.mainloop()

 

 


 

 

친구와 플레이가 가능한 틱택토 코드

 

import tkinter as tk
from tkinter import messagebox

# 게임 상태 초기화
current_player = "X"
board = [["" for _ in range(3)] for _ in range(3)]

# 게임 종료 여부 확인
def check_winner():
    for i in range(3):
        if board[i][0] == board[i][1] == board[i][2] != "":
            return board[i][0]
        if board[0][i] == board[1][i] == board[2][i] != "":
            return board[0][i]
   
    if board[0][0] == board[1][1] == board[2][2] != "":
        return board[0][0]
    if board[0][2] == board[1][1] == board[2][0] != "":
        return board[0][2]
   
    return None

# 버튼 클릭 시 동작
def button_click(row, col):
    global current_player
    if board[row][col] == "":
        board[row][col] = current_player
        button_color = "red" if current_player == "X" else "blue"
        buttons[row][col].config(text=current_player, fg="white", bg=button_color, font=("Helvetica", 18))
       
        winner = check_winner()
        if winner:
            messagebox.showinfo("게임 종료", f"{winner} 승리!")
            reset_game()
        elif all(board[i][j] != "" for i in range(3) for j in range(3)):
            messagebox.showinfo("게임 종료", "무승부!")
            reset_game()
        else:
            current_player = "O" if current_player == "X" else "X"

# 게임 리셋
def reset_game():
    global current_player, board
    current_player = "X"
    board = [["" for _ in range(3)] for _ in range(3)]
    for row in range(3):
        for col in range(3):
            buttons[row][col].config(text="", fg="black", bg="white")

# 게임 설명
def show_instructions():
    messagebox.showinfo("게임 설명", "틱택토 게임은 3x3 보드에서 3개의 연속된 X 또는 O를 만들면 승리입니다.")

# 게임 종료
def quit_game():
    root.quit()

# 친구와 플레이 시작
def start_friend_game():
    reset_game()
    global current_player
    current_player = "X"

# GUI 설정
root = tk.Tk()
root.title("친구와 함께하는 틱택토 게임")

# 게임 판 크기 조정
window_width = 650
window_height = 415
root.config(bg="#f0f0f0")

root.geometry(f"{window_width}x{window_height}")
root.resizable(False, False)  # 창 크기 조정 비활성화

# 화면 가운데로 창 배치
screen_width = root.winfo_screenwidth()  # 화면의 가로 크기
screen_height = root.winfo_screenheight()  # 화면의 세로 크기

# 계산된 위치 값으로 창을 중앙에 배치
position_top = (screen_height // 2) - (window_height // 2)
position_left = (screen_width // 2) - (window_width // 2)

root.geometry(f"{window_width}x{window_height}+{position_left}+{position_top}")
root.resizable(False, False)  # 창 크기 조정 비활성화

root.config(bg="#f0f0f0")

buttons = [[None for _ in range(3)] for _ in range(3)]

# 게임판 버튼 배치
for row in range(3):
    for col in range(3):
        buttons[row][col] = tk.Button(root, text="", width=8, height=4, font=("Helvetica", 18),
                                      relief="solid", bd=2, command=lambda row=row, col=col: button_click(row, col))
        buttons[row][col].grid(row=row, column=col, padx=5, pady=5)

# 메뉴 버튼 (우측에 배치)
menu_frame = tk.Frame(root, bg="#f0f0f0")
menu_frame.grid(row=0, column=3, rowspan=3, padx=10, pady=10)

friend_button = tk.Button(menu_frame, text="친구와 플레이", width=20, height=2, font=("Helvetica", 14), bg="#2196F3", fg="white", relief="solid", bd=2, command=start_friend_game)
friend_button.grid(row=0, column=0, pady=5)

instructions_button = tk.Button(menu_frame, text="게임 설명", width=20, height=2, font=("Helvetica", 14), bg="#FF9800", fg="white", relief="solid", bd=2, command=show_instructions)
instructions_button.grid(row=1, column=0, pady=5)

quit_button = tk.Button(menu_frame, text="게임 종료", width=20, height=2, font=("Helvetica", 14), bg="#F44336", fg="white", relief="solid", bd=2, command=quit_game)
quit_button.grid(row=2, column=0, pady=5)

root.mainloop()

 


 

 

틱택토 구현 후기

이번 프로젝트에서는 친구와 함께 플레이할 수 있는 틱택토 게임을 제작했습니다. 초기에는 AI와 플레이할 수 있는 기능을 추가했으나, 친구 간의 대전 모드로 변경하여 실제 대전 상황을 구현했습니다. 이를 위해 각 플레이어가 선택한 색상을 다르게 표시하도록 설정했으며, "X"는 빨간색, "O"는 파란색으로 구분하여 시각적으로 명확하게 보이도록 했습니다. 게임은 tkinter 라이브러리를 사용하여 GUI 환경에서 구현되었으며, 사용자 인터페이스도 직관적으로 배치하여 누구나 쉽게 플레이할 수 있게 했습니다. 버튼 클릭 시 게임 진행 상태가 실시간으로 업데이트되며, 승리 여부를 확인할 수 있는 메시지 박스를 통해 게임 종료 후 리셋도 자동으로 처리됩니다. 전체적으로 친구와 함께 즐길 수 있는 간단하지만 재미있는 게임을 만들어 보람을 느꼈습니다.

반응형