python3实现飞机大战


Posted in Python onNovember 29, 2020

本文实例为大家分享了python3实现飞机大战的具体代码,供大家参考,具体内容如下

以下是亲测Python飞机大战全部代码,在保证有pygame环境支持并且有Python3解释器的话完全没问题!

如果大家喜欢的话麻烦点个赞!

运行效果如下图:

python3实现飞机大战

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 导入需要使用的模块
import pygame
from pygame.locals import *
from sys import exit 
import random

# 设置屏幕大小的变量
SCREEN_WIDTH = 480
SCREEN_HEIGHT = 800
import codecs
# 子弹类
class Bullet(pygame.sprite.Sprite):
 def __init__(self,bullet_img,init_pos):
  # 实现父类的初始化方法
  pygame.sprite.Sprite.__init__(self)
  self.image = bullet_img
  self.rect = self.image.get_rect()
  self.rect.midbottom = init_pos
  self.speed = 10
 def move(self):
  self.rect.top -= self.speed  

# 玩家飞机类
class Player(pygame.sprite.Sprite):
 def __init__(self,plane_img,player_rect,init_pos):
  pygame.sprite.Sprite.__init__(self)
  self.image=[]
  for i in range(len(player_rect)):
   self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha()) 
  self.rect = player_rect[0]
  self.rect.topleft = init_pos
  self.speed = 8
  self.bullets = pygame.sprite.Group() #玩家飞机发射子弹的集合
  self.img_index = 0
  self.is_hit = False 

 # 发射子弹
 def shoot(self,bullet_img):
  bullet = Bullet(bullet_img,self.rect.midtop)
  self.bullets.add(bullet)    # 将子弹放入玩家飞机的子弹集合
 
 # 向上移动
 def moveUp(self):
  if self.rect.top <= 0:
   self.rect.top = 0
  else:
   self.rect.top -= self.speed 
 # 向下移动
 def moveDown(self):
  if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
   self.rect.top = SCREEN_HEIGHT - self.rect.height
  else:
   self.rect.top += self.speed
 # 向左移动
 def moveLeft(self):
  if self.rect.left <= 0:
   self.rect.left = 0
  else:
   self.rect.left -= self.speed
 # 向右移动
 def moveRight(self):
  if self.rect.left >= SCREEN_WIDTH - self.rect.width:
   self.rect.left = SCREEN_WIDTH - self.rect.width
  else:
   self.rect.left += self.speed

# 敌机类
class Enemy(pygame.sprite.Sprite):
 # 飞机的图片 敌机坠毁的图片 敌机的位置
 def __init__(self,enemy_img,enemy_down_imgs,init_pos):
  pygame.sprite.Sprite.__init__(self)
  self.image = enemy_img
  self.rect = self.image.get_rect()
  self.rect.topleft = init_pos
  self.down_imgs = enemy_down_imgs
  self.speed = 2 
  self.down_index = 0
 # 移动
 def move(self):
  self.rect.top += self.speed 

# 对文件的操作
# 写入文本
# 要写入的内容,写入方式,写入文件所在的位置
def write_txt(contert, strim, path):
 f = codecs.open(path,strim, 'utf8')
 f.write(str(contert))
 f.close()

# 读取文本
def read_txt(path):
 with open(path,'r',encoding='utf8') as f:
  lines = f.readlines()
 return lines 




# 初始化pygame
pygame.init()
# 设置游戏界面的大小,背景图片,标题
# 界面startGame(
screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
# 标题
pygame.display.set_caption('飞机大战')
# 图标
ic_launcher = pygame.image.load('resources/image/ic_launcher.png').convert_alpha()
pygame.display.set_icon(ic_launcher)
# 背景图
background = pygame.image.load('resources/image/background.png').convert()
# 游戏结束
game_over = pygame.image.load('resources/image/gameover.png')
# 飞机及子弹的图片
plane_img = pygame.image.load('resources/image/shoot.png')

