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

源代码如下:

# coding=utf-8
import random
import os
import pygame # 用一个常量来存储屏幕的位置和大小,常量用全大写表示
SCREEN_RECT = pygame.Rect(0,0,480,600)
# 定义敌机事件定时器常量值
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 定义发射子弹定时器常量值(由于USEREVENT这个常量值被敌机事件占用了,加1来改变数值)
HERO_FIRE_EVENT = pygame.USEREVENT + 1 # 飞机大战游戏精灵父类
class GameSprite(pygame.sprite.Sprite):
"""飞机大战游戏精灵父类"""
def __init__(self,image_name,speed=1):
# 调用父类的初始化方法
super().__init__()
# 定义对象的属性(分别是图像,位置,速度)
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed def update(self):
# 在屏幕的垂直方向上移动
self.rect.y += self.speed # 游戏背景精灵子类
class BackGround(GameSprite):
"""游戏背景精灵子类"""
def update(self):
# 调用父类的update方法
super().update()
if self.rect.y >= self.rect.height:
self.rect.y = -self.rect.height # 敌机精灵子类
class Enemy(GameSprite):
"""敌机精灵子类"""
def __init__(self):
# 1.调用父类方法 , 创建敌机精灵 , 同时指定敌机图片
super().__init__("./picture/girl.png")
# 2.指定敌机的初始随机速度
self.speed = random.randint(1,5)
# 3.指定敌机的初始随机位置
self.rect.y = -self.rect.height
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0,max_x) def update(self):
# 1.调用父类方法 , 保持垂直方向的飞行
super().update()
# 2.判断是否飞出屏幕 , 如果是 , 需要从精灵组删除敌机,释放掉内存
if self.rect.y >= SCREEN_RECT.height:
self.kill() def __del__(self):
pass # 英雄飞机精灵子类
class Hero(GameSprite):
"""英雄飞机精灵子类"""
def __init__(self):
# 1.调用父类方法,定义image_name和初始速度参数
super().__init__("./picture/hero.png",0)
# 2.设置英雄的初始位置
self.rect.centerx = SCREEN_RECT.centerx
self.rect.y = SCREEN_RECT.height - self.rect.height
# 3.创建敌机精灵组
self.bullets = pygame.sprite.Group() def update(self):
# 英雄在水平方向移动
self.rect.x += self.speed
# 控制英雄不能离开屏幕
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.x > SCREEN_RECT.width - self.rect.width:
self.rect.x = SCREEN_RECT.width - self.rect.width def fire(self):
# 创建子弹精灵
bullet = Bullet()
# 指定子弹精灵初始位置
bullet.rect.centerx = self.rect.centerx
bullet.rect.y = SCREEN_RECT.height - self.rect.height - 50
# 将子弹添加到子弹精灵组
self.bullets.add(bullet) # 子弹精灵子类
class Bullet(GameSprite):
"""子弹精灵子类"""
def __init__(self):
super().__init__("./picture/missile.png",-6) def update(self):
super().update()
# 判断子弹是否飞出屏幕 , 及时删除子弹释放出内存空间
if self.rect.y < 0:
self.kill() def __del__(self):
pass # 飞机大战主游戏类
class PlaneGame(object):
"""飞机大战主游戏类"""
def __init__(self):
# 1.创建游戏窗口属性
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2.创建游戏的时钟属性
self.clock = pygame.time.Clock()
# 3.调用私有方法 , 创建精灵和精灵组
self.__create_sprites()
# 4.设置定时器事件 - 1s = 1000 ms
pygame.time.set_timer(CREATE_ENEMY_EVENT,700)
pygame.time.set_timer(HERO_FIRE_EVENT,500) def __create_sprites(self):
"""定义创建精灵和精灵组方法"""
# 创建背景精灵和精灵组
bg1 = BackGround("./picture/background.png")
bg2 = BackGround("./picture/background.png")
bg2.rect.y = -bg2.rect.height
self.back_group = pygame.sprite.Group(bg1,bg2)
# 创建敌机精灵组
self.enemy_group = pygame.sprite.Group()
# 创建英雄飞机的精灵和精灵组
self.hero = Hero()
self.hero_group = pygame.sprite.Group(self.hero) def start_game(self):
while True:
# 1.设置刷新帧率
self.clock.tick(60)
# 2.事件监听
self.__event_handler()
# 3.碰撞检测
self.__check_collide()
# 4.更新/绘制精灵组
self.__update_sprites()
# 5.更新屏幕显示
pygame.display.update() # 事件监听(监听定时器常量)
def __event_handler(self):
for event in pygame.event.get():
# 判断是否退出游戏
if event.type == pygame.QUIT:
# 用类名.的方式来调用静态方法
PlaneGame.__game_over()
elif event.type == CREATE_ENEMY_EVENT:
# 创建敌机精灵对象
enemy = Enemy()
# 将敌机精灵添加到敌机精灵组
self.enemy_group.add(enemy)
elif event.type == HERO_FIRE_EVENT:
self.hero.fire()
# 使用键盘提供的方法获取键盘按键 , 得到的是一个按键元组
keys_pressed = pygame.key.get_pressed()
if keys_pressed[pygame.K_RIGHT]:
self.hero.speed = 4
elif keys_pressed[pygame.K_LEFT]:
self.hero.speed = -4
else:
self.hero.speed = 0 # 碰撞检测
def __check_collide(self):
# 子弹摧毁敌机
pygame.sprite.groupcollide(self.hero.bullets,self.enemy_group,True,True)
# 敌机撞毁英雄飞机,返回的是碰撞的敌机列表
enemies_list = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
if len(enemies_list) > 0: # 列表有内容代表发生碰撞了
self.hero.kill() # 释放掉内存
# 退出游戏
PlaneGame.__game_over() # 更新/绘制精灵组
def __update_sprites(self):
self.back_group.update()
self.back_group.draw(self.screen) self.enemy_group.update()
self.enemy_group.draw(self.screen) self.hero_group.update()
self.hero_group.draw(self.screen) self.hero.bullets.update()
self.hero.bullets.draw(self.screen) @staticmethod
def __game_over():
pygame.quit()
print("Game Over!")
print("\n\n游戏版本: 18.4.11\n游戏名称: 飞机大战\n游戏平台: windows\n 开发者: ChenBin\n")
# exit()
os.system("pause") if __name__ == "__main__":
# 创建游戏对象
game = PlaneGame()
# 启动游戏
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. Lyft 宣布开源基础设施工具管理平台 Clutch!

    今天我们很高兴地宣布,Lyft 的基础设施工具可扩展 UI 和 API 平台clutch已开放源代码,clutch使工程团队能够构建.运行和维护用户友好的工作流,这些工作流还包含特定于域的安全机制和访 ...

  2. vmware快速扩容虚拟磁盘

    在使用vmware进行虚拟化的时候,会遇到虚拟磁盘不够用的情况,以前的办法都是使用lvm进行管理扩容,目前在linux上可以实现快速扩容了,具体方法如下: 该方法参考阿里云在线扩容文档:文档地址 其中 ...

  3. python基本数据类型与操作

    一.变量 1.变量的三要素:变量名.变量值.变量数据类型 2.定义变量格式:变量名称 = 变量值 3.输出变量:print(变量名) """ 变量 "" ...

  4. 通过HTML+CSS+JavaScript实现鼠标移动到页面顶部导航栏出现,如果移出导航栏3秒又隐藏起来,而且不受滚动条影响(二)

    通过HTML+CSS+JavaScript实现鼠标移动到页面顶部导航栏出现,如果移出导航栏3秒又隐藏起来,而且不受滚动条影响(二) 效果:默认一直隐藏导航栏,当滚动条滚到超过300px按钮出现,点击回 ...

  5. linux base脚本编写-自动领取微信红包

    bash脚本编写 语法 变量 定义: your_name = "ABC" 使用: echo $your_name 只读变量 a = "123" readonly ...

  6. Solon Web 开发

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. 5.14-HTTP间通信

    1.社长社员通信WEBSOCKET WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是一种基于 TCP 的一种独立实现. 以前客户端想知道 ...

  8. 一文读懂mysql权限系统

    前言: MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT.INSERT.UPDATE和DELETE权限.附加的功能包括有匿名的用户并对于MySQL特定 ...

  9. 集合框架-List集合的常见方法

    1 package cn.itcast.p4.list.demo; 2 3 import java.util.List; 4 import java.util.ArrayList; 5 6 publi ...

  10. JavaScripts之变量作用域提升问题(var、let、const)

    变量提升(Hoisting) var: 使用var在函数或全局内任何地方声明变量相当于在其内部最顶上声明它,这种行为称为Hoisting(提升) 注意:变量赋值的位置不会改变 function fn( ...