نحوه ساخت بازی دوز با پایتون
-
تعریف تخته بازی: ابتدا باید یک تخته بازی دوز با ابعاد 3×3 ایجاد کنید. میتوانید از لیست یا ماتریس در پایتون برای این کار استفاده کنید.
-
نمایش تخته بازی: تخته بازی را به صورت گرافیکی یا متنی نمایش دهید تا بازیکنان بتوانند حرکات خود را روی آن انجام دهند.
-
تعریف بازیکنها: دو بازیکن برای بازی دوز نیاز داریم. میتوانید از رشتهها (String) برای نمایش نام بازیکنها استفاده کنید.
-
نوبتها و حرکات: نوبتها را تعریف کنید و به تناوب به بازیکنها اجازه دهید حرکت کنند. برای ذخیره حرکات و وضعیت بازی، میتوانید از لیستها و دیکشنریها استفاده کنید.
-
بررسی برنده: برای بررسی آیا یکی از بازیکنها برنده شده است یا بازی مساوی شده است، باید قوانین بازی دوز را پیادهسازی کنید.
-
پایان بازی: بازی را به پایان برسانید و نمایش بدهید که کدام بازیکن برنده شده است یا بازی مساوی شده است.
-
منوی بازی مجدد: امکان بازی مجدد یا خروج از بازی را به بازیکنها ارائه دهید.
-
استفاده از حلقه: برنامه را در یک حلقه قرار دهید تا بازیکنان بتوانند به تناوب حرکات خود را انجام دهند تا بازی به پایان برسد.
در اینجا یک نمونه ساده بازی دوز با پایتون به صورت گرافیکی با استفاده از 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()
|
-
import tkinter as tk
: در این خط، کتابخانه Tkinter وارد میشود و به عنوانtk
وارد برنامه میشود. -
from tkinter import messagebox
: از ماژولmessagebox
کتابخانه Tkinter، تابعmessagebox
را وارد میکنیم تا بتوانیم پنجرههای پیام را نمایش دهیم. -
def check_winner(board, player):
: تعریف تابعcheck_winner
برای بررسی برنده بودن یک بازیکن در بازی دوز. این تابع مختصراً تعیین میکند آیا یک بازیکن برنده است یا خیر. -
def check_draw(board):
: تابعcheck_draw
برای بررسی تساوی بازیکنان در بازی دوز. -
def make_move(idx):
: تعریف تابعmake_move
برای انجام حرکت بازیکن در صورتی که حرکت معتبر باشد. این تابع همچنین نوبت بازیکن را تغییر میدهد. -
def restart_game():
: تابعrestart_game
برای شروع مجدد بازی استفاده میشود. -
root = tk.Tk()
: ایجاد یک پنجره اصلی برای نمایش بازی. -
root.title("بازی دوز")
: تنظیم عنوان پنجره بازی. -
board = [" " for _ in range(9)]
: تعریف تخته بازی با استفاده از لیستی که همه مقادیر آن ” ” (فاصله) هستند. -
current_player = "X"
: تعیین بازیکنی که نوبت اوست (شروع بازی با بازیکن “X”). -
game_over = False
: متغیری برای نگهداشتن وضعیت بازی (آیا بازی به پایان رسیده است یا نه). -
winning_combinations = [...]
: تعریف ترکیبات برنده در بازی دوز (سه خانه پیاپی که اگر بازیکن مشابه در آنها قرار بگیرد، برنده میشود). -
ایجاد دکمههای بازی در تخته بازی و انتساب تابع
make_move
به هر دکمه. -
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_game
به آن. -
restart_button.grid(row=4, column=0, columnspan=3)
: قرار دادن دکمه شروع مجدد در پنجره بازی. -
root.mainloop()
: شروع نمایش پنجره اصلی و ورود به حلقه اصلی Tkinter برای نمایش بازی و واکشی رخدادها.
در اینجا توضیح معنی اصطلاحات و مفاهیمی که در توضیح کدها به کار رفته است آمده است:
-
Tkinter: یک کتابخانه در پایتون برای ایجاد رابطهای گرافیکی کاربری است. Tkinter یک مجموعه از ویجتها (مانند دکمهها، برچسبها و فریمها) را برای ایجاد برنامههای گرافیکی فراهم میکند.
-
تابع (Function): یک بخش از کد که وظیفهای خاص را اجرا میکند. توابع در این کد برای انجام عملیاتهای خاص مانند بررسی برنده بودن و انجام حرکت بازیکنان استفاده شدهاند.
-
لیست (List): یک دادهساختار در پایتون که میتواند شامل تعدادی عنصر (مانند رشتهها یا اعداد) باشد. در این کد، یک لیست برای نمایش تخته بازی و وضعیت هر خانه استفاده شده است.
-
متغیر (Variable): یک نام داده شده به یک مقدار که در طول اجرای برنامه میتواند تغییر کند. متغیرها برای نگهداشتن وضعیت بازیکنان و وضعیت بازی استفاده شدهاند.
-
تابع
grid()
: یکی از متدهای Tkinter برای قرار دادن ویجتها در قسمتهای مختلف پنجره است. این تابع برای قرار دادن دکمهها و برچسبها در پنجره بازی استفاده شده است. -
command
در دکمهها: این ویژگی دکمهها در Tkinter به شما امکان میدهد تا تابع مشخصی را وقتی که دکمه فشرده میشود اجرا کنید. در اینجا، تابعmake_move
به عنوان وظیفه انجام حرکت بازیکنان به دکمهها اختصاص داده شده است. -
پنجره اصلی (Main Window): پنجره ای که برنامه از آن شروع میشود و اجزای گرافیکی به آن اضافه میشوند. در اینجا،
root
به عنوان پنجره اصلی استفاده شده است. -
پنجره پیام (Message Box): یک پنجره کوچک برای نمایش پیامهای کاربر استفاده میشود. در اینجا
messagebox
برای نمایش پیامهای برنده شدن یا تساوی در بازی دوز استفاده شده است. -
فریم (Frame): یک ویجت Tkinter که به عنوان یک محیط جداگانه برای قرار دادن دیگر ویجتها در پنجره استفاده میشود. در این کد، از فریم استفاده نشده است.
-
Label: یک ویجت Tkinter برای نمایش متن یا برچسبها در پنجره استفاده میشود. در این کد برای نمایش نوبت بازیکن فعلی استفاده شده است.
-
Button: یک ویجت Tkinter برای ایجاد دکمهها استفاده میشود. در این کد، دکمهها برای انجام حرکت بازیکنان و شروع مجدد بازی استفاده شدهاند.
-
mainloop()
: یک متد Tkinter برای شروع حلقه اصلی برنامه و نمایش پنجره اصلی استفاده میشود. این تابع برنامه را به حالت اجرای مستمر میبرد و از رخدادها در پنجره پاسخ میدهد.