آموزش هوش مصنوعی از صفر ، بدون پیش‌نیاز آموزش هوش مصنوعی ، از صفر بدون پیش‌نیاز!
🎯 شروع یادگیری
بستن تبلیغات
دوره تسلط بر پایتون ؛ آموزش پروژه محور برای حرفه ای ها

با آموزش حضوری و آنلاین مقدماتی تا پیشرفته پایتون , محبوب‌ترین زبان برنامه‌نویسی دنیا در محیطی عملی کاربردی و پروژه محور وارد دنیای برنامه نویسی شوید

مشاهده بیشتر
دوره آموزش ماشین لرنینگ

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

مشاهده بیشتر
یادگیری عمیق از پایه تا پیشرفته، همراه با پروژه‌های واقعی!

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

مشاهده بیشتر
دوره پروژه محور آموزش جنگو

با این دوره، Django رو از پایه شروع کن و به یک حرفه‌ای تبدیل شو! یاد بگیر چطور با معماری MVT، پایگاه داده و RESTful API کار کنی، پروژه‌های واقعی بسازی و آن‌ها رو روی وب سرور مستقر کنی!

مشاهده بیشتر

ساخت بازی فروت نینجا با پایتون

سورس کد بازی فروت نینجا
شرح مختصر پروژه

در این پروژه با استفاده از زبان برنامه نویسی پایتون و کتابخانه ی pygame اقدام به ساخت بازی محبوب Fruit Ninja می کنیم

توضیحات پروژه

بازی فروت نینجا Fruit Ninja ، همچنین به عنوان بازی برش میوه شناخته می شود.

هدف از این پروژه ساخت یک فروت نینجا با پایتون است. این بازی با کمک ماژول pygame و مفهوم اولیه پایتون ساخته شده است.

در این بازی کاربر باید با لمس موس روی میوه ها ، میوه ها را برش دهد. بمب هایی با میوه ها نیز وجود دارد. اگر ماوس بیش از سه بمب را لمس کند، بازی تمام خواهد شد.

پیش نیازهای پروژه بازی Fruit Ninja با زبان برنامه نویسی پایتون:

لطفا pygame و random را نصب کنید:

pip install pygame
Pip install random

ساختار پروژه

این مراحل برای ساخت بازی میوه نینجا است:

  • وارد کردن ماژول های مورد نیاز
  • راه اندازی پنجره window
  • توابع را تعریف کنید
  • حلقه loop بازی

