파이썬 틱택토 코드
목차
*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 환경에서 구현되었으며, 사용자 인터페이스도 직관적으로 배치하여 누구나 쉽게 플레이할 수 있게 했습니다. 버튼 클릭 시 게임 진행 상태가 실시간으로 업데이트되며, 승리 여부를 확인할 수 있는 메시지 박스를 통해 게임 종료 후 리셋도 자동으로 처리됩니다. 전체적으로 친구와 함께 즐길 수 있는 간단하지만 재미있는 게임을 만들어 보람을 느꼈습니다.