Arvanttt

تند و سریع

Arvant

تند و سریع












pygame در ۱۰ دقیقه

جمعه, ۲۸ تیر ۱۳۹۲، ۱۱:۲۳ ق.ظ

قبلاَ یه پست در مورد pygame گذاشته بودم حالا خواستم یه مثال ساده از این بازی رو هم قرار بدم که افرادی که دوست داشتن به تونن به عنوان راهنما ازش استفاده کنن :) .در ابتدا باید ماژولای pygame رو از سایتشون دانلود کنید و به پایتون اضافه کنید .

خب اولاَ لازمه که مشخصات صفحه نمایش رو تعیین کنیم که اینجا 640*480 قرار داده شده و شما می تونید به دلخواه پنجره خودتون رو بسازید.

بعد اندازه هر واحد از صفحه ای رو که مار می تونی در باره حرکت داشته باشه تعیین کردیم که اینجا مقدار 20*20 در نظر گرفته شده .همچنین رنگ سیاه هم توسط مقادیر RGB تعین شده .

 

import pygame # pillar of our game
import sys # because of sys.exit()
from pygame.locals import * # pygame event type constants 
import random # bacause of randrange(min, max, step)
 
LEFT = -20
RIGHT = 20
UP = 10
DOWN = -10
 
BLACK = 0, 0, 0
 
SIZE = WIDTH, HEIGHT = 640, 480
BLOCK_SIZE = 20

حالا باید ببینیم چه کلاس های لازم داریم .خب تو بازی یه مار داریم که یه کلاسSnake براش در نظر می گیریم .بعد لقمه های که هر بار مار باید بخوره که کلاس Food به این منظوره و بعد هر قسمت از مار هم خودش یه کلاس چداگانه می خواد به اسم Part 

class Snake:
    def __init__(self):
        pass
 
class Part:
    def __init__(self):
        pass
 
class Food:
    def __init__(self):
        pass

بعد از تعریف کلاس ها نوبت به متد های هر کلاس میرسه:

لقمه احتمال داره در هر قسمت از صفحه به صورت تصادفی ظاهر بشه پس یک متد به اسم spawn برای کلاس Food داریم . مار امکان حرکت رو داره پس move یکی دیگه از متد هاست همچنین ما نیاز به تغیر جهت مار هم داریم پس متد change_direction هم لازم داریم که به هر دوی کلاس های Snake و Part این متد ها رو اضافه می کنیم.همین طور وقتی که مار به غذا میرسه باید کشیده بشه و افزایش طول داشته باشه پس یه متد extend  اضافی هم برای کلاس Snake لازم داریم.

class Snake:
    def __init__(self):
        pass
 
    def move(self):
        pass
 
    def change_direction(self):
        pass
 
    def extend(self):
        pass
 
class Part:
    def __init__(self):
        pass
 
    def move(self):
        pass
 
    def change_direction(self):
        pass
 
class Food:
    def __init__(self):
        pass
 
    def spawn(self):
        pass

و در اتمام تکمیل این متد ها رو خواهیم داشت

import pygame # pillar of our game
import sys # because of sys.exit()
from pygame.locals import * # pygame event type constants 
import random # bacause of randrange(min, max, step)
 
LEFT = -20
RIGHT = 20
UP = 10
DOWN = -10
 
BLACK = 0, 0, 0
 
SIZE = WIDTH, HEIGHT = 640, 480
BLOCK_SIZE = 20
 
class Food:
    def __init__(self, screen, snake):
        self.snake = snake
        self.screen = screen
        self.image = pygame.image.load('food.bmp').convert()
        self.spawn()
 
    def spawn(self):
        collision = True
 
        while collision:
            random_x = random.randrange(0, WIDTH, BLOCK_SIZE)
            random_y = random.randrange(0, HEIGHT, BLOCK_SIZE)
 
            collision = False
 
            for each in snake.parts:
                if each.position.x == random_x and each.position.y == random_y:
                    collision = True
                    break
 
        self.position = self.image.get_rect().move(random_x, random_y)
 
        self.blit()
 
    def blit(self):
        self.screen.blit(self.image, self.position)
 
