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 cookielib 登录人人网的实现代码
Dec 19 Python
python算法学习之基数排序实例
Dec 18 Python
Python正则表达式的使用范例详解
Aug 08 Python
在Python中处理列表之reverse()方法的使用教程
May 21 Python
Python中返回字典键的值的values()方法使用
May 22 Python
tensorflow训练中出现nan问题的解决
Feb 10 Python
详解python分布式进程
Oct 08 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
Jan 28 Python
Python3 获取文件属性的方式(时间、大小等)
Mar 12 Python
详解python中的闭包
Sep 07 Python
用python实现一个简单计算器(完整DEMO)
Oct 14 Python
Python如何让字典保持有序排列
Apr 29 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
一次编写,随处运行
2006/10/09 PHP
虚拟主机中对PHP的特殊设置
2006/10/09 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
异步加载script的代码
2011/01/12 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
jQuery选择器源码解读(四):tokenize方法的Expr.preFilter
2015/03/31 Javascript
js实现对ajax请求面向对象的封装
2016/01/08 Javascript
jquery制做精致的倒计时特效
2016/06/13 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
JS实现的加减乘除四则运算计算器示例
2017/08/09 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
JS如何实现手机端输入验证码效果
2020/05/13 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
用vue设计一个日历表
2020/12/03 Vue.js
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
Python引用模块和查找模块路径
2016/03/17 Python
python语言基本语句用法总结
2019/06/11 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
Python读取yaml文件的详细教程
2020/07/21 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
python 基于pygame实现俄罗斯方块
2021/03/02 Python
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
英国儿童设计师服装和玩具购物网站:Zac & Lulu
2020/10/19 全球购物
小学三年级数学教学反思
2014/01/31 职场文书
文明城市标语
2014/06/16 职场文书
医药销售自我评价200字
2014/09/11 职场文书
小学生思想品德评语
2014/12/31 职场文书
鲁迅故居导游词
2015/02/05 职场文书
优秀志愿者感言
2015/08/01 职场文书
某某幼儿园的教育教学管理调研分析报告
2019/11/29 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis