用Python写的"飞机大战"小游戏

源代码如下:

  1. # coding=utf-8
  2. import random
  3. import os
  4. import pygame
  5.  
  6. # 用一个常量来存储屏幕的位置和大小,常量用全大写表示
  7. SCREEN_RECT = pygame.Rect(0,0,480,600)
  8. # 定义敌机事件定时器常量值
  9. CREATE_ENEMY_EVENT = pygame.USEREVENT
  10. # 定义发射子弹定时器常量值(由于USEREVENT这个常量值被敌机事件占用了,加1来改变数值)
  11. HERO_FIRE_EVENT = pygame.USEREVENT + 1
  12.  
  13. # 飞机大战游戏精灵父类
  14. class GameSprite(pygame.sprite.Sprite):
  15. """飞机大战游戏精灵父类"""
  16. def __init__(self,image_name,speed=1):
  17. # 调用父类的初始化方法
  18. super().__init__()
  19. # 定义对象的属性(分别是图像,位置,速度)
  20. self.image = pygame.image.load(image_name)
  21. self.rect = self.image.get_rect()
  22. self.speed = speed
  23.  
  24. def update(self):
  25. # 在屏幕的垂直方向上移动
  26. self.rect.y += self.speed
  27.  
  28. # 游戏背景精灵子类
  29. class BackGround(GameSprite):
  30. """游戏背景精灵子类"""
  31. def update(self):
  32. # 调用父类的update方法
  33. super().update()
  34. if self.rect.y >= self.rect.height:
  35. self.rect.y = -self.rect.height
  36.  
  37. # 敌机精灵子类
  38. class Enemy(GameSprite):
  39. """敌机精灵子类"""
  40. def __init__(self):
  41. # 1.调用父类方法 , 创建敌机精灵 , 同时指定敌机图片
  42. super().__init__("./picture/girl.png")
  43. # 2.指定敌机的初始随机速度
  44. self.speed = random.randint(1,5)
  45. # 3.指定敌机的初始随机位置
  46. self.rect.y = -self.rect.height
  47. max_x = SCREEN_RECT.width - self.rect.width
  48. self.rect.x = random.randint(0,max_x)
  49.  
  50. def update(self):
  51. # 1.调用父类方法 , 保持垂直方向的飞行
  52. super().update()
  53. # 2.判断是否飞出屏幕 , 如果是 , 需要从精灵组删除敌机,释放掉内存
  54. if self.rect.y >= SCREEN_RECT.height:
  55. self.kill()
  56.  
  57. def __del__(self):
  58. pass
  59.  
  60. # 英雄飞机精灵子类
  61. class Hero(GameSprite):
  62. """英雄飞机精灵子类"""
  63. def __init__(self):
  64. # 1.调用父类方法,定义image_name和初始速度参数
  65. super().__init__("./picture/hero.png",0)
  66. # 2.设置英雄的初始位置
  67. self.rect.centerx = SCREEN_RECT.centerx
  68. self.rect.y = SCREEN_RECT.height - self.rect.height
  69. # 3.创建敌机精灵组
  70. self.bullets = pygame.sprite.Group()
  71.  
  72. def update(self):
  73. # 英雄在水平方向移动
  74. self.rect.x += self.speed
  75. # 控制英雄不能离开屏幕
  76. if self.rect.x < 0:
  77. self.rect.x = 0
  78. elif self.rect.x > SCREEN_RECT.width - self.rect.width:
  79. self.rect.x = SCREEN_RECT.width - self.rect.width
  80.  
  81. def fire(self):
  82. # 创建子弹精灵
  83. bullet = Bullet()
  84. # 指定子弹精灵初始位置
  85. bullet.rect.centerx = self.rect.centerx
  86. bullet.rect.y = SCREEN_RECT.height - self.rect.height - 50
  87. # 将子弹添加到子弹精灵组
  88. self.bullets.add(bullet)
  89.  
  90. # 子弹精灵子类
  91. class Bullet(GameSprite):
  92. """子弹精灵子类"""
  93. def __init__(self):
  94. super().__init__("./picture/missile.png",-6)
  95.  
  96. def update(self):
  97. super().update()
  98. # 判断子弹是否飞出屏幕 , 及时删除子弹释放出内存空间
  99. if self.rect.y < 0:
  100. self.kill()
  101.  
  102. def __del__(self):
  103. pass
  104.  
  105. # 飞机大战主游戏类
  106. class PlaneGame(object):
  107. """飞机大战主游戏类"""
  108. def __init__(self):
  109. # 1.创建游戏窗口属性
  110. self.screen = pygame.display.set_mode(SCREEN_RECT.size)
  111. # 2.创建游戏的时钟属性
  112. self.clock = pygame.time.Clock()
  113. # 3.调用私有方法 , 创建精灵和精灵组
  114. self.__create_sprites()
  115. # 4.设置定时器事件 - 1s = 1000 ms
  116. pygame.time.set_timer(CREATE_ENEMY_EVENT,700)
  117. pygame.time.set_timer(HERO_FIRE_EVENT,500)
  118.  
  119. def __create_sprites(self):
  120. """定义创建精灵和精灵组方法"""
  121. # 创建背景精灵和精灵组
  122. bg1 = BackGround("./picture/background.png")
  123. bg2 = BackGround("./picture/background.png")
  124. bg2.rect.y = -bg2.rect.height
  125. self.back_group = pygame.sprite.Group(bg1,bg2)
  126. # 创建敌机精灵组
  127. self.enemy_group = pygame.sprite.Group()
  128. # 创建英雄飞机的精灵和精灵组
  129. self.hero = Hero()
  130. self.hero_group = pygame.sprite.Group(self.hero)
  131.  
  132. def start_game(self):
  133. while True:
  134. # 1.设置刷新帧率
  135. self.clock.tick(60)
  136. # 2.事件监听
  137. self.__event_handler()
  138. # 3.碰撞检测
  139. self.__check_collide()
  140. # 4.更新/绘制精灵组
  141. self.__update_sprites()
  142. # 5.更新屏幕显示
  143. pygame.display.update()
  144.  
  145. # 事件监听(监听定时器常量)
  146. def __event_handler(self):
  147. for event in pygame.event.get():
  148. # 判断是否退出游戏
  149. if event.type == pygame.QUIT:
  150. # 用类名.的方式来调用静态方法
  151. PlaneGame.__game_over()
  152. elif event.type == CREATE_ENEMY_EVENT:
  153. # 创建敌机精灵对象
  154. enemy = Enemy()
  155. # 将敌机精灵添加到敌机精灵组
  156. self.enemy_group.add(enemy)
  157. elif event.type == HERO_FIRE_EVENT:
  158. self.hero.fire()
  159. # 使用键盘提供的方法获取键盘按键 , 得到的是一个按键元组
  160. keys_pressed = pygame.key.get_pressed()
  161. if keys_pressed[pygame.K_RIGHT]:
  162. self.hero.speed = 4
  163. elif keys_pressed[pygame.K_LEFT]:
  164. self.hero.speed = -4
  165. else:
  166. self.hero.speed = 0
  167.  
  168. # 碰撞检测
  169. def __check_collide(self):
  170. # 子弹摧毁敌机
  171. pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
  172. # 敌机撞毁英雄飞机,返回的是碰撞的敌机列表
  173. enemies_list = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
  174. if len(enemies_list) > 0: # 列表有内容代表发生碰撞了
  175. self.hero.kill() # 释放掉内存
  176. # 退出游戏
  177. PlaneGame.__game_over()
  178.  
  179. # 更新/绘制精灵组
  180. def __update_sprites(self):
  181. self.back_group.update()
  182. self.back_group.draw(self.screen)
  183.  
  184. self.enemy_group.update()
  185. self.enemy_group.draw(self.screen)
  186.  
  187. self.hero_group.update()
  188. self.hero_group.draw(self.screen)
  189.  
  190. self.hero.bullets.update()
  191. self.hero.bullets.draw(self.screen)
  192.  
  193. @staticmethod
  194. def __game_over():
  195. pygame.quit()
  196. print("Game Over!")
  197. print("\n\n游戏版本: 18.4.11\n游戏名称: 飞机大战\n游戏平台: windows\n 开发者: ChenBin\n")
  198. # exit()
  199. os.system("pause")
  200.  
  201. if __name__ == "__main__":
  202. # 创建游戏对象
  203. game = PlaneGame()
  204. # 启动游戏
  205. game.start_game()

