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

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()

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

(0)

相关推荐

  • 用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动

    目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有这项技能的同学只能和我一样从网上下载相应的素材了. 网上可以找到相应的这样的图片,注意,所有的元件图片要是png类型的图片,那样可以有透明的背景,否则会有白色的边框露出来. 找到素材以后我们就要开始搭建我们的飞机大战了. 微信上的飞机大战是由手指控制的,在电脑上,我们就先用鼠标代替了. 按照之前我们在天空上移动云的那个程序,我们可以知道该怎么做

  • python实现飞机大战

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 实现的效果如下: 主程序代码如下: import pygame from plane_sprites import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") # 1,绘制屏幕窗口 self.screen = pygame.display.

  • python实现飞机大战小游戏

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 初学Python,写了一个简单的Python小游戏. 师出bilibili某前辈 pycharm自带了第三方库pygame,安装一下就好了,很方便. 虽然很多大佬已经给出了步骤,我这里还是啰嗦一下,也为了自己巩固一下. 上图: 这里再给出代码的逻辑架构 plane_main.py import pygame from plane_sprites import * class PlaneGame(object): "

  • 500行代码使用python写个微信小游戏飞机大战游戏

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右手有节奏有韵律的朝着同一个方向来回移动起来! 这是史诗级的发明,是浓墨重彩的一笔,是-- 在一阵抽搐后,我结束了游戏,瞬时觉得一切都索然无味,正在我进入贤者模式时,突然想到,如果我可以让更多人已不同的方式体会到这种美轮美奂的感觉岂不美哉? 所以我打开电脑,创建了一个 plan_game.py-- 先

  • python pygame模块编写飞机大战

    本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下 该程序没有使用精灵组,而是用列表存储对象来替代精灵组的动画效果.用矩形对象的重叠来判断相撞事件.该程序可以流畅运行,注释较为详细,希望可以帮助大家. import pygame from pygame.locals import * from sys import exit import time import random # 创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度 clas

  • python实现飞机大战游戏

    飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工具类plane_sprites.py import random import pygame # 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 700) # 刷新的帧率 FRAME_PER_SEC = 60 # 创建敌机的定时器常量 CREATE_ENEM

  • python实现飞机大战微信小游戏

    0.前言 我学一种语言,可以说学任何东西都喜欢自己动手实践,总感觉自己动手一遍,就可以理解的更透彻,学python也一样,自己动手写代码,但更喜欢做点小东西出来,一边玩一边学.下面我就展示一下我最近做的一个小游戏. 1.素材准备 首先我们先来预览一下游戏的最终运行界面 根据游戏界面,我们可以清楚的知道必须要先准备游戏背景图片,飞机图片,子弹图片等等.这些素材我已经放到网上, 点我下载 ,里面包括了我的代码和图片素材. 2.代码部分 库依赖: pygame 本游戏主要有两个py文件,主文件plan

  • python版飞机大战代码分享

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import * from pygame.font import * import time import random class Hero(object): #玩家 英雄类 def __init__(self, screen_temp): self.x = 210 self.y = 700 self.life

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

    pygame城市之战横版射击游戏,按上下左右方向箭头操作飞机.这是一个横板射击小游戏,在黑夜的城市上空,你将要操作一架飞机去射击敌机,爆炸效果还不错. 在游戏中定义了滚动的背景类,定义了飞机类Plane,定义了子弹类,敌机类,爆炸类等,是学习Pygame和面向对象编程的好例子. 代码: import math import time import pygame from pygame.locals import * from random import choice,randint class

  • Python Pygame实战之五款童年经典游戏合集

    目录 一.推箱子 1)代码展示 2)效果展示 二.滑雪 1)代码展示 2)效果展示​ 三.声控把音符 1)代码展示 2)效果展示 四.保卫萝卜 1)代码展示 2)效果展示​ 五.飞机大战 1)代码展示 2)效果展示 一.推箱子 1)代码展示 import os import sys import cfg import pygame from modules import * from itertools import chain '''游戏地图''' class gameMap(): def _

  • Python Pygame实现兔子猎人守护城堡游戏

    目录 效果图 主要代码 游戏初始化 主函数 运行  效果图 守卫类游戏大家应该玩过吧,什么植物大战僵尸呀,保卫萝卜呀,今天我们自己用python来写一个自己的守护类小游戏兔子猎人守护城堡,让大家看看效果图. 主要代码 下面我来说一下是怎么得到的将代码分享一下给大家 首先得将要用到的库导入进来 import cfg import math import random import pygame from modules.Sprites import * from modules.interface

  • Python Pygame实战之水果忍者游戏的实现

    目录 一.准备中 1.0游戏规则 1.1游戏图片素材(可修改) 1.2游戏字体素材(可修改) 二.环境安装 三.开始敲代码 3.0设置界面玩家生命值等 3.1导入模块 3.2界面背景.字体设置 3.3游戏窗口设置 3.4随机生成水果的位置与数据存放 3.5用一个字典来存放水果的数据 3.6在屏幕中绘制字体 3.7绘制玩家的生命 3.8游戏开始与结束画面 3.9游戏主循环 四.游戏展示效果 导语 Hey!下午好,我是木木子,关注我,一起玩游戏吧~ ​ ​微信小游戏很久之前刮起了一股切水果热潮,还记

  • Python+Pygame实战之英文版猜字游戏的实现

    目录 导语 一.运行环境 二.素材(图片等) 三.代码展示 四.效果展示 导语 当下的孩子们多少会被电子产品“侵袭”,那么既然都要玩游戏,为什么不选既能玩又能收获知识的呢? 兴趣是最大的学习推动力,当学习英语变成一款小游戏时,不仅能够玩游戏,激发调动孩子的积极性,还能够让孩子们在娱乐中潜移默化地掌握英语的学习技巧哦~ 今天木子为大家敲了一款简单的英语版<神奇的猜字小游戏>,分享给大家,希望能帮到大家.如果您是一位热心于辅导孩子学习英语的家长,上面这款游戏也不妨用一用,试一试哦~ (文中代码仅供

  • Python+Pygame实战之实现小蜜蜂历险记游戏

    目录 导语 一.运行环境 二.素材(图片等) 三.代码展示 四.效果展示 导语 亲爱的小可爱们,大家好! 欢迎来到木子的游戏编程空间 经常听到有朋友说,学习编程是一件非常枯燥无味的事情.其实,大家有没有认真想过,可能是我们的学习方法不对? 比方说,你有没有想过,可以通过打游戏来学编程? 今天又又又更新一款新游戏给大家啦,期待不期待呀?教大家如何通过边打游戏边学编程!准备好了吗?我们即将开始激动人心的游戏编程之旅. 或许你之前学习过一点编程,但若是你从没接触过游戏编程,那么你仍然会对游戏程序的运行

  • Python+Pygame实战之炫舞小游戏的实现

    目录 导语 一.环境安装 二.代码展示 三.效果展示 1)简洁版炫舞 ​2)随机截图 3)MISS节拍 导语 昨天去老姐家里蹭饭,进门的时候就看到佳佳妹(我姐的女儿)低头霹雳吧啦一顿操作猛如虎,饭好了都还在玩儿,什么东西这么好玩?一走进就看到这是一款酷似炫舞的小游戏.(死去的回忆突然在攻击我~没想到现在还有这款游戏就是不知道升级了多少次啦) 不知道你们还记不记得曾经有个风靡一时的舞蹈游戏炫舞. 我读小学的时候,大概是09年吧,这个游戏非常火爆,如果你去网吧,十个女生里,有十一个都是在玩炫舞,像我

  • Python Pygame实现可控制的烟花游戏

    目录 实现效果描述 效果 代码地址 解析 main.py core.py fireworks.py 写在最后 自控烟花升空 实现效果描述效果代码地址解析main.pycore.pyfireworks.py 写在最后 实现效果描述 这大过年的不弄点有意思的怎么行呢?可以考虑用编程实现一个烟花升空-爆炸-绚丽地效果.随机的烟花也玩习惯了,这次我们用pygame实现用户鼠标点击屏幕实现放烟花并在指定高度绽放~ 效果 鼠标点击时,烟花点会从屏幕底部正中心发射至鼠标点击点处并绽放出随机的颜色,烟花颗粒符合

  • Python Pygame实战之打砖块小游戏

    目录 导语 一.准备中 1)游戏规则: 2)环境安装 二.开始敲代码 1)配置文件 2)定义一些类 3)定义开始.结束界面 4)定义游戏 5)主函数与运行界面 三.效果展示 导语 嘿!前不久刚刚给大家过一款反弹球的小游戏嘛! 不知道大家还记得不?不记得可以看下往期的内容呢,在上一期的基础上升级了这款打砖块的小游戏,界面的话也挺简单的,经典配色原汁原味哈哈哈. 大家好,我是木木子,一个上的编程下的厅堂的女码农!今天带大家编写一款经典的打砖块儿小游戏! 小科普: 打砖块最早是由雅达利公司开发的一款独

  • Python+Pygame实战之疯狂吃水果游戏的实现

    目录 导语 一.准备中 1)游戏玩法 2)环境安装 3)素材准备 二.代码展示 三.效果展示 导语 嘿嘿!木木子今日闪现——已经给大家写了很多内容啦~ 涉及的人工智能.初学者.爬虫.数据分析(这方面的一般不过审核)游戏........ PS: 吃豆人我写过了哈 Python+Pygame实战之吃豆豆游戏的实现 切水果我写过了哈 Python Pygame实战之水果忍者游戏的实现 今天二者集合,做出一款新游戏,哈哈哈,名字叫做<疯狂

随机推荐