云盘资源分享论坛

 找回密码
 立即注册
搜索
热搜: 书籍 电影 音乐
查看: 142|回复: 0

飞机大战源码

[复制链接]

966

主题

156

回帖

4492

积分

中级会员

Rank: 3Rank: 3

UID
32013
金钱
3371
钻石
7
积分
4492
注册时间
2023-7-27
发表于 2023-8-20 15:38:02 | 显示全部楼层 |阅读模式

  1. import pygame  # 导入动态模块(.dll .pyd .so) 不需要在包名后边跟模块名

  2. from pygame.locals import *

  3. import time

  4. import random

  5. import sys
  6. # 设置屏幕的宽度
  7. SCREEN_WIDTH = 450
  8. # 设置屏幕的高度
  9. SCREEN_HEIGHT = 600
  10. # 初始化窗口
  11. pygame.init()
  12. # 设置窗口标题
  13. pygame.display.set_caption("飞机大战")
  14. # 设置屏幕大小
  15. screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), 0, 32)
  16. # 隐藏光标
  17. pygame.mouse.set_visible(False)
  18. # 设置背景
  19. bg = pygame.image.load("resources/image/bg.png")
  20. # 绘制屏幕
  21. screen.fill(0)
  22. # 加入背景图片
  23. screen.blit(bg, (0, 0))
  24. # 设置游戏结束的图片
  25. bg_game_over = pygame.image.load("resources/image/bg_game_over.png")
  26. # 加载飞机资源图片
  27. img_plane = pygame.image.load("resources/image/shoot.png")
  28. img_start = pygame.image.load("resources/image/start.png")
  29. img_pause = pygame.image.load("resources/image/pause.png")
  30. img_icon = pygame.image.load("resources/image/plane.png").convert_alpha()
  31. # 顺便设置窗口
  32. pygame.display.set_icon(img_icon)
  33. # 初始化位置
  34. player_pos = [200, 450]
  35. class Player(pygame.sprite.Sprite):
  36.     def __init__(self, img, rect, pos):
  37.         pygame.sprite.Sprite.__init__(self)
  38.         self.image = []
  39.         # 将飞机图片部分分隔
  40.         for i in range(len(rect)):
  41.             self.image.append(img.subsurface(rect[i]).convert_alpha())
  42.         # 获取飞机的区域
  43.         self.rect = rect[0]
  44.         self.rect.topleft = pos
  45.         self.speed = 8
  46.         # 生成精灵组实例
  47.         self.bullets = pygame.sprite.Group()
  48.         self.img_index = 0
  49.         # 判断飞机是否被打中
  50.         self.is_hit = False
  51.     def shoot(self, img):
  52.         bullet = Bullet(img, self.rect.midtop)
  53.         # 添加子弹实例到玩家的子弹组
  54.         self.bullets.add(bullet)
  55.     def moveUp(self):
  56.         # 当遇到顶部时,设置上顶部为0
  57.         if self.rect.top <= 0:
  58.             self.rect.top = 0
  59.         else:
  60.             self.rect.top -= self.speed
  61.     def moveDown(self):
  62.         # 当遇到底部时,设置一直为常值
  63.         if self.rect.top >= SCREEN_HEIGHT - self.rect.height:
  64.             self.rect.top = SCREEN_HEIGHT - self.rect.height
  65.         else:
  66.             self.rect.top += self.speed
  67.     def moveLeft(self):
  68.         # 当遇到左边时,一直停靠在左边
  69.         if self.rect.left <= 0:
  70.             self.rect.left = 0
  71.         else:
  72.             self.rect.left -= self.speed
  73.     def moveRight(self):
  74.         # 当遇到右边时, 停靠右边
  75.         if self.rect.left >= SCREEN_WIDTH - self.rect.width:
  76.             self.rect.left = SCREEN_WIDTH - self.rect.width
  77.         else:
  78.             self.rect.left += self.speed
  79. class Bullet(pygame.sprite.Sprite):
  80.     def __init__(self, img, pos):
  81.         pygame.sprite.Sprite.__init__(self)
  82.         self.image = img
  83.         # 设置图片的区域
  84.         self.rect = self.image.get_rect()
  85.         self.rect.midbottom = pos
  86.         self.speed = 10
  87.     def move(self):
  88.         self.rect.top -= self.speed
  89. class Enemy(pygame.sprite.Sprite):
  90.     def __init__(self, img, explosion_img, pos):
  91.         pygame.sprite.Sprite.__init__(self)
  92.         self.image = img
  93.         self.rect = self.image.get_rect()
  94.         self.rect.topleft = pos
  95.         self.explosion_img = explosion_img
  96.         self.speed = 2
  97.         # 设置击毁序列
  98.         self.explosion_index = 0
  99.     def move(self):
  100.         # 敌人的子弹只能一直向下
  101.         self.rect.top += self.speed
  102. while running:
  103.     # 设置游戏帧率为 60
  104.     clock.tick(60)
  105.     if not is_pause and not is_game_over:
  106.         if not player.is_hit:
  107.             # 设置连续射击,因为每秒 60 帧,15/60=0.25 秒发一次子弹
  108.             if shoot_frequency % 15 == 0:
  109.                 player.shoot(bullet_img)
  110.             shoot_frequency += 1
  111.             # 当设置的射击频率大于 15,置零
  112.             if shoot_frequency >= 15:
  113.                 shoot_frequency = 0
  114.         # 控制生成敌机的频率
  115.         if enemy_frequency % 50 == 0:
  116.             # 设置敌机的出现的位置
  117.             enemy_pos = [random.randint(0, SCREEN_WIDTH - enemy_rect.width), 0]
  118.             enemy = Enemy(enemy_img, enemy_explosion_imgs, enemy_pos)
  119.             enemies.add(enemy)
  120.         enemy_frequency += 1
  121.         if enemy_frequency >= 100:
  122.             enemy_frequency = 0
  123.         # 控制子弹的显示运行
  124.         for bullet in player.bullets:
  125.             bullet.move()
  126.             if bullet.rect.bottom < 0:
  127.                 player.bullets.remove(bullet)
  128.         # 控制敌机的运行
  129.         for enemy in enemies:
  130.             enemy.move()
  131.             # 判断敌机是否与玩家飞机碰撞
  132.             if pygame.sprite.collide_circle(enemy, player):
  133.                 enemies_explosion.add(enemy)
  134.                 enemies.remove(enemy)
  135.                 player.is_hit = True
  136.                 # 设置玩家的飞机被毁
  137.                 is_game_over = True
  138.             # 判断敌机是否在界面
  139.             if enemy.rect.top < 0:
  140.                 enemies.remove(enemy)
  141.         # 设置敌机与玩家的飞机子弹相碰时,返回被击的敌机实例
  142.         enemy_explosion = pygame.sprite.groupcollide(enemies, player.bullets, 1, 1)
  143.         for enemy in enemy_explosion:
  144.             enemies_explosion.add(enemy)
  145.     # 绘制屏幕
  146.     screen.fill(0)
  147.     # 加入背景图片
  148.     screen.blit(bg, (0, 0))
  149.     # 添加玩家飞机图片到屏幕
  150.     if not player.is_hit:
  151.         screen.blit(player.image[int(player.img_index)], player.rect)
  152.         player.img_index = shoot_frequency / 8
  153.     else:
  154.         if player_explosion_index > 47:
  155.             is_game_over = True
  156.         else:
  157.             player.img_index = player_explosion_index / 8
  158.             screen.blit(player.image[int(player.img_index)], player.rect)
  159.             player_explosion_index += 1
  160.     # 敌机被子弹击中的效果显示
  161.     for enemy in enemies_explosion:
  162.         if enemy.explosion_index == 0:
  163.             pass
  164.         if enemy.explosion_index > 7:
  165.             enemies_explosion.remove(enemy)
  166.             score += 100
  167.             continue
  168.         # 敌机被击时显示图片
  169.         screen.blit(enemy.explosion_img[int(enemy.explosion_index / 2)], enemy.rect)
  170.         enemy.explosion_index += 1
  171.     # 显示子弹
  172.     player.bullets.draw(screen)
  173.     # 显示敌机
  174.     enemies.draw(screen)
  175.     # 分数的显示效果
  176.     score_font = pygame.font.Font(None, 36)
  177.     score_text = score_font.render(str(score), True, (128, 128, 128))
  178.     # 设置文字框
  179.     text_rect = score_text.get_rect()
  180.     # 放置文字的位置
  181.     text_rect.topleft = [20, 10]
  182.     # 显示出分数
  183.     screen.blit(score_text, text_rect)
  184.     left, middle, right = pygame.mouse.get_pressed()
  185.     # 暂停游戏
  186.     if right == True and not is_game_over:
  187.         is_pause = True
  188.     if left == True:
  189.         # 重置游戏
  190.         if is_game_over:
  191.             is_game_over = False
  192.             player_rect = []
  193.             player_rect.append(pygame.Rect(0, 99, 102, 126))
  194.             player_rect.append(pygame.Rect(165, 360, 102, 126))
  195.             player_rect.append(pygame.Rect(165, 234, 102, 126))
  196.             player_rect.append(pygame.Rect(330, 624, 102, 126))
  197.             player_rect.append(pygame.Rect(330, 498, 102, 126))
  198.             player_rect.append(pygame.Rect(432, 624, 102, 126))
  199.             player = Player(img_plane, player_rect, player_pos)
  200.             bullet_rect = pygame.Rect(1004, 987, 9, 21)
  201.             bullet_img = img_plane.subsurface(bullet_rect)
  202.             enemy_rect = pygame.Rect(534, 612, 57, 43)
  203.             enemy_img = img_plane.subsurface(enemy_rect)
  204.             enemy_explosion_imgs = []
  205.             enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267, 347, 57, 43)))
  206.             enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(873, 697, 57, 43)))
  207.             enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(267, 296, 57, 43)))
  208.             enemy_explosion_imgs.append(img_plane.subsurface(pygame.Rect(930, 697, 57, 43)))
  209.             enemies = pygame.sprite.Group()
  210.             enemies_explosion = pygame.sprite.Group()
  211.             score = 0
  212.             shoot_frequency = 0
  213.             enemy_frequency = 0
  214.             player_explosion_index = 16
  215.         # 继续游戏
  216.         if is_pause:
  217.             is_pause = False
  218.     # 游戏结束
  219.     if is_game_over:
  220.         font = pygame.font.SysFont("微软雅黑", 48)
  221.         text = font.render("Score: " + str(score), True, (255, 0, 0))
  222.         text_rect = text.get_rect()
  223.         text_rect.centerx = screen.get_rect().centerx
  224.         text_rect.centery = screen.get_rect().centery + 70
  225.         # 显示游戏结束画面
  226.         screen.blit(bg_game_over, (0, 0))
  227.         # 显示分数
  228.         screen.blit(text, text_rect)
  229.         font = pygame.font.SysFont("微软雅黑", 40)
  230.         text = font.render("Press Left Mouse to Restart", True, (255, 0, 0))
  231.         text_rect = text.get_rect()
  232.         text_rect.centerx = screen.get_rect().centerx
  233.         text_rect.centery = screen.get_rect().centery + 150
  234.         screen.blit(text, text_rect)
  235.     # 刷新屏幕
  236.     pygame.display.update()
  237.     # 处理游戏退出
  238.     for event in pygame.event.get():
  239.         if event.type == pygame.QUIT:
  240.             pygame.quit()
  241.             exit()
  242.     if not is_pause and not is_game_over:
  243.         key = pygame.key.get_pressed()
  244.         if key[K_w] or key[K_UP]:
  245.             player.moveUp()
  246.         if key[K_s] or key[K_DOWN]:
  247.             player.moveDown()
  248.         if key[K_a] or key[K_LEFT]:
  249.             player.moveLeft()
  250.         if key[K_d] or key[K_RIGHT]:
  251.             player.moveRight()
复制代码


盘基地论坛免责声明
1、本站资源来自互联网用户收集发布,仅供用于学习和交流。
2、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。
3、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决。
4、联系邮箱:admin@panjdzy.com
5、官方网址:www.panjdzy.com
6、备用网址:www.panjd.top




上一篇:求解方程 x^4 + 6x^2 + 9 = 0 的根。
下一篇:求解方程 x^2 - 5x + 6 = 0 的根。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|云盘资源分享论坛

GMT+8, 2025-6-25 15:40

Powered by Discuz!    联系邮箱:admin@panjdzy.com

本站资源来自互联网用户收集发布,仅供用于学习和交流。

如有侵权之处,请联系站长并出示版权证明以便删除,敬请谅解!

快速回复 返回顶部 返回列表