Python小游戏之 - 飞机大战 !的更多相关文章

  1. Python小游戏之 - 飞机大战美女 !

    用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...

  2. 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)

    微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...

  3. 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)

    微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...

  4. 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)

    微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  5. 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)

    微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...

  6. Python之游戏开发-飞机大战

    Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...

  7. 微信demo小游戏:飞机大战从无到有

    微信demo游戏飞机大战从无到有 现在创建新项目会默认给飞机大战的demo,这里给大家从基础开始讲解游戏的从无到有是怎么实现的. 具体实现步骤: 创建背景图->背景图运动起来->创建飞机并 ...

  8. 500行代码,教你用python写个微信飞机大战

    这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...

  9. Python小游戏、小程序

    python 小游戏之摇骰子猜大小 python 实现一个双色球生成程序 python-循环与判断练习题

随机推荐

  1. xray 与 awvs 爬虫联动

    awvs 的爬虫很好用,支持表单分析和单页应用的爬取,xray 的扫描能力比较强,速度也更快.awvs 和 xray 搭配使用则是如虎添翼.这里演示的是扫描 awvs 的在线靶站 http://tes ...

  2. Java的JDBC

    第一个JDBC程序 创建测试数据库 CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStud ...

  3. XRecyclerView:实现下拉刷新、滚动到底部加载更多以及添加header功能的RecyclerView

    介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. ...

  4. 1120day-户别确认

    1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...

  5. elasticsearch算法之词项相似度算法(一)

    一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...

  6. golang中bufio和ioutil的使用

    bufio bufio包实现了带缓冲区的读写,是对文件读写的封装 bufio缓冲写数据 模式 含义 os.O_WRONLY 只写 os.O_CREATE 创建文件 os.O_RDONLY 只读 os. ...

  7. Matplotlib直方图绘制技巧

    情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...

  8. CSP2019 Day2T2 划分

    很显然有一个暴力 \(dp\),令 \(dp_{i, j}\) 表示最后一次划分在 \(i\) 上次划分在 \(j\) 的最小花费,令 \(S_i = \sum\limits_{j = 1} ^ i ...

  9. 「SDWC2018 Day1」网格

    题目当中有三条限制,我们来逐一考虑.对于第一条限制,每次走动的增加量 \(x_i \le M_x, y_i \le M_y\),可以发现一共走的步数是确定的,那么就相当于解这样两个方程组: \[x_1 ...

  10. Log4j2日志技术总结

    前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...