ساخت بازی شطرنج با پایتون+ آموزش ساخت بازی ماشین با پایتون

رتبه: 0 ار 0 رای sssss
بازی شطرنج
نویسنده: تیم تولید محتوا زمان مطالعه 9 دقیقه
Banner Image

بازی‌سازی یکی از حوزه‌های پرطرفدار و محبوب در دنیای تکنولوژی است که هر روزه توسعه‌دهندگان بیشتری به آن جذب می‌شوند. در این مقاله، به بررسی کلی بازی‌سازی با زبان برنامه‌نویسی پایتون پرداخته و سپس دو پروژه‌ی عملی برای ساخت بازی‌های شطرنج و ماشین را معرفی خواهیم کرد. در هر بخش، مراحل طراحی، پیاده‌سازی، تست و بهینه‌سازی به‌صورت جزئی بررسی می‌شود.

پایتون به‌عنوان یکی از زبان‌های برنامه‌نویسی محبوب و کاربرپسند، قابلیت‌های فراوانی برای بازی‌سازی دارد. استفاده از پایتون به دلیل سادگی و قدرت آن در توسعه نرم‌افزارها، یکی از گزینه‌های جذاب برای علاقه‌مندان به بازی‌سازی محسوب می‌شود. با استفاده از کتابخانه‌های مختلفی همچون 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 در اینجا نیز به توسعه سریع و کارآمد بازی کمک می‌کند. این پروژه‌ها نه تنها دانش فنی را تقویت می‌کنند بلکه به توسعه‌دهندگان اجازه می‌دهند تا خلاقیت خود را در طراحی بازی‌های جذاب و تعاملی به کار گیرند.

profile name
تیم تولید محتوا

بخندید کتاب بخونید و خوب باشید تا جامعه مون به آرامش برسه. لطفا ! هر سوالی دارید در بخش نظرات مطرح کنید. ما یا سایر هموطنان عزیز پاسخ خواهیم داد. برای کمک به سایت ما و گسترش آموزش در بین هموطنان، در سایتها، وبلاگ ها و شبکه های اجتماعی لینک سایت ما را درج کنید.

مطالب پیشنهادی برای شما

محصولات مرتبط

مشاهده همه

دیدگاهتان را بنویسید

1 2 3 4 5

0 نظر درباره «ساخت بازی شطرنج با پایتون+ آموزش ساخت بازی ماشین با پایتون»

    هنوز نظری برای این بخش ثبت نشده است
مشاهده همه نظرات
سبد خرید
سبد خرید شما خالی است
× جهت نصب روی دکمه زیر در گوشی کلیک نمائید
آی او اس
سپس در مرحله بعد برروی دکمه "Add To Home Screen" کلیک نمائید