بیایید شروع به ساخت بازی Fruit Ninja در پایتون کنیم

  1. وارد کردن ماژول های مورد نیاز
                import pygame, sys
                import os
                import random
            

    این پروژه را با وارد کردن کتابخانه ها شروع کنید.

  2. ایجاد پنجره نمایش
                player_lives = 3
                score = 0
                fruits = ['melon', 'orange', 'pomegranate', 'guava', 'bomb']
                WIDTH = 800
                HEIGHT = 500
                FPS = 12
    
                pygame.init()
                pygame.display.set_caption(‘FRUIT NINJA--DataFlair’)
                gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT))
                clock = pygame.time.Clock()
    
                WHITE = (255,255,255)
                BLACK = (0,0,0)
                RED = (255,0,0)
                GREEN = (0,255,0)
                BLUE = (0,0,255)
    
                gameDisplay.fill((BLACK))
                background = pygame.image.load('back.jpg')
                font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 32)
                score_text = font.render('Score : ' + str(score), True, (255, 255, 255))
                lives_icon = pygame.image.load('images/white_lives.png')
            
    • player_livesزندگی های باقی مانده را پیگیری خواهد کرد.
    • scoreامتیاز را پیگیری می کند
    • fruits موجودات موجود در بازی هستند
    • pygame.init()pygame را مقداردهی اولیه کنید
    • pygame.display.set_captionعنوان پنجره بازی را تنظیم می کند
    • FPS تعداد دفعاتی که نمایشگر بازی باید به‌روزرسانی شود را کنترل می‌کند. در مورد ما، هر 1/12 ثانیه به روز می شود
    • WIDTH and HEIGHTاندازه نمایش بازی را با استفاده از pygame.display.set_mode تنظیم می کنند
    • پس زمینه بازی توسطpygame.image.load تنظیم شده است که برای تنظیم تصویر استفاده می شود
    • Lives-iconتصاویری را ذخیره می کند که زندگی های باقی مانده را نشان می دهد
  3. ساختار کلی فرهنگ لغت بازی فروت نینجا
                def generate_random_fruits(fruit):
                    fruit_path = "images/" + fruit + ".png"
                    data[fruit] = {
                        'img': pygame.image.load(fruit_path),
                        'x' : random.randint(100,500),               
                        'y' : 800,
                        'speed_x': random.randint(-10,10),    
                        'speed_y': random.randint(-80, -60),    
                        'throw': False,                       
                        't': 0,                               
                        'hit': False,
                    }
    
                    if random.random() >= 0.75:     
                        data[fruit]['throw'] = True
                    else:
                        data[fruit]['throw'] = False
    
                data = {}
                for fruit in fruits:
                    generate_random_fruits(fruit)
            
    • این تابع میوه های تصادفی و ساختار عمومی شده را تولید می کند
    • «x» و «y» مقداری را که میوه باید روی مختصات x و مختصات y قرار گیرد را ذخیره می‌کند.
    • Speed_x و speed_y کلیدهایی هستند که مقدار سرعت حرکت میوه در جهت x و y را ذخیره می کنند. همچنین حرکت مورب میوه ها را کنترل می کند
    • throws key برای تعیین اینکه مختصات تولید شده از میوه ها خارج از گیم پلی است یا خیر استفاده می شود. اگر بیرون باشد، دور ریخته خواهد شد.
    • عدد ممیز شناور تصادفی بعدی را در بازه [0.0، 1.0) برمیگرداند تا میوه ها در داخل نمایشگر بازی حفظ شوند.
  4. متد رسم فونت ها
                font_name = pygame.font.match_font('comic.ttf')
    
                def draw_text(display, text, size, x, y):
                    font = pygame.font.Font(font_name, size)
                    text_surface = font.render(text, True, WHITE)
                    text_rect = text_surface.get_rect()
                    text_rect.midtop = (x, y)
                    gameDisplay.blit(text_surface, text_rect)
            
    • Draw_textsتابع به رسم متن بر روی صفحه کمک می کند.
    • get_rect()آبجکت React را برمیگرداند.
    • player_livesX و y ابعاد جهت x و جهت y می باشد
    • blit()تصویر را ترسیم می کند یا متن را در یک موقعیت مشخص روی صفحه می نویسد
  5. جان بازیکنان را رسم کنید.
    def draw_lives(display, x, y, lives, image) :
                    for i in range(lives) :
                        img = pygame.image.load(image)
                        img_rect = img.get_rect()      
                        img_rect.x = int(x + 35 * i)   
                        img_rect.y = y                 
                        display.blit(img, img_rect)
            
                def hide_cross_lives(x, y):
                    gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))
            
    • img_rect مختصات (x,y) آیکونهای crossرا دریافت می کند (در سمت راست بالای صفحه زندگی می کند)
    • img_rect .x نماد cross بعدی را 35 پیکسل نسبت به نماد قبلی تنظیم می کند
    • img_rect.y دقت می کند که نماد Cross باید چند پیکسل از بالای صفحه قرار گیرد.
  6. نمایش Game over و نمایش فرانت
                def show_gameover_screen():
                    gameDisplay.blit(background, (0,0))
                    draw_text(gameDisplay, "FRUIT NINJA!", 64, WIDTH / 2, HEIGHT / 4)
                    if not game_over :
                        draw_text(gameDisplay,"Score : " + str(score), 40, WIDTH / 2, 250)
    
    
                    draw_text(gameDisplay, "Press a key to begin!", 24, WIDTH / 2, HEIGHT * 3 / 4)
                    pygame.display.flip()
                    waiting = True
                    while waiting:
                        clock.tick(FPS)
                        for event in pygame.event.get():
                            if event.type == pygame.QUIT:
                                pygame.quit()
                            if event.type == pygame.KEYUP:
                                waiting = False
            
    • show_gameover_screen()تابع صفحه اولیه بازی و صفحه Game over را نشان می دهد
    • pygame.display.flip()تنها بخشی از صفحه نمایش را به روز می کند، اما اگر هیچ Args عبور نکند، کل صفحه را به روز می کند
    • pygame.event.get()تمامی event های ذخیره شده در صف رویداد pygame را بر می گرداند.
    • اگر نوع event برابر با خروج باشد، pygame خارج خواهد شد
    • event.KEYUPرویدادی که با فشردن و رها کردن کلید رخ می دهد
  7. Game Loop
                first_round = True
                game_over = True        
                game_running = True    
                while game_running :
                    if game_over :
                        if first_round :
                            show_gameover_screen()
                            first_round = False
                        game_over = False
                        player_lives = 3
                        draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
                        score = 0
    
                    for event in pygame.event.get():
    
                        if event.type == pygame.QUIT:
                            game_running = False
    
                    gameDisplay.blit(background, (0, 0))
                    gameDisplay.blit(score_text, (0, 0))
                    draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
    
                    for key, value in data.items():
                        if value['throw']:
                            value['x'] += value['speed_x']
                            value['y'] += value['speed_y']
                            value['speed_y'] += (1 * value['t'])
                            value['t'] += 1
    
                            if value['y'] <= 800:
                                gameDisplay.blit(value['img'], (value['x'], value['y']))
                            else:
                                generate_random_fruits(key)
    
                            current_position = pygame.mouse.get_pos()
    
                            if not value['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 \
                                    and current_position[1] > value['y'] and current_position[1] < value['y']+60:
                                if key == 'bomb':
                                    player_lives -= 1
                                    if player_lives == 0:
                                        hide_cross_lives(690, 15)
                                    elif player_lives == 1 :
                                        hide_cross_lives(725, 15)
                                    elif player_lives == 2 :
                                        hide_cross_lives(760, 15)
                                
                                    if player_lives < 0 :
                                        show_gameover_screen()
                                        game_over = True
    
                                    half_fruit_path = "images/explosion.png"
                                else:
                                    half_fruit_path = "images/" + "half_" + key + ".png"
    
                                value['img'] = pygame.image.load(half_fruit_path)
                                value['speed_x'] += 10
                                if key != 'bomb' :
                                    score += 1
                                score_text = font.render('Score : ' + str(score), True, (255, 255, 255))
                                value['hit'] = True
                        else:
                            generate_random_fruits(key)
    
                    pygame.display.update()
                    clock.tick(FPS)
    
                pygame.quit()
            
    • این حلقه اصلی بازی است
    • game_over در صورتی که بیش از 3-Bomb قطع شده باشد، بازی را به حالت حلقه خاتمه خواهد داد
    • game_running برای مدیریت حلقه بازی استفاده می شود
    • اگر از event type خارج شود بازیبسته خواهد شد.
    • در این game loop ما میوه های داخل صفحه را به صورت داینامیک نمایش می دهیم
    • اگر میوه ای قطع نشود هیچ اتفاقی برای آن نمی افتد. اگر میوه بریده شود، یک تصویر میوه نیمه بریده باید به جای آن میوه ظاهر شود
    • اگر کاربر برای سه بار روی بمب ها کلیک کند، یک پیام GAME OVER باید نمایش داده شود و پنجره باید reset شود.
    • ()clock.tick حلقه را با سرعت مناسب نگه می دارد (فریم/ثانیه را مدیریت می کند). حلقه باید بعد از هر 1/12 ثانیه به روز شود

خروجی پروژه Fruit Ninja

مثالی از معماری میکروسرویس


پروژه مرتبط :

پروژه ساخت ربات تلگرام با پایتون

1403/03/06 16517 2172
رمز عبور : tahlildadeh.com یا www.tahlildade.com
نظرات شما

نظرات خود را ثبت کنید...