Python——飞机大战

实验目的:

  • 1、了解 Python 程序的特点与运行方式
  • 2、掌握 Python 程序开发的基础知识
  • 3、掌握运用 Python第三方库开发的基础能力
  • 4、了解小游戏开发的基本原理和构成
  • 5、了解 Pygame 库的基本功能
  • 6、掌握 Pygame 库的基本使用
  • 7、掌握用 Pygame 库完成一个飞机大战小游戏的基本能力

实验要求:

  • (1)导入 Pygame 模块并实现基本开发框架
  • (2)实现玩家类的创建并能控制其移动
  • (3)实现敌机类的创建及其自动移动
  • (4)实现敌机和玩家的碰撞检测
  • (5)实现子弹类的创建及子弹和敌机、子弹和玩家的碰撞检测
  • (6)通过 python的列表元素实现敌机的随机创建和销毁
  • (7)通过 python 的列表元素实现子弹的创建和销毁
  • (8)实现起始界面、游戏界面、结束界面三种界面的创建和切换
  • (9)添加文字和背景图片,完成基本的界面美化
  • (10)以碰撞检测的方式实现按钮效果

主要包括两种类型的飞机大战,以及素材及声音,打包放我网盘,需要的小伙伴自行下载哦!
网盘链接 提取码:1234
基本所有功能都有实现哦,如果过期或是无法下载,请在评论我告诉我或者私聊我哦!

附上其中一个代码吧!

