python pygame实现滚动横版射击游戏城市之战


Posted in Python onNovember 25, 2019

pygame城市之战横版射击游戏,按上下左右方向箭头操作飞机。这是一个横板射击小游戏,在黑夜的城市上空,你将要操作一架飞机去射击敌机,爆炸效果还不错。

在游戏中定义了滚动的背景类,定义了飞机类Plane,定义了子弹类,敌机类,爆炸类等,是学习Pygame和面向对象编程的好例子。

代码:

import math
import time
import pygame
from pygame.locals import *
from random import choice,randint
 
class ScrolledBackground(pygame.sprite.Sprite):
 def __init__(self,image,screen):
  pygame.sprite.Sprite.__init__(self)
  self.screen = screen
  self.width = screen.get_width()
  self.height = screen.get_height()
  self.image0 = pygame.image.load(image).convert_alpha()
  self.image1 = pygame.image.load(image).convert_alpha()
 
  self.rect0 = self.image0.get_rect()  
  self.rect1 = self.image1.get_rect()
  self.rect1.left = self.rect0.right
  self.dx = -10
  self.dy = 0
  
 def update(self):
  pass
 
 def draw(self):
  pass
 
 
class Plane(pygame.sprite.Sprite):
 def __init__(self,image,keys,screen):
  pygame.sprite.Sprite.__init__(self)
  self.keys = keys     # 上下左右按键
  self.image = pygame.image.load(image).convert_alpha()
  self.screen = screen
  self.rect = self.image.get_rect()
  self.rect.centery = self.screen.get_height()//2
  self.xspeed = 0
  self.yspeed = 0
  self.dead = False     # 新增加的属性
  
 def keys_check(self,all_keys): 
  pass
 
 def update(self):
  self.rect.move_ip(self.xspeed,self.yspeed)
  
 def draw(self):
  self.screen.blit(self.image,self.rect)
  
class Bullet(pygame.sprite.Sprite):
 def __init__(self,image,plane,group,screen):
  pygame.sprite.Sprite.__init__(self)
  self.plane = plane
  self.image = pygame.image.load(image).convert_alpha()
  self.rect = self.image.get_rect()
  self.rect.center = plane.rect.center
  self.group = group
  self.group.add(self)
  self.screen = screen
  self.screen_width = screen.get_width()
  self.screen_height = screen.get_height()  
  
 def update(self):
  self.rect.move_ip(10,0)
  if self.rect.left > self.screen_width :
   self.group.remove(self)
   
def split_images(image,rows,cols):
 """image是一张图片,把它切分为若干图,返回列表"""
 global explosion_images_list
 image = pygame.image.load(image)
 step_width = image.get_width()//cols
 step_height = image.get_height()//rows
 
 pass   
   
class Explosion(pygame.sprite.Sprite):
 """爆炸效果类,显示一系列帧图"""
 def __init__(self,surimages,position,group):
  pygame.sprite.Sprite.__init__(self)
  self.surimages = surimages      # 爆炸效果用到的surface列表
  self.index = 0
  self.amounts = len(surimages)
  self.image = self.surimages[self.index]   # 初始造型
  self.rect = self.image.get_rect()    # 矩形对象
  self.rect.center = position      # 爆炸位置
  self.group = group
  self.group.add(self)
  self.interval_time = 0.01      # 造型切换时间
  self.begin_time = time.time()     # 爆炸起始时间
  
 def update(self):         # 换造型
  
  if time.time() - self.begin_time >= self.interval_time: # 超时,则换造型
   if self.index < self.amounts:
    self.image = self.surimages[self.index]
    self.index = self.index + 1
    self.begin_time = time.time()
   else:
    self.group.remove(self)     # 造型切换完了则从组中移除自己
    
class Enemy(pygame.sprite.Sprite):
 def __init__(self,images,group,screen):
  """images是surface列表"""
  pygame.sprite.Sprite.__init__(self)
  self.screen = screen
  self.screen_width = self.screen.get_width()  # 获取屏幕宽度
  self.screen_height = self.screen.get_height() # 获取屏幕高度
  self.image = choice(images)      # 随机选择一个surface
  self.rect = self.image.get_rect()
  self.rect.left = self.screen_width + randint(10,self.screen_width)
  self.rect.centery = randint(0,self.screen_height)
  self.group = group
  self.group.add(self)       # 加入到自己的组
 def update(self):
  self.rect.move_ip(-5,0)
  if self.rect.right <= 0 :
   self.group.remove(self)
  
