Python 飞机大战|10 分钟学会用 python 写游戏

2018 年 python 语言大火, 这把火看趋势已然延续到了 2019 年!

除了在科学计算领域 python 有用武之地之外, 在游戏, 后台等方面, python 也大放异彩,

我将按照正规的项目开发流程, 手把手教大家写个 python 小游戏, 游戏的名字叫做 alien invasion!

Python|10 分钟学会用 python 写游戏

安装 pygame 并创建能左右移动的飞船

安装 pygame

本人电脑是 Windows 10,python3.6,pygame 下载地址:

https://pypi.python.org/pypi/Pygame/1.9.3

请自行下载对应 python 版本的

pygame

运行以下命令

Python|10 分钟学会用 python 写游戏

创建 Pygame 窗口及响应用户输入

新建一个文件夹 alien_invasion, 并在文件夹中新建 alien_invasion.py 文件, 输入如下代码.

Python|10 分钟学会用 python 写游戏

运行上述代码, 我们可以得到一个灰色界面的窗口:

Python|10 分钟学会用 python 写游戏

创建设置类

为了在写游戏的过程中能便捷地创建一些新功能, 下面额外编写一个 settings 模块, 其中包含一个 Settings 类, 用于将所有设置存储在一个地方.

这样在以后项目增大时修改游戏的外观就更加容易.

我们首先将 alien_invasion.py 中的显示屏大小及显示屏颜色进行修改.

首先在 alien_invasion 文件夹下新建 python 文件 settings.py, 并向其中添加如下代码:

Python|10 分钟学会用 python 写游戏

然后再 alien_invasion.py 中导入 Settings 类, 并使用相关设置, 修改如下:

Python|10 分钟学会用 python 写游戏

添加飞船图像

接下来, 我们需要将飞船加入游戏中. 为了在屏幕上绘制玩家的飞船, 我们将加载一幅图像, 再使用 Pygame()方法 blit()绘制它.

在游戏中几乎可以使用各种类型的图像文件, 但是使用位图 (.bmp) 文件最为简单, 这是因为 Pygame 默认加载位图.

虽然其他类型的图像也能加载, 但是需要安装额外的库.

我们推荐去免费的图片素材网站上去找图像:

https://pixabay.com/

我们在主项目文件夹 (alien_invasion) 中新建一个文件夹叫 images, 将如下 bmp 图片放入其中.

Python|10 分钟学会用 python 写游戏

接下来, 我们创建飞船类 ship.py:

Python|10 分钟学会用 python 写游戏

重构: 模块 game_functions

在大型项目中, 经常需要在添加新代码前重构既有代码. 重构的目的是为了简化代码的结构, 使其更加容易扩展.

我们将实现一个 game_functions 模块, 它将存储大量让游戏 Alien invasion 运行的函数. 通过创建模块 game_functions, 可避免 alien_invasion.py 太长, 使其逻辑更容易理解.

函数 check_events()

首先我们将管理事件的代码移到一个名为 check_events()的函数中, 目的是为了隔离事件循环

Python|10 分钟学会用 python 写游戏

然后我们修改 alien_invasion.py 代码, 导入 game_functions 模块, 并将事件循环替换成对函数 check_events()的调用:

Python|10 分钟学会用 python 写游戏

函数 update_screen()

将更新屏幕的代码移到一个名为 update_screen()函数中, 并将这个函数放在模块 game_functions 中:

Python|10 分钟学会用 python 写游戏

其中 alien_invasion 修改如下:

Python|10 分钟学会用 python 写游戏

从上面一套流程走下来, 我们发现: 在实际的开发过程中, 我们一开始将代码编写得尽可能的简单, 并在项目越来越复杂时进行重构. 接下来我们开始处理游戏的动态方面.

驾驶飞船

这里我们要实现的就是使玩家通过左右箭头键来控制飞船的左移与右移.

响应按键

因为在 pygame 中, 每次按键都被注册为 KEYDOWN 事件, 在 check_events()中, 我们通过 event.type 检测到 KEYDOWN 事件后还需进一步判断是哪个按键. 代码如下:

Python|10 分钟学会用 python 写游戏

允许不断移动

玩家按住右箭头不动时, 我们希望飞船能不断地移动, 知道玩家松开为止. 这里我们通过 KETUO 事件来判断. 因此我们设置一个标志位 moving_right 来实现持续移动. 原理如下:

