前言:
无聊的时候学习了一下pygame开发小游戏,自我感觉挺不错的,借鉴网上《飞机大战》的思路,并对其进行改善,实现了自己的一个简单的《飞机大战》小程序。
说明:
-
精灵类:
- 基类:GameSprite(精灵)。
- 派生类:Backgroud(背景)、Enemy(敌军飞机)、Hero(玩家)、Bullet(子弹)。
-
功能:
- 上下左右键移动飞机。
- 当飞机击中敌机时得分加一,并且显示在屏幕上。
-
素材下载地址:百度网盘 密码:5l5x
主程序:
import pygame
import sys
from plane_sprites import *
class PlaneGame(object):
def __init__(self):
print('game init!')
pygame.font.init()
self.font = pygame.font.SysFont("Arial", 50)
self.screen = pygame.display.set_mode(Screen_rect.size)
self.clock = pygame.time.Clock()
self.__create_sprites()
self.score = 0
pygame.time.set_timer(Create_enemy_event, 1000)
pygame.time.set_timer(Hero_fire_event, 500)
def __create_sprites(self):
bg1 = Background()
bg2 = Background(True)
self.back_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('game start!')
while True:
self.clock.tick(Frame_per_sec)
self.__event_handler()
self.__check_collide()
self.__update_sprites()
pygame.display.update()
def __event_handler(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
PlaneGame.__game_over()
elif event.type == Create_enemy_event:
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 = 2
elif keys_pressed[pygame.K_LEFT]:
self.hero.speed = -2
elif keys_pressed[pygame.K_UP]:
self.hero.speed1 = -2
elif keys_pressed[pygame.K_DOWN]:
self.hero.speed1 = 2
else:
self.hero.speed = 0
self.hero.speed1 = 0
def __display_score(self):
final_text2 = "Score: " + str(self.score)
ft2_font = pygame.font.SysFont("Arial", 30)
ft2_surf = self.font.render(final_text2, 1, (253, 177, 6))
self.screen.blit(ft2_surf, [self.screen.get_width() / 2 - ft2_surf.get_width() / 2, 200])
pygame.display.flip()
def __check_collide(self):
if pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True):
self.score += 1
enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group ,True)
if len(enemies) > 0:
self.hero.kill()
PlaneGame.__game_over()
else:
PlaneGame.__display_score(self)
def __update_sprites(self):
self.back_group.update()
self.back_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('game over!')
pygame.quit()
exit()
if __name__ == '__main__':
game = PlaneGame()
game.start_game()
精灵类:
import random
import pygame
#屏幕大小
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, speed1 = 1):
super().__init__()
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
self.speed1 = speed1
def update(self):
self.rect.y += self.speed#在屏幕垂向移动
class Background(GameSprite):
#游戏背景精灵
def __init__(self, is_alt = False):
super().__init__('./src/background.png')
if is_alt:
self.rect.y = -self.rect.height
def update(self):
super().update()
if self.rect.y >= Screen_rect.height:
self.rect.y = -self.rect.height
class Enemy(GameSprite):
#敌方精灵
def __init__(self):
super().__init__('./src/enemy1.png')
#指定敌方随机初始数量
self.speed = random.randint(1, 3)
#指定敌方初始位置
self.rect.bottom = 0
bullets = pygame.sprite.Group()
max_x = Screen_rect.width - self.rect.width
self.rect.x = random.randint(0, max_x)
def update(self):
super().update()
if self.rect.y >= Screen_rect.height:
self.kill()
def fire(self):
for i in (0, 1):
bullet = Bullet()
bullet.rect.bottom = self.rect.y + i * 20
bullet.rect.centerx = self.rect.centerx
self.bullets.add(bullet)
def __del__(self):
pass
class Hero(GameSprite):
#己方飞机精灵
def __init__(self):
super().__init__("./src/myplane.png",0, 0)
self.rect.centerx = Screen_rect.centerx
self.rect.bottom = Screen_rect.bottom - 120
self.bullets = pygame.sprite.Group()
def update(self):
self.rect.x += self.speed
self.rect.y += self.speed1
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.right > Screen_rect.right:
self.rect.right = Screen_rect.right
if self.rect.y < 0:
self.rect.y = 0
elif self.rect.bottom > Screen_rect.bottom:
self.rect.bottom = Screen_rect.bottom
def fire(self):
print('open fire!')
for i in (0,1,2):
bullet = Bullet()
bullet.rect.bottom = self.rect.y - i*20
bullet.rect.centerx = self.rect.centerx
self.bullets.add(bullet)
class (BulletGameSprite):
#子弹精灵
def __init__(self):
super().__init__('./src/bullet1.png', -2)
def update(self):
super().update()
if self.rect.bottom < 0:
self.kill()
def __del__(self):
print('bullet destoried!')
运行效果:
- 打中敌机后得分加一:
- 移动飞机到任意位置: