python pygame模块编写飞机大战

本文实例为大家分享了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()

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

(0)

相关推荐

  • 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版飞机大战代码分享

    利用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入门(4):获取鼠标的位置及运动

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

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

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

  • python实现飞机大战

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

  • python pygame模块编写飞机大战

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

  • python之pygame模块实现飞机大战完整代码

    本文实例为大家分享了python之pygame模块实现飞机大战的具体代码,供大家参考,具体内容如下 Python飞机大战步骤: 1.数据区 2.主界面 3.飞船 4.事件监控及边界 5.外星人 6.记分系统 飞机大战效果图: 源码: """ 功能:飞机大战 time:2019/10/3 """ import os import pygame import sys import time from pygame.sprite import Spri

  • Python Pygame实战之飞机大战的实现

    目录 导语 一.环境安装 1)各种素材(图片.字体等) 2)运行环境 二.代码展示 1)文章思路 2)附代码讲解 3)主程序 三.效果展示 总结 导语 三月疫情原因,很多地方都封闭式管理了! 在回家无聊的打酱油,小编今天给大伙带来了一波小游戏——全民左右飞机大战!在这个快熬不下去的日子里,打打飞机消遣闲暇时间,也是蛮惬意的,这几天小编必须全身心投入到飞机大战中来!肝了几天这款小游戏终于面市啦! 这次的游戏操作很简单,就是左右移动飞机,躲避敌人飞机,打落敌机会随机掉落金币,我们 要打击的敌人!每个

  • python使用pygame模块实现坦克大战游戏

    本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹,炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类,分别是玩家类,敌人类,炮弹类及地图类,开始游戏界面以及结束界面,血条等等. 开始coding. 主函数,new一个对象(java乱入emmm),声明一个对象. # encoding : utf-8 # anthor : comi from gameloop import * from pygame

  • python实现简单的飞机大战

    本文实例为大家分享了python实现简单的飞机大战的具体代码,供大家参考,具体内容如下 制作初衷 这几天闲来没事干,就想起来好长时间没做过游戏了,于是就想做一个游戏练练手,为了起到一个练习的目的就使用了自己不是太熟练的python这门语言来编写,代码都有备注,大家可以直接看代码,这个代码我是在python3.1的环境下写的,大家需要可以直接下载我这里的资源,图片和代码打包到了一起的,因为是第一次使用python做游戏,有什么不足的地方望大佬斧正. 游戏思路 首先我们分析飞机大战这个游戏属于一个平

  • Pygame框架实现飞机大战

    本文实例为大家分享了Pygame框架实现飞机大战的具体代码,供大家参考,具体内容如下 飞机大战主游戏类 """ 项目名称:简单飞机大战游戏 基于框架:Pygame 开发日期:2020.07 开发人员:Y 版本:**** """ import sys # 导入内置模块sys 调用sys.exit() import pygame # 导入第三方模块pygame from plane_sprites import * # 导入自定义模块内所有工具 cl

  • Python实战小游戏飞机大战详解

    目录 导语 ​正文 一.环境安装 二.我方飞机 三.敌方飞机 四.控制键盘移动 五.检测子弹碰撞 六.效果图 总结 导语 "看见别人都那么努力,那么勤奋,那么意气风发地走在成功的道路上,你问问自己:难道就不想成为他们的绊脚石吗?" --周一整理好心情好好出发吧! 大家好啊,还在学习的小小伙伴儿慢慢学哈~学完基础的你,今天可以放松下,跟着小编玩会儿游戏再继续哦! 新的一周要努力哦!赶不上别人至少也要慢慢溜上去,晓得吧?乖巧.jpg "晓得晓得,会努力的". ​大家还记

  • 使用pygame模块编写贪吃蛇的实例讲解

    python ### 刚学了python不久,发现了一个好玩的库pygame 使用pygame模块 利用面向对象的思想编写贪吃蛇,主要用到pygame.sprite: 游戏主类 import pygame,sys from snake_sprite import Game_sprite,Snake,Food SCREEN_RECT=pygame.Rect(0,0,828,600) IMG_URL="./image/bg.jpg" #主类 class Snakegame(object):

  • Python Pygame实战之红心大战游戏的实现

    目录 导语 一. 红心大战用户手册 二.红心大战游戏规则 三.准备中 四.代码演示 五.效果展示 导语 还记得那些年,我们玩过的Windows小游戏吗? 说起Windows自带的游戏,相信许多80.90后的朋友都不陌生. 在很早的那个游戏贫瘠的年代,<纸牌>.<扫雷>等游戏帮助我们在微机课上带来了许多欢乐的时光.但在这些游戏中,有一款游戏似乎玩懂的人,甚至知道玩法的人并不多.这款游戏就是<红心大战>. 最近小编心血来潮仔细钻研了一下之后,发现这款游戏玩起来却比其他的几款

  • pygame实现简易飞机大战

    利用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

随机推荐