python pygame模块编写飞机大战


Posted in Python onNovember 20, 2018

本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下

该程序没有使用精灵组,而是用列表存储对象来替代精灵组的动画效果。用矩形对象的重叠来判断相撞事件。该程序可以流畅运行,注释较为详细,希望可以帮助大家。

import pygame
from pygame.locals import *
from sys import exit
import time
import random

# 创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度
class Bullet():
 def __init__(self,bulletfilename,bulletpos):
  self.bulletimg = pygame.image.load(bulletfilename)
  self.bullet_rect = self.bulletimg.get_rect()
  self.bullet_image = self.bulletimg.subsurface(self.bullet_rect)
  self.bullet_rect.midbottom = bulletpos
  self.speed = 2
 def move(self):
  self.bullet_rect.top -= self.speed

# 创建玩家飞机类,用面向对象的思想来对待
class play_plane_fly():
 def __init__(self,play_image_filename,play_pos):
  self.image = pygame.image.load(play_image_filename)
  self.plane_rect = self.image.get_rect()
  self.play_image = self.image.subsurface(self.plane_rect)
  self.plane_rect.midtop = play_pos
  self.speed = 2
  # 子弹是由玩家飞机发射的,所以创建列表,存储子弹对象,使该列表变为该类的属性
  self.bullets = []
  self.is_hitted = False

 # 生成函数,完成发射子弹动作,同时将每个子弹对象存在列表中
 def shoot(self,bullet_filename):
  bulletobj = Bullet(bullet_filename,self.plane_rect.midtop)
  self.bullets.append(bulletobj)

 # 向上移动,当飞机移动到边框位置时,无法移动
 def moveup(self):
  if self.plane_rect.top <= 0:
   self.plane_rect.top = 0
  else:
   self.plane_rect.top -= self.speed

 # 向下移动,当飞机移动到边框位置时,无法移动
 def movedown(self):
  if self.plane_rect.top >= 950 - self.plane_rect.height:
   self.plane_rect.top = 950 - self.plane_rect.height
  else:
   self.plane_rect.top += self.speed

 # 向右移动,当飞机移动到边框位置时,无法移动
 def moveleft(self):
  if self.plane_rect.left <= -40:
   self.plane_rect.left = -40
  else:
   self.plane_rect.left -= self.speed

 # 向左移动,当飞机移动到边框位置时,无法移动
 def moveright(self):
  if self.plane_rect.left >= 700 - self.plane_rect.width:
   self.plane_rect.left = 700 - self.plane_rect.width
  else:
   self.plane_rect.left += self.speed

# 生成敌机类,设定固定的移动速度
class Enemy():
 def __init__(self,enemyfilename,enemypos):

  self.img = pygame.image.load(enemyfilename)
  self.enemy_rect = self.img.get_rect()
  self.enemy_image = self.img.subsurface(self.enemy_rect)
  self.enemy_rect.midbottom = enemypos
  self.speed = 1

 def move(self):
  self.enemy_rect.bottom += self.speed