import time
import pygame
from sys import exit
from pygame.locals import *
import random
# 子弹类
class Bullet(pygame.sprite.Sprite):def __init__(self, bullet_img, init_pos):pygame.sprite.Sprite.__init__(self)self.image = bullet_imgself.rect = self.image.get_rect()self.rect.midbottom = init_posself.speed = 20 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 = 10                                  # 初始化玩家飞机速度,这里是一个确定的值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 = 0else:self.rect.top -= self.speed# 向下移动,需要判断边界def moveDown(self):if self.rect.top >= SCREEN_HEIGHT - self.rect.height:self.rect.top = SCREEN_HEIGHT - self.rect.heightelse:self.rect.top += self.speed# 向左移动,需要判断边界def moveLeft(self):if self.rect.left <= 0:self.rect.left = 0else:self.rect.left -= self.speed# 向右移动,需要判断边界        def moveRight(self):if self.rect.left >= SCREEN_WIDTH - self.rect.width:self.rect.left = SCREEN_WIDTH - self.rect.widthelse: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_imgself.rect = self.image.get_rect()self.rect.topleft = init_posself.down_imgs = enemy_down_imgsself.speed = 10self.down_index = 0# 敌机移动,边界判断及删除在游戏主循环里处理def move(self):self.rect.top += self.speed
# 初始化 pygame
pygame.init()
SCREEN_WIDTH = 480  # 设置游戏屏幕大小
SCREEN_HEIGHT = 800
# 设置游戏界面大小、背景图片及标题
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))  #  屏幕设置
pygame.display.set_caption('飞机大作战')  #标题的设置
background = pygame.image.load('resources/image/background.png').convert()  # 背景图
begining = pygame.image.load('resources/image/begining.png').convert()
game_over = pygame.image.load('resources/image/gameover.png')  # Game Over 的背景图
plane_img = pygame.image.load('resources/image/shoot.png')  # 飞机及子弹图片集合
# 设置玩家飞机不同状态的图片列表,多张图片展示为动画效果
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, 624, 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(1004, 987, 9, 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, 697, 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)))
enemies1 = pygame.sprite.Group()
# 存储被击毁的飞机,用来渲染击毁动画
enemies_down = pygame.sprite.Group()
# 初始化射击及敌机移动频率
shoot_frequency = 0
enemy_frequency = 0
# 玩家飞机被击中后的效果处理
player_down_index = 16
# 初始化分数
score = 0
# 游戏循环帧率设置
clock = pygame.time.Clock()
# 判断游戏循环退出的参数
running = True
# 游戏主循环
while running:# 控制游戏最大帧率为 60clock.tick(60)# 生成子弹,需要控制发射频率# 首先判断玩家飞机没有被击中if not player.is_hit:if shoot_frequency % 15 == 0:player.shoot(bullet_img)shoot_frequency += 1if shoot_frequency >= 15:shoot_frequency = 0# 生成敌机,需要控制生成频率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)enemies1.add(enemy1)enemy_frequency += 1if enemy_frequency >= 100:enemy_frequency = 0for bullet in player.bullets:# 以固定速度移动子弹bullet.move()# 移动出屏幕后删除子弹if bullet.rect.bottom < 0:player.bullets.remove(bullet)for enemy in enemies1:#2. 移动敌机enemy.move()#3. 敌机与玩家飞机碰撞效果处理if pygame.sprite.collide_circle(enemy, player):enemies_down.add(enemy)enemies1.remove(enemy)player.is_hit = Truebreak#4. 移动出屏幕后删除飞机    if enemy.rect.top < 0:enemies1.remove(enemy)#敌机被子弹击中效果处理# 将被击中的敌机对象添加到击毁敌机 Group 中,用来渲染击毁动画enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1)for enemy_down in enemies1_down:enemies_down.add(enemy_down)# 绘制背景screen.blit(begining, (0, 0))screen.fill(0)screen.blit(background, (0, 0))# 绘制玩家飞机if not player.is_hit:screen.blit(player.image[player.img_index], player.rect)# 更换图片索引使飞机有动画效果player.img_index = shoot_frequency // 8else:# 玩家飞机被击中后的效果处理player.img_index = player_down_index // 8screen.blit(player.image[player.img_index], player.rect)player_down_index += 1if player_down_index > 47:# 击中效果处理完成后游戏结束running = False# 敌机被子弹击中效果显示for enemy_down in enemies_down:if enemy_down.down_index == 0:passif enemy_down.down_index > 7:enemies_down.remove(enemy_down)score += 10continuescreen.blit(enemy_down.down_imgs[enemy_down.down_index // 2], enemy_down.rect)enemy_down.down_index += 1# 显示子弹player.bullets.draw(screen)# 显示敌机enemies1.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)# 更新屏幕pygame.display.update()# 处理游戏退出for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()# 获取键盘事件(上下左右按键)key_pressed = pygame.key.get_pressed()#key_pressed = pygame.mouse.get_pos()# 处理键盘事件(移动飞机的位置)if key_pressed[K_w] or key_pressed[K_UP]:player.moveUp()if key_pressed[K_s] or key_pressed[K_DOWN]:player.moveDown()if key_pressed[K_a] or key_pressed[K_LEFT]:player.moveLeft()if key_pressed[K_d] or key_pressed[K_RIGHT]:player.moveRight()
# 游戏 Game Over 后显示最终得分
font = pygame.font.Font(None, 100)
text = font.render('Score: '+ str(score), True, (255, 0, 0))
text_rect = text.get_rect()
text_rect.centerx = screen.get_rect().centerx
text_rect.centery = screen.get_rect().centery + 24
screen.blit(game_over, (0, 0))
screen.blit(text, text_rect)
# 显示得分并处理游戏退出
while 1:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()pygame.display.update()

