ساخت بازی شطرنج با پایتون+ آموزش ساخت بازی ماشین با پایتون
بازیسازی یکی از حوزههای پرطرفدار و محبوب در دنیای تکنولوژی است که هر روزه توسعهدهندگان بیشتری به آن جذب میشوند. در این مقاله، به بررسی کلی بازیسازی با زبان برنامهنویسی پایتون پرداخته و سپس دو پروژهی عملی برای ساخت بازیهای شطرنج و ماشین را معرفی خواهیم کرد. در هر بخش، مراحل طراحی، پیادهسازی، تست و بهینهسازی بهصورت جزئی بررسی میشود.
پایتون بهعنوان یکی از زبانهای برنامهنویسی محبوب و کاربرپسند، قابلیتهای فراوانی برای بازیسازی دارد. استفاده از پایتون به دلیل سادگی و قدرت آن در توسعه نرمافزارها، یکی از گزینههای جذاب برای علاقهمندان به بازیسازی محسوب میشود. با استفاده از کتابخانههای مختلفی همچون Pygame، میتوان بازیهای متنوعی را با پایتون ایجاد کرد.
بازیسازی نهتنها بهعنوان یک سرگرمی بلکه بهعنوان یک صنعت بزرگ و پررونق، اهمیت ویژهای در دنیای امروز دارد. با توجه به رشد روزافزون تکنولوژی و دستگاههای هوشمند، بازیهای رایانهای و موبایلی به یکی از مهمترین وسایل تفریحی تبدیل شدهاند. این امر موجب افزایش تقاضا برای توسعهدهندگان بازی و نرمافزارهای مرتبط شده است.
استفاده از پایتون برای ساخت بازی مزایای زیادی دارد. پایتون به دلیل سادگی و خوانایی بالا، یادگیری و استفاده از آن بسیار راحت است. علاوه بر این، وجود کتابخانههای متنوع و پشتیبانی گسترده از سوی جامعهی توسعهدهندگان، امکان توسعه بازیهای متنوع و پیچیده را فراهم میکند. همچنین، پایتون با پلتفرمهای مختلف سازگار است و میتوان بازیهای ایجادشده با آن را روی سیستمعاملهای مختلف اجرا کرد.
بخش اول : بازی شطرنج
بازی شطرنج چیست؟ شطرنج یک بازی استراتژیک و قدیمی است که توسط دو بازیکن روی یک صفحه 8×8 با خانههای روشن و تیره متناوب بازی میشود. هر بازیکن در ابتدای بازی 16 مهره دارد که آنها را در ردیفهای نزدیک به خود قرار میدهد. پیادهها در ردیف دوم و سایر مهرهها در ردیف اول قرار میگیرند. هدف بازی پیش بردن مهرهها به نحوی است که شاه حریف را تحت کنترل قرار داده و "کیش و مات" کنید، که به معنای پیروزی در بازی است. هر مهره قوانین حرکتی خاصی دارد که بازیکنان باید از آنها پیروی کنند.
فوق العاده کاربردی آموزش ساخت بازی اندروید با پایتون (دوبعدی و سه بعدی)
ساخت بازی شطرنج با استفاده از Pygame در پایتون در ادامه مراحل و توضیحات گام به گام برای ساختن یک بازی شطرنج در پایتون آمده است:
ایجاد محیط مجازی
ابتدا، با استفاده از دستورات زیر محیط مجازی ایجاد کنید:
python -m venv env
.\env\Scripts\activate.ps1
نصب کتابخانههای مورد نیاز
ابتدا باید کتابخانه Pygame را نصب کنیم که برای ایجاد بازیها استفاده میشود. ما از آن برای ساخت بازی شطرنج استفاده میکنیم. برای نصب Pygame از دستور زیر استفاده کنید:
pip install pygame
نوشتن کد پایتون (main.py)
در ادامه توضیحات گام به گام کد main.py که برای ایجاد بازی شطرنج در پایتون استفاده کردهایم، آمده است:
گام 1: وارد کردن ماژولها
وارد کردن ماژولهای ضروری برای کد، شامل pygame برای توسعه بازی، requests برای انجام درخواستهای HTTP، rembg برای حذف پسزمینه تصاویر، و BytesIO برای مدیریت دادههای بایت.
# Importing Modules
import pygame
import requests
import rembg
from io import BytesIO
گام 2: مقداردهی اولیه Pygame و تنظیم صفحه بازی شطرنج
در این مرحله، کد با استفاده از ()pygame.init ماژول Pygame را مقداردهی اولیه میکند. این مرحله برای تنظیم محیط Pygame و استفاده از قابلیتهای آن در کل اسکریپت ضروری است.
# Initialising pygame module
pygame.init()
# Setting Width and height of the Chess Game screen
WIDTH = 1000
HEIGHT = 900
screen = pygame.display.set_mode([WIDTH, HEIGHT])
pygame.display.set_caption('Chess Game')
گام 3: مقداردهی اولیه فونتها و ساعت
در کد زیر، سه فونت مختلف با اندازههای متفاوت با استفاده از تابع ()pygame.font.Font مقداردهی اولیه میشوند. این فونتها احتمالاً برای نمایش متن در بازی استفاده میشوند. علاوه بر این، کد یک شیء ساعت با استفاده از ()pygame.time.Clock ایجاد میکند تا نرخ فریم بازی را کنترل کند.
font = pygame.font.Font('freesansbold.ttf', 20)
medium_font = pygame.font.Font('freesansbold.ttf', 40)
big_font = pygame.font.Font('freesansbold.ttf', 50)
timer = pygame.time.Clock()
fps = 60
گام 4: متغیرها و تصاویر بازی
در کد زیر، متغیرهای مربوط به بازی، مانند لیستهایی که مکانها و انواع مهرههای شطرنج را نشان میدهند، تعریف میشوند. آدرسهای URL تصاویر مهرههای شطرنج در image_urls ذخیره میشوند. این متغیرها نقش مهمی در مدیریت وضعیت بازی، از جمله مکانهای مهرهها و آدرسهای URL برای دریافت تصاویر مربوطه ایفا میکنند.
# game variables and images
white_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight', 'rook',
'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
white_locations = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0),
(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
black_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight', 'rook',
'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
black_locations = [(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7),
(0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6)]
captured_pieces_white = []
captured_pieces_black = []
# 0 - whites turn no selection: 1-whites turn piece selected: 2- black turn no selection, 3 - black turn piece selected
turn_step = 0
selection = 100
valid_moves = []
# url for chess pieces images
image_urls = ['https://media.geeksforgeeks.org/wp-content/uploads/20240302025946/black_queen.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025948/black_king.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025345/black_rook.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025951/black_bishop.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025947/black_knight.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025945/black_pawn.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025952/white_queen.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025943/white_king.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025949/white_rook.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025944/white_bishop.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025325/white_knight.png',
'https://media.geeksforgeeks.org/wp-content/uploads/20240302025953/white_pawn.png']
گام 5: بارگذاری تصاویر مهرههای بازی
در کد زیر، با استفاده از تابع ()pygame.image.load، تصاویر مهرههای شطرنج از آدرسهای URL بارگذاری میشوند. کتابخانه rembg برای حذف پسزمینه تصاویر استفاده میشود که ظاهر بصری مهرهها را بهبود میبخشد. هر تصویر سپس با استفاده از ()pygame.transform.scale مقیاس میشود تا در بازی اندازهای سازگار داشته باشد.
# load in game piece images (queen, king, rook, bishop, knight, pawn) x 2
black_queen = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[0]).content)))
black_queen = pygame.transform.scale(black_queen, (80, 80))
black_queen_small = pygame.transform.scale(black_queen, (45, 45))
black_king = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[1]).content)))
black_king = pygame.transform.scale(black_king, (80, 80))
black_king_small = pygame.transform.scale(black_king, (45, 45))
black_rook = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[2]).content)))
black_rook = pygame.transform.scale(black_rook, (80, 80))
black_rook_small = pygame.transform.scale(black_rook, (45, 45))
black_bishop = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[3]).content)))
black_bishop = pygame.transform.scale(black_bishop, (80, 80))
black_bishop_small = pygame.transform.scale(black_bishop, (45, 45))
black_knight = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[4]).content)))
black_knight = pygame.transform.scale(black_knight, (80, 80))
black_knight_small = pygame.transform.scale(black_knight, (45, 45))
black_pawn = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[5]).content)))
black_pawn = pygame.transform.scale(black_pawn, (65, 65))
black_pawn_small = pygame.transform.scale(black_pawn, (45, 45))
white_queen = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[6]).content)))
white_queen = pygame.transform.scale(white_queen, (80, 80))
white_queen_small = pygame.transform.scale(white_queen, (45, 45))
white_king = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[7]).content)))
white_king = pygame.transform.scale(white_king, (80, 80))
white_king_small = pygame.transform.scale(white_king, (45, 45))
white_rook = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[8]).content)))
white_rook = pygame.transform.scale(white_rook, (80, 80))
white_rook_small = pygame.transform.scale(white_rook, (45, 45))
white_bishop = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[9]).content)))
white_bishop = pygame.transform.scale(white_bishop, (80, 80))
white_bishop_small = pygame.transform.scale(white_bishop, (45, 45))
white_knight = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[10]).content)))
white_knight = pygame.transform.scale(white_knight, (80, 80))
white_knight_small = pygame.transform.scale(white_knight, (45, 45))
white_pawn = pygame.image.load(
BytesIO(rembg.remove(requests.get(image_urls[11]).content)))
white_pawn = pygame.transform.scale(white_pawn, (65, 65))
white_pawn_small = pygame.transform.scale(white_pawn, (45, 45))
گام 6: گروهبندی تصاویر مهرهها
در کد زیر، بخش بارگذاری تصاویر مهرهها را به لیستهایی برای دسترسی و استفاده راحتتر سازماندهی میکند. دو لیست white_images و small_white_images، نسخههای اصلی و مقیاسشده مهرههای سفید را به ترتیب شامل میشوند. لیستهای مشابهی برای مهرههای سیاه ایجاد میشود. گروهبندی تصاویر فرآیند کشیدن مهرهها روی صفحه بازی را ساده میکند.
white_images = [white_pawn, white_queen, white_king,
white_knight, white_rook, white_bishop]
small_white_images = [white_pawn_small, white_queen_small, white_king_small, white_knight_small,
white_rook_small, white_bishop_small]
black_images = [black_pawn, black_queen, black_king,
black_knight, black_rook, black_bishop]
small_black_images = [black_pawn_small, black_queen_small, black_king_small,
black_knight_small, black_rook_small, black_bishop_small]
piece_list = ['pawn', 'queen', 'king', 'knight', 'rook', 'bishop']
# check variables/ flashing counter
counter = 0
winner = ''
game_over = False
گام 7: توابع رسم صفحه بازی
کد زیر توابعی را تعریف میکند که مسئول رسم صفحه بازی هستند. تابع ()draw_board با استفاده از توابع رسم Pygame یک صفحه شطرنج با خانههای متناوب خاکستری روشن و خاکستری ایجاد میکند. علاوه بر این، خطوطی برای تعیین مرز خانهها رسم میشود و متنی در پایین پنجره نمایش داده میشود که نشاندهنده نوبت فعلی بازیکن و اقدامات اوست.
# draw main game board
def draw_board():
for i in range(32):
column = i % 4
row = i // 4
if row % 2 == 0:
pygame.draw.rect(screen, 'light gray', [
600 - (column * 200), row * 100, 100, 100])
else:
pygame.draw.rect(screen, 'light gray', [
700 - (column * 200), row * 100, 100, 100])
pygame.draw.rect(screen, 'gray', [0, 800, WIDTH, 100])
pygame.draw.rect(screen, 'gold', [0, 800, WIDTH, 100], 5)
pygame.draw.rect(screen, 'gold', [800, 0, 200, HEIGHT], 5)
status_text = ['White: Select a Piece to Move!', 'White: Select a Destination!',
'Black: Select a Piece to Move!', 'Black: Select a Destination!']
screen.blit(big_font.render(
status_text[turn_step], True, 'black'), (20, 820))
for i in range(9):
pygame.draw.line(screen, 'black', (0, 100 * i), (800, 100 * i), 2)
pygame.draw.line(screen, 'black', (100 * i, 0), (100 * i, 800), 2)
screen.blit(medium_font.render('FORFEIT', True, 'black'), (810, 830))
گام 8: توابع رسم مهرهها
در ادامه، توضیح توابع رسم مهرهها برای ایجاد یک بازی شطرنج در پایتون آمده است:
رسم مهرهها بر روی صفحه
در کد زیر، تابع draw_pieces مسئول نمایش بصری مهرههای شطرنج بر روی صفحه است. این تابع از طریق مهرههای سفید و سیاه عبور کرده و آنها را در مکانهای مربوطه نمایش میدهد. تابع موقعیت مهرههای پیاده را تنظیم کرده و مهره انتخابشده را با یک مستطیل قرمز در نوبت سفید و یک مستطیل آبی در نوبت سیاه برجسته میکند.
# draw pieces onto board
def draw_pieces():
for i in range(len(white_pieces)):
index = piece_list.index(white_pieces[i])
if white_pieces[i] == 'pawn':
screen.blit(
white_pawn, (white_locations[i][0] * 100 + 22, white_locations[i][1] * 100 + 30))
else:
screen.blit(white_images[index], (white_locations[i]
[0] * 100 + 10, white_locations[i][1] * 100 + 10))
if turn_step < 2:
if selection == i:
pygame.draw.rect(screen, 'red', [white_locations[i][0] * 100 + 1, white_locations[i][1] * 100 + 1,
100, 100], 2)
for i in range(len(black_pieces)):
index = piece_list.index(black_pieces[i])
if black_pieces[i] == 'pawn':
screen.blit(
black_pawn, (black_locations[i][0] * 100 + 22, black_locations[i][1] * 100 + 30))
else:
screen.blit(black_images[index], (black_locations[i]
[0] * 100 + 10, black_locations[i][1] * 100 + 10))
if turn_step >= 2:
if selection == i:
pygame.draw.rect(screen, 'blue', [
black_locations[i][0] * 100 + 1, black_locations[i][1] * 100 + 1, 100, 100], 2)
اعتبارسنجی حرکت مهرهها
در کد زیر، تابع check_options تمامی حرکتهای ممکن برای هر مهره روی صفحه شطرنج را اعتبارسنجی کرده و جمعآوری میکند، تفاوت بین انواع مختلف مهرهها و حرکتهای مربوطهشان را مشخص میکند.
# function to check all pieces valid options on board
def check_options(pieces, locations, turn):
moves_list = []
all_moves_list = []
for i in range((len(pieces))):
location = locations[i]
piece = pieces[i]
if piece == 'pawn':
moves_list = check_pawn(location, turn)
elif piece == 'rook':
moves_list = check_rook(location, turn)
elif piece == 'knight':
moves_list = check_knight(location, turn)
elif piece == 'bishop':
moves_list = check_bishop(location, turn)
elif piece == 'queen':
moves_list = check_queen(location, turn)
elif piece == 'king':
moves_list = check_king(location, turn)
all_moves_list.append(moves_list)
return all_moves_list
بررسی حرکتهای معتبر شاه
در کد زیر، تابع check_king تمرکز بر تعیین و بازگشت حرکتهای معتبر برای شاه دارد، با در نظر گرفتن توانایی حرکت به یک خانه در هر جهت و تفاوت بین مهرههای دوست و دشمن.
# check king valid moves
def check_king(position, color):
moves_list = []
if color == 'white':
enemies_list = black_locations
friends_list = white_locations
else:
friends_list = black_locations
enemies_list = white_locations
# 8 squares to check for kings, they can go one square any direction
targets = [(1, 0), (1, 1), (1, -1), (-1, 0),
(-1, 1), (-1, -1), (0, 1), (0, -1)]
for i in range(8):
target = (position[0] + targets[i][0], position[1] + targets[i][1])
if target not in friends_list and 0 <= target[0] <= 7 and 0 <= target[1] <= 7:
moves_list.append(target)
return moves_list
جمعآوری حرکتهای وزیر
در کد زیر، تابع check_queen حرکتهای معتبر وزیر را با ادغام نتایج از توابع فیل و رخ ترکیب کرده و لیستی جامع از حرکتهای معتبر برای وزیر در یک موقعیت و رنگ خاص ارائه میدهد.
# check queen valid moves
def check_queen(position, color):
moves_list = check_bishop(position, color)
second_list = check_rook(position, color)
for i in range(len(second_list)):
moves_list.append(second_list[i])
return moves_list
بررسی مسیرهای قطری فیل
در کد زیر، تابع check_bishop حرکتهای معتبر برای فیل را با عبور از مسیرهای قطری در چهار جهت محاسبه کرده و باز میگرداند، با در نظر گرفتن مرزهای صفحه و اجتناب از مهرههای دوست.
# check bishop moves
def check_bishop(position, color):
moves_list = []
if color == 'white':
enemies_list = black_locations
friends_list = white_locations
else:
friends_list = black_locations
enemies_list = white_locations
for i in range(4): # up-right, up-left, down-right, down-left
path = True
chain = 1
if i == 0:
x = 1
y = -1
elif i == 1:
x = -1
y = -1
elif i == 2:
x = 1
y = 1
else:
x = -1
y = 1
while path:
if (position[0] + (chain * x), position[1] + (chain * y)) not in friends_list and \
0 <= position[0] + (chain * x) <= 7 and 0 <= position[1] + (chain * y) <= 7:
moves_list.append(
(position[0] + (chain * x), position[1] + (chain * y)))
if (position[0] + (chain * x), position[1] + (chain * y)) in enemies_list:
path = False
chain += 1
else:
path = False
return moves_list
ناوبری افقی و عمودی رخ
در کد زیر، تابع check_rook حرکتهای معتبر برای رخ را با کاوش مسیرهای افقی و عمودی در چهار جهت تعیین میکند، اطمینان از اینکه حرکتها در مرزهای صفحه باقی بمانند و از مهرههای دوست اجتناب کنند.
# check rook moves
def check_rook(position, color):
moves_list = []
if color == 'white':
enemies_list = black_locations
friends_list = white_locations
else:
friends_list = black_locations
enemies_list = white_locations
for i in range(4): # down, up, right, left
3 مهارت برتر مهندسان کامپیوتر! بدون کلاس، سرعت 2 برابر، ماندگاری 3 برابر، پولسازی عالی با هک، متلب و برنامه نویسی... دانلود:
path = True
chain = 1
if i == 0:
x = 0
y = 1
elif i == 1:
x = 0
y = -1
elif i == 2:
x = 1
y = 0
else:
x = -1
y = 0
while path:
if (position[0] + (chain * x), position[1] + (chain * y)) not in friends_list and \
0 <= position[0] + (chain * x) <= 7 and 0 <= position[1] + (chain * y) <= 7:
moves_list.append(
(position[0] + (chain * x), position[1] + (chain * y)))
if (position[0] + (chain * x), position[1] + (chain * y)) in enemies_list:
path = False
chain += 1
else:
path = False
return moves_list
تشخیص حرکتهای معتبر پیاده
تابع check_pawn حرکتهای معتبر برای پیاده را شناسایی و باز میگرداند، با در نظر گرفتن سناریوهای مختلف مانند حرکتهای دوگانه اولیه، حرکتهای تکی و گرفتن قطری بر اساس رنگ پیاده.
# check valid pawn moves
def check_pawn(position, color):
moves_list = []
if color == 'white':
if (position[0], position[1] + 1) not in white_locations and \
(position[0], position[1] + 1) not in black_locations and position[1] < 7:
moves_list.append((position[0], position[1] + 1))
if (position[0], position[1] + 2) not in white_locations and \
(position[0], position[1] + 2) not in black_locations and position[1] == 1:
moves_list.append((position[0], position[1] + 2))
if (position[0] + 1, position[1] + 1) in black_locations:
moves_list.append((position[0] + 1, position[1] + 1))
if (position[0] - 1, position[1] + 1) in black_locations:
moves_list.append((position[0] - 1, position[1] + 1))
else:
if (position[0], position[1] - 1) not in white_locations and \
(position[0], position[1] - 1) not in black_locations and position[1] > 0:
moves_list.append((position[0], position[1] - 1))
if (position[0], position[1] - 2) not in white_locations and \
(position[0], position[1] - 2) not in black_locations and position[1] == 6:
moves_list.append((position[0], position[1] - 2))
if (position[0] + 1, position[1] - 1) in white_locations:
moves_list.append((position[0] + 1, position[1] - 1))
if (position[0] - 1, position[1] - 1) in white_locations:
moves_list.append((position[0] - 1, position[1] - 1))
return moves_list
تولید حرکتهای L-شکل اسب
تابع check_knight حرکتهای معتبر برای اسب را با کاوش هشت موقعیت ممکن در شکل "L" محاسبه و باز میگرداند، اطمینان از اینکه حرکتها در مرزهای صفحه باقی بمانند و از مهرههای دوست اجتناب کنند.
# check valid knight moves
def check_knight(position, color):
moves_list = []
if color == 'white':
enemies_list = black_locations
friends_list = white_locations
else:
friends_list = black_locations
enemies_list = white_locations
# 8 squares to check for knights, they can go two squares in one direction and one in another
targets = [(1, 2), (1, -2), (2, 1), (2, -1),
(-1, 2), (-1, -2), (-2, 1), (-2, -1)]
for i in range(8):
target = (position[0] + targets[i][0], position[1] + targets[i][1])
if target not in friends_list and 0 <= target[0] <= 7 and 0 <= target[1] <= 7:
moves_list.append(target)
return moves_list
شمارش حرکتهای معتبر مهره فعلی
تابع check_valid_moves حرکتهای معتبر برای مهره انتخابشده فعلی را بر اساس نوبت فعلی بازی تعیین میکند و لیستی از حرکتهای ممکن ارائه میدهد.
# check for valid moves for just selected piece
def check_valid_moves():
if turn_step < 2:
options_list = white_options
else:
options_list = black_options
valid_options = options_list[selection]
return valid_options
نمایش بصری حرکتهای معتبر
تابع draw_valid حرکتهای معتبر را به صورت بصری بر روی صفحه نمایش میدهد، با رسم دایرههای کوچک، با استفاده از دایرههای قرمز برای نوبت سفید و دایرههای آبی برای نوبت سیاه.
# draw valid moves on screen
def draw_valid(moves):
if turn_step < 2:
color = 'red'
else:
color = 'blue'
for i in range(len(moves)):
pygame.draw.circle(
screen, color, (moves[i][0] * 100 + 50, moves[i][1] * 100 + 50), 5)
نمایش مهرههای گرفتهشده
تابع draw_captured مهرههای گرفتهشده را به صورت بصری در کنار صفحه نمایش میدهد، با استفاده از لیستهای مهرههای گرفتهشده برای هر دو سفید و سیاه.
# draw captured pieces on side of screen
def draw_captured():
for i in range(len(captured_pieces_white)):
captured_piece = captured_pieces_white[i]
index = piece_list.index(captured_piece)
screen.blit(small_black_images[index], (825, 5 + 50 * i))
for i in range(len(captured_pieces_black)):
captured_piece = captured_pieces_black[i]
index = piece_list.index(captured_piece)
screen.blit(small_white_images[index], (925, 5 + 50 * i))
نشانگر کیش
تابع draw_check وضعیت کیش را به صورت بصری نمایش میدهد، با رسم یک مربع چشمکزن در اطراف شاه، با رنگ و شرایط وابسته به نوبت فعلی.
# draw a flashing square around king if in check
def draw_check():
if turn_step < 2:
if 'king' in white_pieces:
king_index = white_pieces.index('king')
king_location = white_locations[king_index]
for i in range(len(black_options)):
if king_location in black_options[i]:
if counter < 15:
pygame.draw.rect(screen, 'dark red', [white_locations[king_index][0] * 100 + 1,
white_locations[king_index][1] * 100 + 1, 100, 100], 5)
else:
if 'king' in black_pieces:
king_index = black_pieces.index('king')
king_location = black_locations[king_index]
for i in range(len(white_options)):
if king_location in white_options[i]:
if counter < 15:
pygame.draw.rect(screen, 'dark blue', [black_locations[king_index][0] * 100 + 1,
black_locations[king_index][1] * 100 + 1, 100, 100], 5)
نمایش پایان بازی
تابع draw_game_over پیامی را بر روی صفحه نمایش میدهد که برنده بازی را اعلام کرده و بازیکن را به فشردن کلید ENTER برای شروع مجدد بازی هدایت میکند، با استفاده از متغیر winner برای تعیین برنده نمایش دادهشده بر روی صفحه.
def draw_game_over():
pygame.draw.rect(screen, 'black', [200, 200, 400, 70])
screen.blit(font.render(
f'{winner} won the game!', True, 'white'), (210, 210))
screen.blit(font.render(f'Press ENTER to Restart!',
True, 'white'), (210, 240))
گام 9: حلقه بازی و مدیریت رویدادها
مقداردهی اولیه و رندرینگ
حلقه بازی با محاسبه گزینههای حرکت معتبر برای هر دو مهره سیاه و سفید با استفاده از تابع check_options شروع میشود. سپس، یک شمارنده افزایش یافته و صفحه با رنگ خاکستری تیره پر میشود تا بوم تمیزی برای رندرینگ فراهم شود. توابعی مانند draw_board، draw_pieces، draw_captured و draw_check برای نمایش بصری صفحه شطرنج، مهرهها، مهرههای گرفتهشده و شرایط کیش فراخوانی میشوند.
# main game loop
black_options = check_options(black_pieces, black_locations, 'black')
white_options = check_options(white_pieces, white_locations, 'white')
run = True
while run:
timer.tick(fps)
if counter < 30:
counter += 1
else:
counter = 0
screen.fill('dark gray')
draw_board()
draw_pieces()
draw_captured()
draw_check()
if selection != 100:
valid_moves = check_valid_moves()
draw_valid(valid_moves)
مدیریت رویدادها - کلیکهای موس
کد از یک حلقه برای مدیریت رویدادهای Pygame استفاده میکند که عمدتاً بر کلیکهای موس (pygame.MOUSEBUTTONDOWN) تمرکز دارد. این کد بررسی میکند که آیا دکمه چپ موس (event.button == 1) کلیک شده و بازی به پایان نرسیده است (not game_over). مختصات کلیک تعیین شده و به مختصات شبکه ترجمه میشوند. بسته به مرحله نوبت، ورودی بازیکن برای حرکت مهرهها، گرفتن مهرههای حریف و بهروزرسانی وضعیت بازی پردازش میشود.
# event handling
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
# Handling left mouse button clicks when the game is not over
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 and not game_over:
x_coord = event.pos[0] // 100
y_coord = event.pos[1] // 100
click_coords = (x_coord, y_coord)
# Handling player input during the first two turns
if turn_step <= 1:
# Check if the player clicked on forfeit squares
if click_coords == (8, 8) or click_coords == (9, 8):
winner = 'black'
# Check if the clicked coordinates belong to white pieces
if click_coords in white_locations:
selection = white_locations.index(click_coords)
if turn_step == 0:
turn_step = 1
# Check if the clicked coordinates are valid moves for the selected white piece
if click_coords in valid_moves and selection != 100:
white_locations[selection] = click_coords
# Check for capturing black pieces
if click_coords in black_locations:
black_piece = black_locations.index(click_coords)
captured_pieces_white.append(black_pieces[black_piece])
if black_pieces[black_piece] == 'king':
winner = 'white'
black_pieces.pop(black_piece)
black_locations.pop(black_piece)
# Update move options for both black and white
black_options = check_options(
black_pieces, black_locations, 'black')
white_options = check_options(
white_pieces, white_locations, 'white')
turn_step = 2
selection = 100
valid_moves = []
# Handling player input during the last two turns
if turn_step > 1:
# Check if the player clicked on forfeit squares
if click_coords == (8, 8) or click_coords == (9, 8):
winner = 'white'
# Check if the clicked coordinates belong to black pieces
if click_coords in black_locations:
selection = black_locations.index(click_coords)
if turn_step == 2:
turn_step = 3
# Check if the clicked coordinates are valid moves for the selected black piece
if click_coords in valid_moves and selection != 100:
black_locations[selection] = click_coords
# Check for capturing white pieces
if click_coords in white_locations:
white_piece = white_locations.index(click_coords)
captured_pieces_black.append(white_pieces[white_piece])
if white_pieces[white_piece] == 'king':
winner = 'black'
white_pieces.pop(white_piece)
white_locations.pop(white_piece)
# Update move options for both black and white
black_options = check_options(
black_pieces, black_locations, 'black')
white_options = check_options(
white_pieces, white_locations, 'white')
turn_step = 0
selection = 100
valid_moves = []
مدیریت رویدادها - فشردن کلید
در داخل حلقه رویداد، کد بررسی میکند که آیا کلیدی فشرده شده است (pygame.KEYDOWN) هنگامی که بازی به پایان رسیده است. بهطور خاص، به دنبال کلید "Enter" (event.key == pygame.K_RETURN) میگردد. در صورت شناسایی این کلید، بازی به حالت اولیه خود بازنشانی میشود که شامل موقعیتهای مهرهها، مهرههای گرفتهشده، مراحل نوبت و لیستهای حرکت معتبر است. این عملکرد به بازیکنان اجازه میدهد بازی را بهطور یکپارچه دوباره شروع کنند.
# Handling key press events when the game is over
if event.type == pygame.KEYDOWN and game_over:
# Check if the pressed key is the "Enter" key
if event.key == pygame.K_RETURN:
# Resetting the game state when the "Enter" key is pressed
game_over = False
winner = ''
white_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight', 'rook',
'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
white_locations = [(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0),
(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
black_pieces = ['rook', 'knight', 'bishop', 'king', 'queen', 'bishop', 'knight', 'rook',
'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn', 'pawn']
black_locations = [(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7),
(0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6)]
captured_pieces_white = []
captured_pieces_black = []
turn_step = 0
selection = 100
valid_moves = []
# Update move options for both black and white
black_options = check_options(black_pieces, black_locations, 'black')
white_options = check_options(white_pieces, white_locations, 'white')
تعیین برنده و نمایش پایان بازی
اگر برندهای تعیین شود، کد پرچم game_over را به true تنظیم کرده و تابع draw_game_over را برای نمایش پیام پایان بازی روی صفحه فراخوانی میکند. متغیر برنده (winner) بر این تصمیم تأثیر میگذارد و عواملی مانند گرفتن شاه حریف یا فشردن مربعهای انصراف را در نظر میگیرد. این جنبه تجربه کاربری را با ارائه بازخورد واضح از نتیجه بازی بهبود میبخشد.
# Checking for a winner and displaying game over message
if winner != '':
game_over = True
draw_game_over()
خروجی :
تمرین های برنامه نویسی پایتون+ مثال برنامه نویسی پایتون
بخش دوم: بازی ماشین
معرفی بازی ماشین
بازیهای ماشینسواری یکی از محبوبترین انواع بازیهای ویدیویی هستند که اصول و قواعد خاص خود را دارند.
اصول و قواعد بازیهای مسابقهای
بازیهای مسابقهای معمولاً شامل مسیرهای مسابقه، ماشینها و موانع مختلف هستند. هدف اصلی بازیکن، رسیدن به خط پایان در کمترین زمان ممکن است.
هدف از ساخت بازی ماشین با پایتون
هدف از ساخت بازی ماشین با پایتون، ایجاد یک بازی مسابقهای جذاب است که تجربهی واقعی رانندگی را به کاربر ارائه دهد.
انتخاب کتابخانه مناسب
برای ساخت بازی ماشین با پایتون، استفاده از Pygame میتواند گزینهی مناسبی باشد.
معرفی کتابخانههای مرتبط مانند ( Pygame)
Pygame امکانات زیادی برای ساخت بازیهای دوبعدی و سهبعدی فراهم میکند که میتوان از آنها برای ساخت بازی ماشین استفاده کرد.
مزایای استفاده از Pygame برای ساخت بازی ماشین
استفاده از Pygame برای ساخت بازی ماشین مزایای زیادی دارد. این کتابخانه ابزارها و امکانات مختلفی برای مدیریت رویدادها، رسم اشکال و کنترل صدا ارائه میدهد.
طراحی و پیادهسازی محیط بازی
ایجاد پنجره بازی
برای ایجاد پنجره بازی، میتوان از Pygame استفاده کرد.
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption('Racing Game')
رسم مسیر مسابقه
برای رسم مسیر مسابقه، میتوان از تصاویر یا اشکال مختلف استفاده کرد.
track = pygame.image.load('track.png')
screen.blit(track, (0, 0))
نمایش ماشینها و موانع
برای نمایش ماشینها و موانع، میتوان از تصاویر مربوط به هر یک استفاده کرد
car = pygame.image.load('car.png')
screen.blit(car, (400, 300))
مدیریت حرکت ماشینها
پیادهسازی کنترلهای ماشین
برای پیادهسازی کنترلهای ماشین، میتوان از ورودیهای صفحهکلید استفاده کرد.
def handle_input():
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
# حرکت به چپ
if keys[pygame.K_RIGHT]:
# حرکت به راست
دانلود کنید: ۴ جزوه عالی pdf آموزش پایتون
پیادهسازی فیزیک حرکت ماشین
برای پیادهسازی فیزیک حرکت ماشین، میتوان از قوانین فیزیکی استفاده کرد.
def update_physics():
# بهروزرسانی موقعیت و سرعت ماشین
اضافه کردن چالشها و موانع
ایجاد موانع و چالشها در مسیر مسابقه
برای ایجاد موانع و چالشها، میتوان از اشیاء مختلف استفاده کرد.
obstacle = pygame.image.load('obstacle.png')
screen.blit(obstacle, (500, 400))
پیادهسازی سیستم امتیازدهی و زمانسنجی
برای پیادهسازی سیستم امتیازدهی و زمانسنجی، میتوان از ابزارهای مختلف استفاده کرد.
score = 0
start_time = pygame.time.get_ticks()
ضافه کردن رابط کاربری و جلوههای بصری
ایجاد رابط کاربری مناسب
برای ایجاد رابط کاربری مناسب، میتوان از ابزارها و کتابخانههای مختلف استفاده کرد.
افزودن افکتهای بصری و صوتی
افکتهای بصری و صوتی میتوانند تجربهی بازی را جذابتر کنند.
engine_sound = pygame.mixer.Sound('engine.wav')
pygame.mixer.Sound.play(engine_sound)
زمایش و دیباگ کردن بازی
تست کردن بازی و رفع اشکالات
برای اطمینان از عملکرد صحیح بازی، باید آن را بهطور کامل تست کرد و اشکالات را برطرف کرد.
بهینهسازی کد و بهبود عملکرد
بهینهسازی کد و بهبود عملکرد بازی باعث میشود تا تجربهی کاربر بهبود یابد.
حتما دانلود کنید: فیلم های صفر تا صد پایتون
ویدیوی آموزشی ساخت بازی ماشین با پایتون
جمع بندی
ساخت بازیهای کامپیوتری با پایتون یک راه عالی برای یادگیری و تمرین مهارتهای برنامهنویسی است. در مقالهای که به بررسی ساخت دو بازی محبوب، شطرنج و ماشین، با استفاده از پایتون میپردازد، مراحل کلیدی و نکات مهم هر پروژه مورد بحث قرار گرفتهاند. برای بازی شطرنج، ابتدا طراحی رابط کاربری با استفاده از کتابخانههایی مانند Tkinter یا Pygame انجام میشود.
سپس، قوانین و حرکت مهرهها به دقت مدلسازی شده و منطق بازی پیادهسازی میگردد. همچنین، برای بهبود تجربه کاربر، الگوریتمهای هوش مصنوعی مانند Minimax برای تصمیمگیری حرکتهای کامپیوتر اضافه میشوند. از سوی دیگر، در ساخت بازی ماشین، تمرکز بر ایجاد یک محیط تعاملی است که شامل طراحی مسیر، کنترل حرکت ماشین و مدیریت برخوردها میشود. استفاده از Pygame در اینجا نیز به توسعه سریع و کارآمد بازی کمک میکند. این پروژهها نه تنها دانش فنی را تقویت میکنند بلکه به توسعهدهندگان اجازه میدهند تا خلاقیت خود را در طراحی بازیهای جذاب و تعاملی به کار گیرند.