def startGame():
 # 1.设置玩家飞机不同状态的图片列表,多张图片展示为动画效果
 player_rect = []
 # 玩家飞机的图片
 player_rect.append(pygame.Rect(0,99,102,126))
 player_rect.append(pygame.Rect(165,360,102,126))
 # 玩家飞机爆炸的图片
 player_rect.append(pygame.Rect(165,234,102,126))
 player_rect.append(pygame.Rect(330,634,102,126))
 player_rect.append(pygame.Rect(330,498,102,126))
 player_rect.append(pygame.Rect(432,624,102,126))
 player_pos = [200,600]
 # 生成玩家飞机类
 player = Player(plane_img,player_rect,player_pos)
 # 加入子弹的图片
 bullet_rect = pygame.Rect(69,77,10,21)
 bullet_img = plane_img.subsurface(bullet_rect)

 # 加入敌机图片
 enemy1_rect = pygame.Rect(534,612,57,43) #没有爆炸前的图片
 enemy1_img = plane_img.subsurface(enemy1_rect)
 enemy1_down_imgs = [] #飞机销毁后的图片
 enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267,347,57,43)))
 enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873,679,57,43)))
 enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267,296,57,43)))
 enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930,697,57,43)))
 # 存储敌机的集合
 enmies1 = pygame.sprite.Group()
 # 存储被击毁的敌机的集合
 enemies_down = pygame.sprite.Group()


 # 初始子弹射击频率
 shoot_frequency = 0
 # 初始化敌机生成频率
 enemy_frequency = 0
 # 玩家飞机被击中后的效果处理
 player_down_index = 16

 # 设置游戏的帧数
 clock = pygame.time.Clock()
 # 初始化成绩
 score = 0
 # 判断循环结束的参数
 running = True
 while running:
  for event in pygame.event.get():
   if event.type == pygame.QUIT:
    exit()
  screen.fill(0)           
  screen.blit(background,(0,0))
  clock.tick(60)

  # 生成子弹 判断玩家有没有被击中
  if not player.is_hit:
   if shoot_frequency % 15 == 0:
    player.shoot(bullet_img)
   shoot_frequency += 1
   if shoot_frequency >= 15:
    shoot_frequency = 0
  for bullet in player.bullets:
   bullet.move()
   if bullet.rect.bottom<0:
    player.bullets.remove(bullet)
  
  # 显示子弹
  player.bullets.draw(screen)

  # 生成敌机,..需要控制频率
  if enemy_frequency % 50 == 0:
   #生成随机的位置
   enemy1_pos = [random.randint(0,SCREEN_WIDTH-enemy1_rect.width),0]
   # 初始化敌机
   enemy1 = Enemy(enemy1_img,enemy1_down_imgs,enemy1_pos)
   # 存储到集合中
   enmies1.add(enemy1) 
  enemy_frequency += 1
  # 敌机生成到 100 则重新循环
  if enemy_frequency >= 100:
   enemy_frequency = 0
  # 敌机的移动
  for enemy in enmies1:
   enemy.move()
   # 敌机与玩家碰撞效果处理
   if pygame.sprite.collide_circle(enemy,player): # pygame判定是否相撞的方法
    enemies_down.add(enemy)  # 将敌机加入到坠毁的集合中
    enmies1.remove(enemy)  # 从敌机集合中移除 
    player.is_hit = True 
    break 
   # 移动出屏幕的敌机
   if enemy.rect.top < 0:
    enmies1.remove(enemy)
  # 与子弹碰撞
  enemies1_down = pygame.sprite.groupcollide(enmies1,player.bullets,1,1)
  for enemy_down in enemies1_down:
   enemies_down.add(enemy_down)
  

  # 绘制玩家飞机
  if not player.is_hit:
   screen.blit(player.image[player.img_index],player.rect)
   # 实现飞机动效
   player.img_index = shoot_frequency // 8
  else:
   # 玩家飞机被击毁后的动画效果
   player.img_index = player_down_index // 8 
   screen.blit(player.image[player.img_index],player.rect)
   player_down_index += 1
   if player_down_index > 47:
    running = False
  # 敌机被击中的效果
  for enemy_down in enemies_down:
   if enemy_down.down_index == 0:
    pass
   if enemy_down.down_index > 7:
    enemies_down.remove(enemy_down)
    score += 100
    continue
   # 绘制碰撞动画
   screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2],enemy_down.rect)
   enemy_down.down_index += 1
  
  # 显示敌机
  enmies1.draw(screen)
  # 绘制当前得分
  score_font = pygame.font.Font(None,36)
  score_text = score_font.render(str(score),True,(128,128,128))
  text_rect = score_text.get_rect()
  text_rect.topleft = [10,10]
  screen.blit(score_text,text_rect)
  # 获取键盘的输入
  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()

  pygame.display.update()
 # 绘制游戏结束画面
 screen.blit(game_over,(0,0))
 # 绘制Game Over显示最终分数
 font = pygame.font.Font(None,48)
 text = font.render("Score:"+str(score),True,(255,0,0))
 text_rect = text.get_rect()
 text_rect.centerx = screen.get_rect().centerx # x轴位置
 text_rect.centery = screen.get_rect().centery + 24 # y轴位置
 screen.blit(text,text_rect)
 # 使用字体
 xtfont = pygame.font.SysFont("jamrul",30)
 # 绘制重新开始按钮
 textstart = xtfont.render('Start',True,(255,0,0))
 text_rect = textstart.get_rect()
 text_rect.centerx = screen.get_rect().centerx # x轴位置
 text_rect.centery = screen.get_rect().centery + 120 # y轴位置
 screen.blit(textstart,text_rect)
 # 排行榜按钮
 textstart = xtfont.render('Ranking',True,(255,0,0))
 text_rect = textstart.get_rect()
 text_rect.centerx = screen.get_rect().centerx # x轴位置
 text_rect.centery = screen.get_rect().centery + 180 # y轴位置
 screen.blit(textstart,text_rect)

 # 判断得分更新排行榜
 # 临时变量
 j = 0
 # 读取文件
 arrayscore = read_txt(r'score.txt')[0].split('mr')
 # 循环分数列表在列表里排序
 for i in range(0,len(arrayscore)):
  if score > int(arrayscore[i]):
   # 大于排行榜上的内容 把分数和当前分数进行替换
   j = arraysco.re[i]
   arrayscore[i] = str(score)
   score = 0
  # 替换下来的分数移动一位
  if int(j) > int(arrayscore[i]):
   k = arrayscore[i]
   arrayscore[i] = str(j)
   j = k
 # 循环分数列表 写入文档
 for i in range(0,len(arrayscore)):
  # 判断列表的第一个分数
  if i == 0:
   write_txt(arrayscore[i]+'mr','w',r'score.txt')
  else:
   # 判断是否是最后一个
   if (i==9):
    # 最近添加内容最后一个分数不加 mr
    write_txt(arrayscore[i],'a',r'score.txt')
   else:
    # 不是最后一个分数,添加的时候加 mr
    write_txt(arrayscore[i]+'mr','a',r'score.txt')