Python——飞机大战及源码下载相关推荐

  1. python打飞机源码_python 飞机大战 游戏源码(pygame入门级)

    l 文件      35644  2018-09-21 12:27  飞机大战03\.idea\workspace.xml 文件        398  2018-09-19 09:42  飞机大战0 ...

  2. 用Java实现简易的飞机大战---附源码和图片

    先看演示 Java简易飞机大战 源码链接:(内置图片) 此项目源码链接[百度网盘]提取码:1234https://pan.baidu.com/s/1EoBdg_47nYgLWgB6Zee9gg 一.基 ...

  3. java swing飞机大战游戏(源码+视频+文档+ppt)

    该项目是由Java swing实现的一款小游戏飞机大战,模仿的是微信版的飞机大战之打飞机小游戏,可在Java环境下运行,jdk版本不限,非常适合Java学习者参考学习,此外附带有视频导入教程,手把手教 ...

  4. 坦克大战项目c语言代码,c语言 坦克大战 游戏源码下载

    [实例简介]坦克大战  C语言  源代码 [实例截图] [核心代码] void GamePlay()/*玩游戏的过程*/ { int i,j,lose=0;/*lose是1的时候表示失败*/ int ...

  5. c 语言easyx图形库飞机大战的源码

    因为个人的兴趣看着视频 自己敲的打飞机游戏 可能开存在某些bug 但是 可以提供参考 //创建打飞机的基本文件 //引入图形库的文件 #include <graphics.h> #incl ...

  6. python剪刀石头布小游戏源码下载_Python Tkinter实现剪刀石头布小游戏

    Python Tkinter实现剪刀石头布小游戏 发布时间:2020-10-26 14:56:52 来源:亿速云 阅读:67 作者:Leah 本篇文章给大家分享的是有关Python Tkinter实现 ...

  7. python飞机大战源码素材包_小甲鱼python基础教程飞机大战源码及素材

    原博文 2018-12-22 23:32 − 百度了半天小甲鱼python飞机大战的源码和素材,搜出一堆不知道是什么玩意儿的玩意儿. 最终还是自己对着视频一行行代码敲出来. 需要的同学点下面的链接自取 ...

  8. HTML5飞机大战源码下载

    原文:HTML5飞机大战源码下载 源代码下载地址:http://www.zuidaima.com/share/1735919460830208.htm

  9. python朴素贝叶斯调参_邹博机器学习升级版II附讲义、参考书与源码下载(数学 xgboost lda hmm svm)...

    课程介绍 本课程特点是从数学层面推导最经典的机器学习算法,以及每种算法的示例和代码实现(Python).如何做算法的参数调试.以实际应用案例分析各种算法的选择等. 1.每个算法模块按照"原理 ...

  10. 跳一跳python源码下载_微信跳一跳python代码实现

    本文实例为大家分享了python微信跳一跳的具体代码,供大家参考,具体内容如下 部分代码分享: wechat_jump.py from __future__ import print_function ...

最新文章

  1. keil4在win10上无法启动_斯柯达的一键启动装置除了方便,还有啥功能?
  2. 上级对下级用通知合适吗_用报纸练书法,真的合适吗吗?
  3. mysql平台workb_MySQL分布式事务
  4. 使用CloudFlare 的 PKI 工具集 cfssl 来生成 Certificate Authority (CA) 证书和秘钥文件
  5. MURAL:消除预训练模型的语言限制!Google提出跨语言的多模态、多任务检索模型MURAL...
  6. 不要相信 errno 可靠
  7. c语言混响,混响插件(2cAudio Aether)
  8. 这篇 CPU Cache,估计也没人看
  9. Android简单实现汉字笔顺动画——Java版
  10. 南宁领取房产证流程以及寻找房产评估公司的方法
  11. Http gzip 处理
  12. 小米 2021 秋招面试总结
  13. VUE-Router之解决 Navigating to current location (XXX) is not allowed
  14. 加字邮票价格_中华人民共和国邮票(加字改值邮票)
  15. 如何利用RTK通过CORS进行测量?
  16. 椭圆方程 matlab,五点差分法(matlab)解椭圆型偏微分方程
  17. 一个字等于几个字节,怎么确定机器是16/32/64位机器
  18. Treemily想做封闭版的家族社群,比Geni更迎合华人家庭观念
  19. 基于Android的记账本的设计与实现
  20. 电子杂志制作软件:iebook超级精灵2008金牌版 八项全球首创•八大领先技术

热门文章

  1. 支持linux_Linux的UL库 支持MCC数据采集卡
  2. 斗战神总是显示连接服务器失败,全民斗战神怎么进不去 全民斗战神进不去的原因和解决办法...
  3. java定义一个父类circle_[转载]java编程题全集一(答案)
  4. java实参传空_java形参、实参、值传递、引用传递
  5. pyqt5 自定义控件_说人话的PYQT5『1』
  6. java怎么给类中的私有变量赋值_java练习本(原每日一练)(20190430)
  7. html倾斜变形,深入理解CSS变形transform(2d)_html/css_WEB-ITnose
  8. Java中的Object 类的常见方法
  9. ubuntu安装后要做什么
  10. Docker快速入门(一)