آموزش گامبهگام ساخت بازی دوز (Tic Tac Toe) با پایتون

🕹️ آموزش گامبهگام ساخت بازی دوز (Tic Tac Toe) با پایتون
ساخت بازی دوز با پایتون یکی از پروژههای جذاب و آموزشی برای علاقهمندان به برنامهنویسی است. این بازی به شما کمک میکند تا مفاهیم پایهای مثل حلقهها، لیستها، توابع و رابط گرافیکی (GUI) را بهتر یاد بگیرید. در این آموزش، یاد میگیرید چگونه یک بازی دوز ساده و گرافیکی با استفاده از کتابخانه Tkinter طراحی کنید.
🧩 مرحله ۱: ایجاد تخته بازی دوز
در ابتدا باید یک تخته ۳×۳ بسازید. برای این کار میتوانید از لیست یا ماتریس در پایتون استفاده کنید تا موقعیت خانههای بازی را ذخیره کنید:
board = [" " for _ in range(9)]
🖥️ مرحله ۲: نمایش تخته بازی
برای نمایش تخته بازی میتوانید از محیط متنی (کنسول) یا رابط گرافیکی استفاده کنید. در این پروژه از Tkinter بهره میبریم تا دکمههایی برای هر خانه بازی بسازیم.
👥 مرحله ۳: تعریف بازیکنان
بازی دوز از دو بازیکن تشکیل میشود. برای سادگی، بازیکن اول با نماد "X" و بازیکن دوم با "O" مشخص میشود:
current_player = "X"
🔁 مرحله ۴: تعریف نوبتها و حرکات بازیکنان
در هر نوبت، بازیکن فعلی باید یکی از خانههای خالی را انتخاب کند. با هر حرکت، وضعیت تخته بهروزرسانی میشود و نوبت بازیکن تغییر میکند.
🏆 مرحله ۵: بررسی برنده یا مساوی شدن بازی
با هر حرکت جدید، باید بررسی کنیم آیا بازیکنی برنده شده است یا خیر. ترکیبهای برنده شامل سه خانهی افقی، عمودی یا مورب هستند:
winning_combinations = [
(0, 1, 2), (3, 4, 5), (6, 7, 8),
(0, 3, 6), (1, 4, 7), (2, 5, 8),
(0, 4, 8), (2, 4, 6)
]
🕹️ مرحله ۶: افزودن قابلیت بازی مجدد
پس از پایان بازی (چه با برد و چه مساوی)، باید گزینهای برای شروع مجدد به بازیکنان داده شود:
def restart_game():
global board, current_player, game_over
board = [" " for _ in range(9)]
for button in buttons:
button.config(text=" ", state=tk.NORMAL)
current_player = "X"
label.config(text="نوبت: X")
game_over = False
💻 نمونه کد کامل بازی دوز با Tkinter
در کد زیر، تمام مراحل بالا در قالب یک پروژه کامل آورده شده است:
import tkinter as tk
from tkinter import messagebox
def check_winner(board, player):
for combo in winning_combinations:
if all([board[i] == player for i in combo]):
return True
return False
def check_draw(board):
return " " not in board
def make_move(idx):
global current_player, game_over
if board[idx] == " " and not game_over:
board[idx] = current_player
buttons[idx].config(text=current_player, state=tk.DISABLED)
if check_winner(board, current_player):
messagebox.showinfo("برنده!", f"{current_player} برنده شد!")
game_over = True
elif check_draw(board):
messagebox.showinfo("مساوی!", "بازی مساوی شد!")
game_over = True
else:
current_player = "O" if current_player == "X" else "X"
label.config(text=f"نوبت: {current_player}")
def restart_game():
global board, current_player, game_over
board = [" " for _ in range(9)]
for button in buttons:
button.config(text=" ", state=tk.NORMAL)
current_player = "X"
label.config(text="نوبت: X")
game_over = False
root = tk.Tk()
root.title("بازی دوز")
board = [" " for _ in range(9)]
current_player = "X"
game_over = False
winning_combinations = [
(0, 1, 2), (3, 4, 5), (6, 7, 8),
(0, 3, 6), (1, 4, 7), (2, 5, 8),
(0, 4, 8), (2, 4, 6)
]
buttons = []
for i in range(9):
row = i // 3
col = i % 3
button = tk.Button(root, text=" ", font=("Arial", 24), width=6, height=2, command=lambda i=i: make_move(i))
button.grid(row=row, column=col)
buttons.append(button)
label = tk.Label(root, text=f"نوبت: {current_player}", font=("Arial", 16))
label.grid(row=3, column=0, columnspan=3)
restart_button = tk.Button(root, text="شروع مجدد", font=("Arial", 16), width=20, height=2, command=restart_game)
restart_button.grid(row=4, column=0, columnspan=3)
root.mainloop()
🧠 مفاهیم کلیدی در این پروژه
- Tkinter: کتابخانهای برای طراحی رابط کاربری در پایتون.
- Function (تابع): بخشی از کد برای انجام یک وظیفه خاص.
- List (لیست): ساختاری برای ذخیره مجموعهای از دادهها.
- Variable (متغیر): مقداری که در طول اجرای برنامه قابل تغییر است.
- Grid(): متدی در Tkinter برای چیدمان عناصر در پنجره.
- MessageBox: پنجرههای پاپآپ برای نمایش پیامها.
✅ نتیجهگیری
با انجام مراحل بالا، شما توانستید یک بازی دوز کامل با پایتون و Tkinter بسازید. این پروژه میتواند مقدمهای عالی برای ورود به طراحی بازیهای سادهتر و یادگیری مفاهیم برنامهنویسی پیشرفتهتر باشد.