Python 实现飞机大战
·
研究生入学前自学python
自我感觉python语法很简单易学 很多知识 类中的方法需要我们反复记忆 pygame模块提供的方法编写游戏真的太强大了
学完python基础 自己编写了一个小游戏(当然不会的地方还是看老师教程)希望能给小伙伴们提供参考
ok开始 建两个python文件就能搞定。
1.plane_main.py 用于编写游戏主函数类
2.plane_sprite.py 用于编写精灵类 (精灵类一定要学会 因为封装的方法太让人佩服)
(1)主函数类代码
#杜锋
#开发时间 2021/5/1216:45
import pygame
from plane_sprites import *
class PlaneGame(object):
'''飞机大战主游戏'''
def __init__(self):
print('游戏初始化')
#1.创建游戏窗口
self.screen=pygame.display.set_mode(SCREEN_RECT.size) #.size 返回的是一个元组
# 2.创建游戏时钟
self.clock=pygame.time.Clock()
# 3.调用私有方法 完成精灵组创建
self.__creat_sprites()
#设置定时器事件 1s执行一次此事件
pygame.time.set_timer(CREAT_ENEMY_EVENT,1000)
pygame.time.set_timer(HERO_FIRE_EVENT,500)
def __creat_sprites(self):
bg1=Background() #创建精灵
bg2=Background(True) #创建背景精灵2
self.back_groung=pygame.sprite.Group(bg1,bg2)#创建精灵组
self.enemy_group=pygame.sprite.Group() #创建敌机精灵组
#创建英雄的精灵和精灵组
self.hero=Hero()
self.hero_group=pygame.sprite.Group(self.hero)
def srart_game(self):
print('游戏开始')
while True:
#设置刷新帧率
self.clock.tick(FRAME_PER_SEC) #一秒执行60次
#事件监听
self.__event_handler()
#碰撞检测
self.__check_collide()
#更新绘制精灵
self.__update_sprites()
#更新显示
pygame.display.update()
def __event_handler(self):
for item in pygame.event.get():
'''判断是否退出游戏'''
if item.type == pygame.QUIT:
PlaneGame.__game_over() #类名调用静态方法
elif item.type== CREAT_ENEMY_EVENT:
print('敌机出场')
#创建敌机精灵
enemy=Enemy()
self.enemy_group.add(enemy) #添加到精灵组
elif item.type== HERO_FIRE_EVENT:
self.hero.fire() #调用英雄发射子弹方法
#使用键盘提供的方法获取键盘按键 返回按键元组
keys_pressed= pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]==1: #pygame.K_LIFT为键盘常量
print('向右移动')
self.hero.speed=2
elif keys_pressed[pygame.K_LEFT]==1:
print('向左移动')
self.hero.speed=-2
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,dokill=True) #返回一个列表
#英雄与敌机碰撞
if len(enemies)>0:
self.hero.kill()
##结束游戏
PlaneGame.__game_over() #静态方法
def __update_sprites(self):
self.back_groung.update()
self.back_groung.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)
pygame.display.update()
@staticmethod #定义静态方法
def __game_over():
print('游戏结束')
pygame.quit()
exit()
if __name__ == '__main__':
'''创建游戏对象'''
game=PlaneGame()
#启动游戏
game.srart_game()
(2)精灵类代码
#杜锋
#开发时间 2021/5/1215:48
import random
import pygame
'''游戏精灵类'''
SCREEN_RECT=pygame.Rect(0,0,480,700)
#刷新的帧率
FRAME_PER_SEC=60
#创建敌机定时器常量
CREAT_ENEMY_EVENT= pygame.USEREVENT #就是定义一个事件
#发射子弹事件
HERO_FIRE_EVENT =pygame.USEREVENT+1 #常量
class GameSprite(pygame.sprite.Sprite):#.模块.类名称
'''飞机大战游戏精灵'''
def __init__(self,image_name,speed=1): #增加了speed属性
#调用父类初始化方法
super().__init__()
#定义对象属性
self.image=pygame.image.load(image_name)
self.rect =self.image.get_rect() #默认图片大小
self.speed=speed
def update(self): #update 更新位置
self.rect.y+=self.speed
class Background(GameSprite): #在子类中重写父类方法
'''游戏背景精灵'''
def __init__(self, is_alt=False): #在父类上增加了is_alt属性
super().__init__("./images/background.png")#调用父类方法
#判断是否是交替图像 如果是需要设置初始位置
if is_alt:
self.rect.y=-self.rect.height
def update(self):
#调用父类方法实现
super().update()
#判断是否移除屏幕
if self.rect.y>=SCREEN_RECT.height: #图像位置移除屏幕 图像位置为rect.y 刚开始为0
self.rect.y=-self.rect.height
class Enemy(GameSprite):
'''敌机精灵'''
def __init__(self):
super().__init__("./images/enemy1.png")
#敌机随机初始速度
self.speed=random.randint(1,2)
#敌机随机位置
self.rect.bottom=0 #从顶端进入
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('敌机死亡%s'% self.rect)
class Hero(GameSprite):
'''英雄精灵'''
def __init__(self):
#调用父类方法 并初始化图像 速度
super().__init__("./images/me1.png",0)
#设置英雄的初始位置
self.rect.centerx=SCREEN_RECT.centerx
self.rect.bottom=SCREEN_RECT.bottom - 120
#创建子弹精灵组
self.bullets=pygame.sprite.Group()
def update(self):
#英雄在水平方向上移动 只要修改x的值
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):
print('发射子弹')
for i in (0,1,2): #连续发射三颗子弹
#创建子弹精灵
bullet = Bullet()
#设置精灵位置
bullet.rect.bottom =self.rect.y-20*i
bullet.rect.centerx=self.rect.centerx
#将精灵添加到精灵组
self.bullets.add(bullet)
class Bullet(GameSprite):
def __init__(self):
super().__init__("./images/bullet2.png",-3)
def update(self):
#调用父类方法 让子弹垂直方向飞行
super().update()
#判断子弹飞出屏幕
if self.rect.bottom <0: #子弹出了屏幕
self.kill() #删除子弹
def __del__(self):
print('子弹被销毁')
(3)游戏中需要的图片文件
链接:https://pan.baidu.com/s/16NCbH19VDd7kIwzv0NbgAw 提取码:f990
更多推荐



所有评论(0)