用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. Keil MDK STM32系列(五) 使用STM32CubeMX创建项目基础结构

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  2. Solon Web 开发,十四、与Spring、Jsr330的常用注解对比

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

  3. 搭建vps(virtual private station)之Github教育礼包之DigitalOcean

    最近Github联合很多业内厂商给出了一份学生礼包,可以用来做很多事情,其中包括Digital Ocean的100$优惠,用他可以架设自己的云服务器,选择每月5$套餐可获得512Mb内存20g固态硬盘 ...

  4. C++中的const和mutable

    1 #include<iostream> 2 using namespace std; 3 //如果在类A的成员函数dis()中想要修改_z,但是不能修改_x,_y怎么办? 4 //如果d ...

  5. 集合框架-工具类-JDK5.0特性-静态导入

    1 package cn.itcast.p4.news.demo; 2 3 import java.util.ArrayList; 4 //import java.util.Collections; ...

  6. [HZOI] 山海经 题解

    0.题目大意 给出一个序列,每次查询一个区间的最大子段和的端点和值.序列长度 \(n \le 10^{5}\) . 1.思路 显然应该使用线段树.题目要求每次求一个区间的最大子段和,那么在线段树节点中 ...

  7. 【建议收藏】Redis超详细入门教程大杂烩

    写在前边 Redis入门的整合篇.本篇也算是把2021年redis留下来的坑填上去,重新整合了一翻,点击这里,回顾我的2020与2021~一名大二后台练习生 NoSQL NoSQL(NoSQL = N ...

  8. 2020-11-21 f

    题意:给定一个长度为 \(n\) 的序列 \(A\),\(A_i \in [0, 2 ^ k)\).定义 \(f(x)\) 为 \(A_1\) ^ \(x\),\(A_2\) ^ \(x \cdots ...

  9. python编写购物车新写法

    用另一种方式完成购物车的功能实现 #!/usr/bin/python zijin = input("请输入资金:") if zijin.isdigit(): zijin = int ...

  10. Java基础复习(五)

    1. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法? 接口可以继承接口.抽象类可 ...