飞船不动时, 标志 moving_right 将为 false. 玩家按下右箭头时, 我们将这个标志设置为 True; 玩家松开时, 我们将标志重新设置成 False.

这个移动属性是飞船属性的一种, 我们用 ship 类来控制, 因此我们给这个类增加一个属性名称叫, moving_right 以及一个 update()方法来检测标志 moving_right 的状态.

ship

Python|10 分钟学会用 python 写游戏

game_functions

Python|10 分钟学会用 python 写游戏

最后在 alien_invasion 中调用 update()方法

Python|10 分钟学会用 python 写游戏

左右移动

前面我们实现了向右移动, 接下来实现向左移动, 逻辑类似, 代码就不贴了.

调整飞船的速度

当前, 每次执行 while 循环时, 飞船最多移动一个像素, 我们可以在 Settings 中添加 ship_speed_factor, 用于控制飞船的速度. 我们将根据这个属性决定飞船每次循环时最多移动多少距离.

Settings:

Python|10 分钟学会用 python 写游戏

Ship:

Python|10 分钟学会用 python 写游戏

限制飞船的活动范围

如果玩家按住箭头的时间过长, 飞船就会消失, 那么如何使飞船抵达屏幕边缘时停止移动? 这里我们只需要修改 Ship 类中的 update 方法, 增加一个逻辑判断.

重构

这里我们主要讲 check_events()函数进行重构, 将其中部分代码分成两部分, 一部分处理 KEYDOWN 事件, 一部分处理 KEYUP 事件.

game_functions:

Python|10 分钟学会用 python 写游戏

射击

接下来添加射击功能, 使玩家按空格键时发射子弹, 子弹将在屏幕中向上穿行, 抵达屏幕后消失.

添加子弹设置

在 Settings 类中增加一些子弹的属性, 这里我们创建一个宽 3 像素, 高 15 像素的深灰色子弹. 子弹的速度比飞船稍低.

创建 Bullet 类

Python|10 分钟学会用 python 写游戏

将子弹存储到 group 中

前面定义了 Bullet 类和必要的设置后, 就可以编写代码了, 在玩家每次按空格键时都会发射一发子弹.

首先, 我们在 alien_invasion 中创建一个 group, 用于存储所有的有效子弹.

Python|10 分钟学会用 python 写游戏

开火

这里我们修改 check_keydown_events()函数, 来监听玩家按下空格键的事件. 这里还需要修改 update_screen()函数, 确保屏幕每次更新时, 都能重绘每一个子弹.

我们来看下效果:

Python|10 分钟学会用 python 写游戏

删除消失的子弹

在 alien_invasion 中删除消失的子弹.

Python|10 分钟学会用 python 写游戏

限制子弹数量

为了鼓励玩家有目标的射击, 我们规定屏幕上只能同时存在 3 颗子弹, 我们只需要在每次创建子弹前检查未消失的子弹数目是否小于 3 即可.

创建 update_bullets()函数

为了使 alien_invasion 中代码更加简单, 我们将检查子弹管理的代码, 移到 game_functions 模块中:

Python|10 分钟学会用 python 写游戏

创建 fire_bullet()函数

这里我们将发射子弹的代码移到一个独立的函数中:

Python|10 分钟学会用 python 写游戏

添加外星人, 并检测碰撞

在我们完成新的任务之前, 我们先给游戏添加一个结束游戏的快捷键 Q:

创建第一个外星人

这里和创建飞船的方法一样

Python|10 分钟学会用 python 写游戏

创建一群外星人

这里我们首先确定一行能容纳多少个外星人以及要绘制几行. 这里改动代码较多, 直接看效果:

Python|10 分钟学会用 python 写游戏

移动外星人

前面我们创建的是静态的外星人, 现在我们需要让外星人动起来. 这里我们在 Settings 类中设置外星人移动的速度, 然后通过 Alien 类中的 update 的方法来实现移动

射杀外星人

要想射杀外星人, 就必须先检测两个编组成员之间是否发生碰撞, 在游戏中, 碰撞就是游戏元素重叠在一起.

这里我们使用 sprite.groupcollide()来检测两个编组的成员之间的碰撞.

子弹击中外星人时, 需要立马知道, 并同时使被碰撞的外星人立即消失, 因此我们需要在更新子弹的位置后立即检测碰撞.

结束游戏

这里我们还需要知道何时该结束游戏, 有以下几种情况:

飞船全部被摧毁

外星人到达屏幕底部

实际效果:

Python|10 分钟学会用 python 写游戏