# 定义排行榜函数
def gameRanking():
 # 绘制背景图片
 screen2 = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
 screen2.fill(0)
 screen2.blit(background,(0,0))
 # 使用系统字体
 xtfont = pygame.font.SysFont('jamrul',30)
 # 1.绘制标题
 textstart = xtfont.render('Ranking',True,(255,0,0))
 text_rect = textstart.get_rect()
 text_rect.centerx = screen.get_rect().centerx # x轴位置
 text_rect.centery = 50 # y轴位置
 screen.blit(textstart,text_rect)
 # 2.绘制重新开始按钮
 textstart = xtfont.render('Start',True,(255,0,0))
 text_rect = textstart.get_rect()
 text_rect.centerx = screen.get_rect().centerx # x轴位置
 text_rect.centery = screen.get_rect().centery + 120 # y轴位置
 screen.blit(textstart,text_rect)
 # 3.展示排行榜的数据
 arrayscore = read_txt(r'score.txt')[0].split('mr')
 for i in range(0,len(arrayscore)):
  font = pygame.font.Font(None,48)
  # 编写排名
  k = i+1
  text = font.render(str(k) + " "+arrayscore[i],True,(255,0,0))
  text_rect = text.get_rect()
  text_rect.centerx = screen2.get_rect().centerx
  text_rect.centery = 80 + 30*k
  # 绘制分数
  screen2.blit(text,text_rect)



