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)
دانلود سورس کامل به همراه منابع