class Eullet(pygame.sprite.Sprite):
 """敌方子弹类"""
 def __init__(self,image,selfgroup,enemy_group,plane,screen):
  """参数列表:image,已转换成surface的对象
      selfgroup,所在的组
      enemy_group,敌人组.
      plane,我方飞机
      screen,屏幕对象
  """ 
  pass
  
 def update(self):
  self.rect.move_ip(-self.dx//30,-self.dy//30)
  if self.beyond_edge() :
   self.group.remove(self)
 
 def beyond_edge(self): 
  pass
 
def collision_check():
 """对游戏中的对象进行碰撞检测,碰撞检测有以下几种:
  1、我方飞机碰到敌方飞机,都爆炸。给我方飞机增加dead属性。
  2、我方飞机碰到敌方子弹,我方飞机爆炸,游戏结束。
  3、敌方飞机碰到我方子弹,敌方飞机爆炸。
  以下引用的是全局变量
 """
 global enemy_counter
 "我方飞机和敌方飞机任何一架的碰撞"
 if not plane1.dead:
  eny = pygame.sprite.spritecollideany(plane1, group_enemy)
  if eny!=None :               # 碰到了,我方飞机死,游戏结束    
   Explosion(explosion_images_list,eny.rect.center,group_explosion) # 在敌方飞机处发生爆炸
   Explosion(explosion_images_list,plane1.rect.center,group_explosion) # 在我方飞机处发生爆炸
   plane1.dead = True
   group_enemy.remove(eny)            # 从敌方组中移除碰撞的敌机
   
 "我方飞机碰到敌方子弹,我方死,游戏结束。"
 if not plane1.dead:
  b = pygame.sprite.spritecollideany(plane1, group_enemy_bullet)
  if b!=None :               # 碰到了,我方飞机死,游戏结束    
   Explosion(explosion_images_list,plane1.rect.center,group_explosion) # 在我方飞机处发生爆炸
   plane1.dead = True
   
 "敌方飞机碰到我方子弹,我方子弹爆,敌方爆炸"
 result_dict = pygame.sprite.groupcollide(group_bullet1, group_enemy, True, True) # 一颗子弹可能打到几架飞机
 if result_dict !={}:
  missle = list(result_dict.keys())[0]          # 碰到我方子弹
  enemy_list = result_dict[missle]
  #Explosion(explosion_images_list,missle.rect.center,group_explosion)
  enemy_counter += len(enemy_list)       # 大于一定的数量,如果我方战机没死,则成功结束
  for e in enemy_list: Explosion(explosion_images_list,e.rect.center,group_explosion)
  
  pygame.display.set_caption("风火轮少儿编程_城市之战射击游戏,当前打爆敌机数:" + str(enemy_counter) + ",请自行编写游戏成功结束的代码!")
  
  
 
if __name__ == "__main__":
 
 width,height = 480,360
 enemy_bullet = "images/bullet2.png"
 enemy_images = ["images/enemy0.png","images/enemy1.png","images/enemy2.png","images/enemy3.png"]
 explosion_images = "images/explosion.png"
 image = "images/night city with street.png"
 plane_image1 = "images/plane.png"
 bullet_image1 = "images/bullet.png"
 
 pygame.init()
 screen = pygame.display.set_mode((width,height))
 pygame.display.set_caption("城市之战,按上下左右操作飞机。风火轮少儿编程_www.scratch8.net")
 
 enemy_bullet = pygame.image.load(enemy_bullet)
 enemy_images = [pygame.image.load(img) for img in enemy_images] # 形成敌机的surface列表
 explosion_images_list = []        # 爆炸效果surface列表
 explosion_images = split_images(explosion_images,2,13) # 按2行13列切分图形,返回surface列表
 
 
 keys1 = [K_UP,K_DOWN,K_LEFT,K_RIGHT]
 plane1 = Plane(plane_image1,keys1,screen)
 bg = ScrolledBackground(image,screen)
 running = True
 clock = pygame.time.Clock()
 
 bullet1_shoot_EVENT = USEREVENT + 1
 pygame.time.set_timer(bullet1_shoot_EVENT,500)
 
 "敌机定时生成事件"
 enemy_EVENT = USEREVENT + 2
 pygame.time.set_timer(enemy_EVENT,1000)
 
 "敌机定时发射子弹事件"
 enemy_shoot_EVENT = USEREVENT + 3
 pygame.time.set_timer(enemy_shoot_EVENT,50)
 
 group_explosion = pygame.sprite.Group()
 group_bullet1 = pygame.sprite.Group()
 group_enemy = pygame.sprite.Group()
 group_enemy_bullet = pygame.sprite.Group()
 enemy_amounts = 100       # 大于这个数量则游戏成功结束
 enemy_counter = 0
 while running:
  for event in pygame.event.get():
   if event.type == QUIT:
    running = False
    break
   if event.type == bullet1_shoot_EVENT: # 我方子弹1发射事件
    if not plane1.dead:
     Bullet(bullet_image1,plane1,group_bullet1,screen)
   if event.type == enemy_EVENT:   # 定时生成一架敌机
    Enemy(enemy_images,group_enemy,screen)
    
   if event.type == enemy_EVENT:   # 定时生成一枚敌机子弹
    Eullet(enemy_bullet,group_enemy_bullet,group_enemy,plane1,screen)
    
   
  all_keys = pygame.key.get_pressed() # 所有按键检测
  plane1.keys_check(all_keys)   # 对plane1进行按键检测
  
  bg.update()       # 更新背景坐标
  group_bullet1.update()    # 我方子弹更新
  if not plane1.dead :
   plane1.update()     # 飞机1坐标更新
  group_enemy.update()     # 敌机坐标
  group_enemy_bullet.update()   # 敌机子弹更新
  group_explosion.update()    # 爆炸效果更新
  
  "坐标都更新完后,应该进行碰撞检测"
  collision_check()
  
  screen.fill((0,0,0))
  bg.draw()
  group_bullet1.draw(screen)
  if not plane1.dead :
   plane1.draw()
  group_enemy.draw(screen)
  group_enemy_bullet.draw(screen)
  group_explosion.draw(screen)
  pygame.display.update()
  clock.tick(30)
 pygame.quit()

python pygame实现滚动横版射击游戏城市之战

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

Python 相关文章推荐
python和shell变量互相传递的几种方法
Nov 20 Python
Python通过poll实现异步IO的方法
Jun 04 Python
python编程开发之日期操作实例分析
Nov 13 Python
浅谈Python 中整型对象的存储问题
May 16 Python
python 换位密码算法的实例详解
Jul 19 Python
浅谈Python peewee 使用经验
Oct 20 Python
python实现搜索文本文件内容脚本
Jun 22 Python
深入理解Django-Signals信号量
Feb 19 Python
利用Python检测URL状态
Jul 31 Python
python线程信号量semaphore使用解析
Nov 30 Python
python dataframe NaN处理方式
Dec 26 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
python使用itchat模块给心爱的人每天发天气预报
Nov 25 #Python
python pygame实现挡板弹球游戏
Nov 25 #Python
numpy 返回函数的上三角矩阵实例
Nov 25 #Python
如何基于Python获取图片的物理尺寸
Nov 25 #Python
Python:slice与indices的用法
Nov 25 #Python
python科学计算之narray对象用法
Nov 25 #Python
python运用pygame库实现双人弹球小游戏
Nov 25 #Python
You might like
php和js交互一例-PHP教程,PHP应用
2007/01/03 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
PHP静态方法和静态属性及常量属性的区别与介绍
2019/03/22 PHP
浅析JQuery获取和设置Select选项的常用方法总结
2013/07/04 Javascript
jQuery插件slides实现无缝轮播图特效
2015/04/17 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
2016/03/01 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
vue中实现上传文件给后台实例详解
2019/08/22 Javascript
nodejs简单抓包工具使用详解
2019/08/23 NodeJs
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
代码块高亮可复制显示js插件highlight.js+clipboard.js整合
2021/02/15 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
一步步教你用python的scrapy编写一个爬虫
2019/04/17 Python
Windows+Anaconda3+PyTorch+PyCharm的安装教程图文详解
2020/04/03 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
html5 Canvas实现图片旋转的示例
2018/01/15 HTML / CSS
THE OUTNET英国官网:国际设计师品牌折扣网站
2016/08/14 全球购物
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
员工考核管理制度
2014/02/02 职场文书
2014年师德师风自我剖析材料
2014/09/27 职场文书
2014年会计个人工作总结
2014/11/24 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
如何在CSS中绘制曲线图形及展示动画
2021/05/24 HTML / CSS