class Part:
    def __init__(self, x=0, y=0, direction=RIGHT):
        self.direction = direction
        self.image = pygame.image.load('part.bmp').convert()
        self.position = self.image.get_rect().move(x, y)
        self.speed = BLOCK_SIZE
 
    def change_direction(self, direction):
        if self.direction + direction == 0:
            return
 
        self.direction = direction
 
    def move(self):
        if self.position.x >= WIDTH - BLOCK_SIZE and self.direction == RIGHT:
            return False
 
        if self.position.y >= HEIGHT - BLOCK_SIZE and self.direction == DOWN:
            return False
 
        if self.position.x <= 0 and self.direction == LEFT:
            return False
 
        if self.position.y <= 0 and self.direction == UP:
            return False
 
        if self.direction == UP:
            self.position = self.position.move(0, -self.speed)
        elif self.direction == DOWN:
            self.position = self.position.move(0, self.speed)
        elif self.direction == RIGHT:
            self.position = self.position.move(self.speed, 0)
        elif self.direction == LEFT:
            self.position = self.position.move(-self.speed, 0)
 
        return True
 
class Snake:
    def __init__(self, screen, x=0, y=0):
        self.screen = screen
        self.head = Part(x, y)
        self.direction = RIGHT
        self.length = 1
        self.parts = []
        self.parts.append(self.head)
        self.extend_flag = False
 
    def change_direction(self, direction):
        self.direction = direction
 
    def move(self, food):
        new_direction = self.direction
        old_direction = None
        new_part = None
 
        if self.extend_flag:
            last_part = self.parts[-1]
            new_part = Part(last_part.position.x,
                            last_part.position.y,
                            last_part.direction)
 
        for each in self.parts:
            old_direction = each.direction
            each.change_direction(new_direction)
 
            if not each.move():
                return False
 
            new_direction = old_direction
 
        if self.extend_flag:
            self.extend(new_part)
 
        for each in self.parts[1:]:
            if (each.position.x == self.head.position.x and
                each.position.y == self.head.position.y):
                return False
 
        if (food.position.x == self.head.position.x and 
            food.position.y == self.head.position.y):
 
            food.spawn()
            self.extend_flag = True
 
        return True
 
    def extend(self, part):
        self.parts.append(part)
        self.length += 1
        self.extend_flag = False
 
    def blit(self):
        for each in self.parts:
            self.screen.blit(each.image, each.position)
 
pygame.init()
pygame.display.set_caption('Snake by Simpliplant')
screen = pygame.display.set_mode(SIZE)
 
game = True
 
while True:
    snake = Snake(screen)
    food = Food(screen, snake)
 
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
 
            if event.type == KEYDOWN:
                if (event.key == K_RIGHT):
                    snake.change_direction(RIGHT)
                elif (event.key == K_LEFT):
                    snake.change_direction(LEFT)
                elif (event.key == K_UP):
                    snake.change_direction(UP)
                elif (event.key == K_DOWN):
                    snake.change_direction(DOWN)
                elif (event.key == K_SPACE):
                    snake.extend_flag = True
 
        if not snake.move(food):
            game = False
            break
 
        screen.fill(black)
        snake.blit()
        food.blit()
        pygame.display.update()
        pygame.time.delay(100)
 
    while not game:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: sys.exit()
 
            if event.type == KEYDOWN:
                if (event.key == K_SPACE):
                    game = True
                elif (event.key == K_RETURN):
                    game = True
 
        background = pygame.image.load('gameover.bmp').convert()
        screen.blit(background, (0, 0))
        pygame.display.update()
        pygame.time.delay(100)

دانلود سورس کامل به همراه منابع

منبع

 

 

 

  • موافقین ۱ مخالفین ۰
  • جمعه, ۲۸ تیر ۱۳۹۲، ۱۱:۲۳ ق.ظ
به اشتراک می گذارم : به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم به اشتراک بگذاریم