startGame()

while True:
 for event in pygame.event.get():
  if event.type == pygame.QUIT:
   exit()
  # 监控鼠标的点击
  elif event.type == pygame.MOUSEBUTTONDOWN:
   # 判定重新开始范围
   if screen.get_rect().centerx - 70 <= event.pos[0]\
     and event.pos[0] <= screen.get_rect().centerx + 50\
     and screen.get_rect().centery + 100 <= event.pos[1]\
     and screen.get_rect().centery + 140 >= event.pos[1]:
    startGame()
   # 判定排行榜范围
   if screen.get_rect().centerx - 70 <= event.pos[0]\
     and event.pos[0] <= screen.get_rect().centerx + 50\
     and screen.get_rect().centery + 160 <= event.pos[1]\
     and screen.get_rect().centery + 200 >= event.pos[1]:
    gameRanking()
pygame.display.update()

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

Python 相关文章推荐
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
Python实现的购物车功能示例
Feb 11 Python
python爬虫获取淘宝天猫商品详细参数
Jun 23 Python
Python扩展内置类型详解
Mar 26 Python
解决pycharm py文件运行后停止按钮变成了灰色的问题
Nov 29 Python
Python 导入文件过程图解
Oct 15 Python
python实现从wind导入数据
Dec 03 Python
python已协程方式处理任务实现过程
Dec 27 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
Python安装Bs4的多种方法
Nov 28 Python
python性能测试工具locust的使用
Dec 28 Python
python 爬取腾讯视频评论的实现步骤
Feb 18 Python
python之pygame模块实现飞机大战完整代码
Nov 29 #Python
Python使用Pygame绘制时钟
Nov 29 #Python
详解pandas赋值失败问题解决
Nov 29 #Python
python 获取剪切板内容的两种方法
Nov 28 #Python
快速创建python 虚拟环境
Nov 28 #Python
Python基于Webhook实现github自动化部署
Nov 28 #Python
Django-simple-captcha验证码包使用方法详解
Nov 28 #Python
You might like
PHP面向对象五大原则之里氏替换原则(LSP)详解
2018/04/08 PHP
jquery 学习笔记一
2010/04/07 Javascript
jQuery dialog 异步调用ashx,webservice数据的代码
2010/08/03 Javascript
iframe的onreadystatechange事件在firefox下的使用
2014/04/16 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
JS实现点击按钮自动增加一个单元格的方法
2015/03/09 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
2018/02/13 jQuery
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
angularJs中$http获取后台数据的实例讲解
2018/08/08 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
JavaScript canvas实现雪花随机动态飘落
2020/02/08 Javascript
解决VUEX的mapState/...mapState等取值问题
2020/07/24 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
Python 中的with关键字使用详解
2016/09/11 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
对python模块中多个类的用法详解
2019/01/10 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
使用pyshp包进行shapefile文件修改的例子
2019/12/06 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
英国探险旅游专家:Explore
2018/12/20 全球购物
项目开发计划书
2014/01/09 职场文书
法制宣传月活动方案
2014/05/11 职场文书
财会专业大学生求职信
2014/09/26 职场文书
授权委托书
2015/01/28 职场文书
学校节水倡议书
2015/04/29 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
《自然之道》读后感3篇
2019/12/17 职场文书