计分

最后我们将给游戏添加一个 Play 按钮, 用于根据需要启动游戏以及在游戏结束后重启游戏.

我们还将实现一个计分系统, 能够在玩家等级提高时加快节奏.

添加 Play 按钮

这里可以先将游戏初始化为非活动状态, 当我们点击了按钮, 就开始游戏.

由于 Pygame 中没有内置的创建按钮的方法. 因此我们可以通过创建一个 Button 类来创建一个自带标签的实心矩形.

我们通过检测鼠标发生点击后的坐标是否与我们绘制的按钮发生碰撞与否来判断是否发生了点击事件.

提高等级

为了使玩家将敌人消灭干净后能够提高游戏难度, 增加趣味性, 这里我们可以在 Settings 类中进行修改, 增加静态初始值, 和动态初始值.

记分, 等级, 剩余飞船

Python|10 分钟学会用 python 写游戏

打包成 exe 可执行文件

来源: http://www.jianshu.com/p/781162911f01

手机版python3h如何自制游戏_Python 飞机大战|10 分钟学会用 python 写游戏相关推荐

  1. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...

    原标题:10分钟学会用python写游戏!Python其实很简单! Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以在这里给各位看官们准备了高价值Python学习视频教程 ...

  2. 10分钟学会用python写游戏,实例教程

    安装pygame 本人电脑是windows 10.python3.6,pygame下载地址: https://pypi.python.org/pypi/Pygame/1.9.3 请自行下载对应pyth ...

  3. 用python编写猜成语游戏_10分钟学会用python写游戏!Python其实很简单!

    安装pygame 本人电脑是windows 10.python3.6,pygame下载地址:https://pypi.python.org/pypi/Pygame/1.9.3 请自行下载对应pytho ...

  4. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

  5. python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】

    前言 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课 ...

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

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

  7. Python小游戏之 - 飞机大战 !

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

  8. python飞机大战资料-Python之游戏开发-飞机大战

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

  9. 安卓小游戏:飞机大战

    安卓小游戏:飞机大战 前言 前面写了十二篇自定义view的博客,说实话写的还是有点无聊了,最近调整了一下,觉得还是要对开发有热情,就写了点小游戏,现在抽时间把博客也写一写,希望读者喜欢. 需求 这里就 ...

最新文章

  1. HTTP GET URL的最大长度
  2. 人工智能火热,该如何学Python呢?
  3. 扫盲丨关于区块链你需要了解的所有概念
  4. 什么人不在生死簿_地府在孙悟空划掉生死簿以后,因为什么原因不组织重写?...
  5. 应用架构步入“无服务器”时代 Serverless技术迎来新发展
  6. ES6新特性_ES6_Symbol的介绍与创建---JavaScript_ECMAScript_ES6-ES11新特性工作笔记015
  7. FM、LFM、AFM、NFM、DeepFM、 Deep Cross Network
  8. matlab 的滤波器分析,基于MATLAB仿真软件对有源滤波器进行分析研究
  9. 采用MCaaS模式 SAP为有孚网络提供基于HANA的解决方案及服务
  10. 2018 ICPC 沈阳站
  11. 什么是混合云、公有云、私有云?
  12. 财务管理----记账凭证
  13. 安全环保专题培训考试题
  14. python uniform 函数
  15. PTA(每日一题)7-66 分解素因子
  16. 微信沟通的当下,你有多久没登陆过QQ?
  17. 10_Rapidly Exploring Random Trees_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】
  18. 转:量化交易零基础入门教程之——python基本语法与变量
  19. nvd、nvm索引文件的生成
  20. Power PMAC运动控制器 —— 学习笔记1

热门文章

  1. 怎样在tableau里做渐变柱状图
  2. 屏幕和摄像头中的视频分辨率P,I,K,MP表示的含义,720p,1080p,2k,5MP
  3. 測試電容器好壞与常用单位换算
  4. 禹司凤扛鸿蒙炉,琉璃美人煞12人物结局,司凤 璇玑完满,柏麟 副宫主结局大快人心...
  5. 分享软件测试实习生的第一天~
  6. matlab导入表格画图,matlab从excel表格导入数据画图-在matlab上如何导入excel表格然后画图...
  7. 小孩上楼梯的方式的种类
  8. 有趣又实用的4款微信小程序,有了它们,APP都要靠边站!
  9. 再见华为!一位嵌入式大佬的8年励志总结
  10. InputReader读取rawEvent解析