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实现下载整个ftp目录的方法
Jan 17 Python
python WindowsError的错误代码详解
Jul 23 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
浅谈flask中的before_request与after_request
Jan 20 Python
在Python中使用gRPC的方法示例
Aug 08 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
Feb 22 Python
Python可迭代对象操作示例
May 07 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
Jun 13 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
Python创建文件夹与文件的快捷方法
Dec 08 Python
python 调用Google翻译接口的方法
Dec 09 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中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
PHP循环函数使用介绍之PHP基础入门教程
2013/09/21 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
document.compatMode介绍
2009/05/21 Javascript
微博@符号的用户名提示效果。(想@到谁?)
2010/11/05 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
深入理解Node module模块
2018/03/26 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
2020/06/19 Javascript
Python 创建子进程模块subprocess详解
2015/04/08 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
Python聚类算法之DBSACN实例分析
2015/11/20 Python
关于Python中Inf与Nan的判断问题详解
2017/02/08 Python
Python实现生成随机日期字符串的方法示例
2017/12/25 Python
Python退火算法在高次方程的应用
2018/07/26 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
python实现简单井字棋小游戏
2020/03/05 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
门卫工作岗位职责
2013/12/17 职场文书
应届实习生的自我评价范文
2014/01/05 职场文书
矫正人员思想汇报
2014/01/08 职场文书
建筑安全责任书范本
2014/07/24 职场文书
机关党总支领导班子整改方案
2014/09/20 职场文书
2016年学生会感恩节活动总结
2016/04/01 职场文书
诺贝尔奖获得者名言100句:句句启人心智,值永久收藏
2019/08/09 职场文书
浅谈Java实现分布式事务的三种方案
2021/06/11 Java/Android