clock = pygame.time.Clock()
def main():
 # 初始化文字屏幕
 pygame.font.init()
 # 初始化图像屏幕
 pygame.init()
 # 设定游戏帧
 clock.tick(50)
 # 设定游戏屏幕大小
 screen = pygame.display.set_mode((660,950))
 # 设定游戏名称
 pygame.display.set_caption('飞机大战')
 # 加载背景图片,生成图像对象
 background = pygame.image.load('image/background.png').convert()
 backgroundsurface = pygame.transform.scale(background, (660, 950))
 # 加载游戏结束图片,生成图像对象
 gameover = pygame.image.load('image/gameover.png').convert()
 gameoversurface = pygame.transform.scale(gameover,(660, 950))
 playplanefilename = 'image/myself.png'
 planepos = [330,600]
 player = play_plane_fly(playplanefilename,planepos)
 bulletfilename = 'image/bullet.png'
 # 按频率生成子弹,初始化数字为0
 bullet_frequency = 0
 enemyfilename = 'image/airplane.png'
 # 按频率生成敌机,初始化数字为0
 enemy_frequency = 0
 enemys = []
 myfont = pygame.font.SysFont("arial", 40)
 textImage = myfont.render("Score ", True, (0,0,0))
 # 初始化得分为0
 Score = 0
 # 敌机被子弹击中时的动画,将每张图片的图像对象存在列表中
 enenys_down = []
 enemy0_down = pygame.image.load('image/airplane_ember0.png')
 enemy0_down_rect = enemy0_down.get_rect()
 enemydown0 = enemy0_down.subsurface(enemy0_down_rect)
 enenys_down.append(enemydown0)
 enemy1_down = pygame.image.load('image/airplane_ember1.png')
 enemy1_down_rect = enemy1_down.get_rect()
 enemydown1 = enemy1_down.subsurface(enemy1_down_rect)
 enenys_down.append(enemydown1)
 enemy2_down = pygame.image.load('image/airplane_ember2.png')
 enemy2_down_rect = enemy2_down.get_rect()
 enemydown2 = enemy2_down.subsurface(enemy2_down_rect)
 enenys_down.append(enemydown2)
 enemy3_down = pygame.image.load('image/airplane_ember3.png')
 enemy3_down_rect = enemy3_down.get_rect()
 enemydown3 = enemy3_down.subsurface(enemy3_down_rect)
 enenys_down.append(enemydown3)


 while True:
  # 动态显示得分
  score = str(Score)
  myscore = pygame.font.SysFont("arial", 40)
  scoreImage = myscore.render(score, True, (0, 0, 0))
  # 判断事件,防止卡顿或者意外退出
  for event in pygame.event.get():
   if event.type == pygame.QUIT:
    pygame.quit()
    exit()
  key_pressed = pygame.key.get_pressed()
  if key_pressed[K_UP] or key_pressed[K_w]:
   player.moveup()
  if key_pressed[K_DOWN] or key_pressed[K_s]:
   player.movedown()
  if key_pressed[K_LEFT] or key_pressed[K_a]:
   player.moveleft()
  if key_pressed[K_RIGHT] or key_pressed[K_d]:
   player.moveright()

  screen.blit(backgroundsurface, (0, 0))

  if not player.is_hitted:
   # 按频率生成子弹
   if bullet_frequency % 30 == 0:
    player.shoot(bulletfilename)
   bullet_frequency += 1
   if bullet_frequency >= 30:
    bullet_frequency = 0
   # 让子弹动起来
   for i in player.bullets:
    i.move()
    screen.blit(i.bullet_image,i.bullet_rect)
    # 当子弹飞出屏幕,删除子弹对象
    if i.bullet_rect.bottom <= 0:
     player.bullets.remove(i)
   # 按频率生成敌机
   if enemy_frequency % 100 == 0:
    enemypos = [random.randint(30, 630), 0]
    enemyplane = Enemy(enemyfilename, enemypos)
    #将敌机对象添加到列表中
    enemys.append(enemyplane)
   enemy_frequency += 1
   if enemy_frequency >= 100:
    enemy_frequency = 0
   # 让敌机动起来
   for i in enemys:
    i.move()
    screen.blit(i.enemy_image,i.enemy_rect)
    # 当敌机飞出屏幕,删除敌机对象
    if i.enemy_rect.bottom >= 950:
     enemys.remove(i)
    # 遍历子弹对象,判断子弹是否击中敌机
    for j in player.bullets:
     # 如果击中,分数增加,同时移除该子弹和敌机对象
     if pygame.Rect.colliderect(j.bullet_rect,i.enemy_rect):
      Score += 100
      enemys.remove(i)
      player.bullets.remove(j)
      for k in enenys_down:
       screen.blit(k,i.enemy_rect)
    # 遍历敌机对象,判断玩家是否和敌机相撞
    if pygame.Rect.colliderect(player.plane_rect,i.enemy_rect):
     # 修改is_hitted的值,跳出该层循环
     player.is_hitted = True
     break


   screen.blit(player.play_image,player.plane_rect)
   screen.blit(textImage, (0,0))
   screen.blit(scoreImage, (110, 0))
   pygame.display.update()
  # 玩家退出时显示分数和游戏结束
  else:
   screen.blit(gameoversurface,(0,0))
   screen.blit(textImage, (0, 0))
   screen.blit(scoreImage, (110, 0))
   pygame.display.update()
   time.sleep(2)
   break

main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现根据窗口标题调用窗口的方法
Mar 13 Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 Python
Python网络编程 Python套接字编程
Sep 13 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
Python实现将字符串的首字母变为大写,其余都变为小写的方法
Jun 11 Python
python获取磁盘号下盘符步骤详解
Jun 19 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
Django多数据库的实现过程详解
Aug 01 Python
Python实现微信机器人的方法
Sep 06 Python
基于python 取余问题(%)详解
Jun 03 Python
Numpy中np.max的用法及np.maximum区别
Nov 27 Python
Matplotlib可视化之添加让统计图变得简单易懂的注释
Jun 11 Python
Python Scapy随心所欲研究TCP协议栈
Nov 20 #Python
python版飞机大战代码分享
Nov 20 #Python
pygame实现雷电游戏雏形开发
Nov 20 #Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 #Python
pygame游戏之旅 添加键盘按键的方法
Nov 20 #Python
pygame游戏之旅 载入小车图片、更新窗口
Nov 20 #Python
一文带你了解Python中的字符串是什么
Nov 20 #Python
You might like
新52大事件
2020/03/03 欧美动漫
解析php mysql 事务处理回滚操作(附实例)
2013/08/05 PHP
php中smarty区域循环的方法
2015/06/11 PHP
tp5.1 框架join方法用法实例分析
2020/05/26 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
vue项目中应用ueditor自定义上传按钮功能
2018/04/27 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
JavaScript中CreateTextFile函数
2020/08/30 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
解决python3 urllib中urlopen报错的问题
2017/03/25 Python
Python入门_浅谈for循环、while循环
2017/05/16 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
Python中的函数作用域
2018/05/07 Python
python统计中文字符数量的两种方法
2019/01/31 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2014/07/21 面试题
车间调度岗位职责
2013/11/30 职场文书
毕业自荐信
2013/12/16 职场文书
门前三包责任书
2014/04/15 职场文书
四年级评语大全
2014/04/21 职场文书
奥巴马就职演讲稿
2014/05/15 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
丧事答谢词大全
2015/09/30 职场文书
vue项目中的支付功能实现(微信支付和支付宝支付)
2022/02/18 Vue.js