1. 程式人生 > >用pyhton寫了一個飛機大戰

用pyhton寫了一個飛機大戰

import pygame
from plane_sprites import *


class PlaneGame(object):
"""飛機大戰主遊戲"""

def __init__(self):
print("遊戲初始化")
# 1,繪製螢幕視窗
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2,建立時鐘
self.clock = pygame.time.Clock()
# 3,呼叫私有方法,精靈和精靈組的建立
self.sprite_creat()
# 4,設定定時器事件,建立敵機
pygame.time.set_timer(CREATE_ENEMY_EVENT, 400)
pygame.time.set_timer(HERO_FIRE_EVENT, 200)
def sprite_creat(self):
bg1 = BackGround()
bg2 = BackGround(True)
self.bg_group = pygame.sprite.Group(bg1, bg2)
self.enemy_group = pygame.sprite.Group()

# 建立英雄的精靈和精靈組
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero)

def start_game(self):
print("遊戲開始。。。")
while True:
# 1,設定重新整理幀率
self.clock.tick(FRAME_PER_SEC)
# 2,事件監聽
self.__event_handle()
# 3,碰撞檢測
self.__check_collide()
# 4,更新/繪製精靈和精靈組
self.__updtae_sprites()
# 5,更新顯示
pygame.display.update()

def __event_handle(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
PlaneGame.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
print("敵機出場。。。")
# 建立敵機精靈
enemy = Enemy()
# 敵機精靈新增到敵機精靈組
self.enemy_group.add(enemy)
elif event.type == HERO_FIRE_EVENT:
self.hero.fire()

# 移動英雄
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
self.hero.speed = 5
elif keys_pressed[pygame.K_LEFT]:
self.hero.speed = -5
else:
self.hero.speed = 0

def __check_collide(self):
pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)
if len(enemies) > 0:
self.hero.kill()
PlaneGame.__game_over()

def __updtae_sprites(self):

self.bg_group.update()
self.bg_group.draw(self.screen)

self.enemy_group.update()
self.enemy_group.draw(self.screen)

self.hero_group.update()
self.hero_group.draw(self.screen)

self.hero.bullets.update()
self.hero.bullets.draw(self.screen)

@staticmethod
def __game_over():
print("遊戲結束了")
pygame.quit()
exit()


if __name__ == '__main__':

# 建立遊戲物件
game = PlaneGame()

# 啟動遊戲
game.start_game()
import pygame
import random

# 螢幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 重新整理幀率
FRAME_PER_SEC = 60
# 建立敵機的定時器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 建立發射子彈事件常量
HERO_FIRE_EVENT = pygame.USEREVENT + 1


class GameSprite(pygame.sprite.Sprite):

def __init__(self, image_name, speed=1):
super().__init__()
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed

def update(self):
self.rect.y += self.speed


class BackGround(GameSprite):

def __init__(self, is_alt=False):
super().__init__("timg (1).jpg")
if is_alt:
self.rect.y = -self.rect.height

def update(self):
self.rect.y += self.speed
# self.speed += 0.0001
# 判斷背景圖片是否移出螢幕視窗
if self.rect.y > SCREEN_RECT.height:
self.rect.y = -self.rect.height


class Enemy(GameSprite):

def __init__(self):
super().__init__("aline222.png")
# 隨機敵機的速度
self.speed = random.randint(2, 5)

# 隨機敵機的水平位置
self.rect.x = random.randint(0, (SCREEN_RECT.width-self.rect.width))

def update(self):
super().update()
# 判斷敵機是否移出螢幕
if self.rect.y > SCREEN_RECT.height:
print("飛出螢幕。。。")
# 將敵機從敵機精靈組中刪除
self.kill()

def __del__(self):
print("刪除敵機")


class Hero(GameSprite):
"""英雄類"""

def __init__(self):
super(Hero, self).__init__("plane33.png", 0)
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 80
self.bullets = pygame.sprite.Group()

def update(self):
self.rect.x += self.speed
if self.rect.x <= 0:
self.rect.x = 0
elif self.rect.x >= (SCREEN_RECT.width - self.rect.width):
self.rect.x = SCREEN_RECT.width - self.rect.width

def fire(self):
# 建立子彈精靈
bullet = Bullet()

# 設定子彈精靈的位置
bullet.rect.bottom = self.rect.y -5
bullet.rect.centerx = self.rect.centerx

# 將子彈精靈新增到子彈精靈組中去
self.bullets.add(bullet)


class Bullet(GameSprite):

def __init__(self):
super(Bullet, self).__init__('buleet6.png', -2)

def update(self):
super(Bullet, self).update()
if self.rect.y <= 0:
self.kill()