Python小游戏之 - 飞机大战 !
用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小游戏之 - 飞机大战 !的更多相关文章
- Python小游戏之 - 飞机大战美女 !
用Python写的"飞机大战美女"小游戏 源代码如下: # coding=utf-8 import os import random import pygame # 用一个常量来存 ...
- 微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js)
微信小游戏 demo 飞机大战 代码分析(四)(enemy.js, bullet.js, index.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞 ...
- 微信小游戏 demo 飞机大战 代码分析 (三)(spirit.js, animation.js)
微信小游戏 demo 飞机大战 代码分析(三)(spirit.js, animation.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码 ...
- 微信小游戏 demo 飞机大战 代码分析 (二)(databus.js)
微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...
- 微信小游戏 demo 飞机大战 代码分析 (一)(game.js, main.js)
微信小游戏 demo 飞机大战 代码分析(一)(main.js) 微信小游戏 demo 飞机大战 代码分析(二)(databus.js) 微信小游戏 demo 飞机大战 代码分析(三)(spirit. ...
- Python之游戏开发-飞机大战
Python之游戏开发-飞机大战 想要代码文件,可以加我微信:nickchen121 #!/usr/bin/env python # coding: utf-8 import pygame impor ...
- 微信demo小游戏:飞机大战从无到有
微信demo游戏飞机大战从无到有 现在创建新项目会默认给飞机大战的demo,这里给大家从基础开始讲解游戏的从无到有是怎么实现的. 具体实现步骤: 创建背景图->背景图运动起来->创建飞机并 ...
- 500行代码,教你用python写个微信飞机大战
这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手. 帮助蹲厕族.YP族.饭圈女孩在无聊之余可以有一样东西让他们振作起来!让他们的左手 / 右 ...
- Python小游戏、小程序
python 小游戏之摇骰子猜大小 python 实现一个双色球生成程序 python-循环与判断练习题
随机推荐
- xray 与 awvs 爬虫联动
awvs 的爬虫很好用,支持表单分析和单页应用的爬取,xray 的扫描能力比较强,速度也更快.awvs 和 xray 搭配使用则是如虎添翼.这里演示的是扫描 awvs 的在线靶站 http://tes ...
- Java的JDBC
第一个JDBC程序 创建测试数据库 CREATE DATABASE jdbcStudy CHARACTER SET utf8 COLLATE utf8_general_ci; USE jdbcStud ...
- XRecyclerView:实现下拉刷新、滚动到底部加载更多以及添加header功能的RecyclerView
介绍: 一个实现了下拉刷新,滚动到底部加载更多以及添加header功能的的RecyclerView.使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater. ...
- 1120day-户别确认
1.实体类 package com.edu.empity; public class People { private String hubie; private String livetype; p ...
- elasticsearch算法之词项相似度算法(一)
一.词项相似度 elasticsearch支持拼写纠错,其建议词的获取就需要进行词项相似度的计算:今天我们来通过不同的距离算法来学习一下词项相似度算法: 二.数据准备 计算词项相似度,就需要首先将词项 ...
- golang中bufio和ioutil的使用
bufio bufio包实现了带缓冲区的读写,是对文件读写的封装 bufio缓冲写数据 模式 含义 os.O_WRONLY 只写 os.O_CREATE 创建文件 os.O_RDONLY 只读 os. ...
- Matplotlib直方图绘制技巧
情境引入 我们在做机器学习相关项目时,常常会分析数据集的样本分布,而这就需要用到直方图的绘制. 在Python中可以很容易地调用matplotlib.pyplot的hist函数来绘制直方图.不过,该函 ...
- CSP2019 Day2T2 划分
很显然有一个暴力 \(dp\),令 \(dp_{i, j}\) 表示最后一次划分在 \(i\) 上次划分在 \(j\) 的最小花费,令 \(S_i = \sum\limits_{j = 1} ^ i ...
- 「SDWC2018 Day1」网格
题目当中有三条限制,我们来逐一考虑.对于第一条限制,每次走动的增加量 \(x_i \le M_x, y_i \le M_y\),可以发现一共走的步数是确定的,那么就相当于解这样两个方程组: \[x_1 ...
- Log4j2日志技术总结
前言 现在流行是SLF4j和Log4j2组合的日志技术,但为了日志技术归类,故前因后果都将做一下介绍. 市场上流行的日志框架 JUL java util logging Java开发团队开发,Jdk原 ...