Python 项目:外星人入侵----第一部分
外星人入侵
1.规划项目
玩家控制着一艘最初出现在屏幕底部中央的飞船,玩家可以使用箭头键左右移动飞船,还可以使用空格键进行射击,游戏开始时,一群外星人出现在天空中,他们在屏幕中下移动。玩家任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,他们移动的速度更快。只要有外星人玩家的飞船或到达了屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。
2.安装pygame
使用pip安装pygame包
- Linux系统安装
- OSX系统中安装
- Windows系统中安装
3.开始游戏项目
3.1 创建Pygame窗口以及响应用户输入
- 导入模块sys和pygame,模块pygame包含开发游戏所需的功能,使用模块sys来退出游戏
- pygame.init()来初始化背景设置
- pygame.display.set_mode()来创建一个名为screen的显示窗口,实参(1200,800)是一个元组,指定了游戏窗口的尺寸大小。
- 对象screen是一个surface(是屏幕的一部分),用于显示游戏元素,每个元素都是一个surface如外星人或飞船
- pygame.display.set_palette()设置当前窗口的标题栏
- while循环,包含一个事件循环以及管理屏幕更新代码
- 访问pygame检测到的事件,使用方法pygame.event.get(),从队列中获取事件,所有键盘和鼠标事件都使用for循环运行。用if语句来检测或响应特定事件。
- 退出时调用sys.exit()来退出游戏
- 调用pygame.display.flip(),命令pygame让最近绘制的屏幕可见,不断更新屏幕,以显示元素的新位置,并在原来的位置影藏元素,从而营造平滑移动的效果。简而言之更新整个待显示的 Surface 对象到屏幕上。
# 模块sys用于退出游戏
import sys
import pygame
def run_game():
'''初始化游戏并创建一个屏幕对象'''
# 初始化背景设置
pygame.init()
screen = pygame.display.set_mode((1200,800)) #实参(1200,800)是一个元组,指定了游戏窗口的尺寸
pygame.display.set_caption("小子,你愁啥啊")
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
for event in pygame.event.get():
if event.type ==pygame.QUIT:
sys.exit()
pygame.display.flip()
run_game()
运行:
3.2 设置背景色
- 创建一个颜色,存储到变量中。
- 调用screen.fill用背景色填充屏幕,这个方法只接受一个实参:一种颜色
- 再pygame中,颜色是以RGB指定的,由红、绿、蓝组成的,每个值取值范围为:0~255,通过组合,可创建1600万种颜色。
# 模块sys用于退出游戏
import sys
import pygame
def run_game():
'''初始化游戏并创建一个屏幕对象'''
# 初始化背景设置
pygame.init()
screen = pygame.display.set_mode((1200,800)) #实参(1200,800)是一个元组,指定了游戏窗口的尺寸
pygame.display.set_caption("小子,你愁啥啊")
#设置背景色
'''参数:红、绿、蓝,颜色是以RGB指定的,范围:0~255'''
color = (0,0,255)
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
for event in pygame.event.get():
if event.type ==pygame.QUIT:
sys.exit()
'''每次循环时都重绘屏幕'''
#调用方法screen.fill()用背景色填充屏幕,这个方法只接受一个实参:一种颜色
screen.fill(color)
'''让最近绘制的屏幕可见'''
pygame.display.flip()
run_game()
运行:
3.3 创建设置类
- 添加新功能时,也引入一些新设置,编写一个名为settings的模块,包含settings的类,用于将所有设置存储在一个地方,以免在代码中添加设置。从而传递一个设置对象,让函数调用更简单,修改游戏时,只需修改settings.py中的值。
#settings.py
class Settings():
'''存储《外星人入侵》的所有设置的类'''
def __init__(self):
'''初始化游戏设置'''
self.screen_width = 1200 # 屏幕设置尺寸
self.screen_height = 800
self.color = (230,230,230) # 屏幕背景色
#window.py
# 模块sys用于退出游戏
import sys
import pygame
from settings import Settings
def run_game():
# 初始化pygame、设置和屏幕对象
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("小子,你瞅啥啊")
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
for event in pygame.event.get():
if event.type ==pygame.QUIT:
sys.exit()
'''每次循环时都重绘屏幕'''
#调用方法screen.fill()用背景色填充屏幕,这个方法只接受一个实参:一种颜色
screen.fill(ai_settings.color)
'''让最近绘制的屏幕可见'''
pygame.display.flip()
run_game()
运行:
4.添加飞船图像
为在屏幕上绘制玩家的飞船,将加载一副图像,再使用Pygame方法blit()绘制它
4.1创建Ship()类
- pygame默认加载位图(.bmp)
- 初始化飞船的属性
- 调用pygame.image.load(),加载图像,返回一个表示飞船的surface。
- 使用get_rect()获取相应surface的属性rect(矩形)
- pygame的效率很高原因:能够像处理矩形(rect对象)一样处理游戏元素。
- 在处理rect对象时,矩形四角和中心的x,y坐标,指定矩形的位置。
- 要将游戏元素居中,可设置相应rect对象的属性center、centerx或centery,要让游戏元素与屏幕边缘对齐,可使用属性 top 、 bottom 、 left 或 right ;
- 在 Pygame 中,原点 (0, 0) 位于屏幕左上角,向右下方移动时,坐标值将增大。在 1200×800 的屏幕上,原点位于左上角,而右下角的坐标为 (1200, 800) 。
# ship.py
# 创建一个名为ship的模块,包含Ship类,负责管理飞船的大部分行为
import pygame
class Ship():
def __init__(self,screen):
'''初始化飞船并设置其初始位置'''
self.screen = screen
# 加载飞船图像并获取其它外接矩形
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
#将每艘新飞船放在屏幕底部中央
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
'''在指定位置绘制飞船'''
self.screen.blit(self.image,self.rect)
运行:
4.2 添加飞船图像
- self.screen.blit()通过访问图片及图片矩形位置,来显示在屏幕上。
# 模块sys用于退出游戏
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
'''初始化游戏并创建一个屏幕对象'''
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("小子,你瞅啥啊")
'''创建一艘飞船'''
ship = Ship(screen)
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
for event in pygame.event.get():
if event.type ==pygame.QUIT:
sys.exit()
'''每次循环时都重绘屏幕'''
#调用方法screen.fill()用背景色填充屏幕,这个方法只接受一个实参:一种颜色
screen.fill(ai_settings.bg_color)
ship.blitme()
'''让最近绘制的屏幕可见'''
pygame.display.flip()
run_game()
运行:
5.重构:模块game_functions
- 重构旨在简化既有代码的结构,使其更容易扩展。
- 创建game_functions模块,它将存储大量让游戏运行的函数,通过创建模块game_functions,可避免主运行模块alien_inbasion.py太长,使其逻辑更容易理解
5.1函数check_events()
- 把管理事件的代码移到一个名为 check_events() 的函数中,以简化 run_game() 并隔离事件管理循环。
- 通过隔离事件循环,可将事件管理与游戏的其他方面(如更新屏幕)分离。
- 函数 check_events() 不需要任何形参,其函数体复制了 alien_invasion.py 的事件循环。
- 在主程序文件中,不再需要直接导入 sys ,因为当前只在模块 game_functions 中使用了它。出于简化的目的,我们给导入的模块 game_functions 指定了别名 gf。
# game_functions.py
# 模块sys用于退出游戏
import sys
import pygame
def check_events():
'''响应按键和鼠标事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# alien_inbasion.py
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
'''初始化游戏并创建一个屏幕对象'''
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("小子,你瞅啥啊")
'''创建一艘飞船'''
ship = Ship(screen)
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
gf.check_events()
'''每次循环时都重绘屏幕'''
#调用方法screen.fill()用背景色填充屏幕,这个方法只接受一个实参:一种颜色
screen.fill(ai_settings.bg_color)
ship.blitme()
'''让最近绘制的屏幕可见'''
pygame.display.flip()
run_game()
运行:
5.2函数update_screen()
- 为进一步简化run_game(),将更新屏幕的代码移动到update_screen()的函数中,并将这个函数放在game_functions.py中
# game_functions.py
# 模块sys用于退出游戏
import sys
import pygame
def check_events():
'''响应按键和鼠标事件'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings,screen,ship):
'''更新屏幕上的图像'''
# 每次循环时都重绘屏幕
screen.fill(ai_settings.bg_color)
# 调用方法screen.fill()用背景色填充屏幕,这个方法只接受一个实参:一种颜色
ship.blitme()
# 让最近绘制的屏幕可见
pygame.display.flip()
# alien_inbasion.py
import pygame
from settings import Settings
from ship import Ship
import game_functions as gf
def run_game():
'''初始化游戏并创建一个屏幕对象'''
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("小子,你瞅啥啊")
'''创建一艘飞船'''
ship = Ship(screen)
'''开始游戏的主循环'''
while True:
'''监视键盘和鼠标事件'''
gf.check_events()
'''每次循环时都重绘屏幕'''
gf.update_screen(ai_settings,screen,ship)
run_game()
运行:
Python 项目:外星人入侵----第一部分的更多相关文章
- Python 项目实践一(外星人入侵)第一篇
python断断续续的学了一段实践,基础课程终于看完了,现在跟着做三个小项目,第一个是外星人入侵的小游戏: 一 Pygame pygame 是一组功能强大而有趣的模块,可用于管理图形,动画乃至声音,让 ...
- 通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数--菜单功能'menufile
通过游戏学python 3.6 第一季 第九章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁 ...
- 通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账号--锁定次数
通过游戏学python 3.6 第一季 第八章 实例项目 猜数字游戏--核心代码--猜测次数--随机函数和屏蔽错误代码--优化代码及注释--简单账号密码登陆--账号的注册查询和密码的找回修改--锁定账 ...
- 通过游戏学python 3.6 第一季 第二章 实例项目 猜数字游戏--核心代码--猜测次数 可复制直接使用 娱乐 可封装 函数
猜数字游戏--核心代码--猜测次数 #猜数字--核心代码--猜测次数 number=33 amount=3 count=0 while count<=amount: conversion ...
- 以正确的方式开源 Python 项目
以正确的方式开源 Python 项目 大多数Python开发者至少都写过一个像工具.脚本.库或框架等对其他人也有用的工具.我写这篇文章的目的是让现有Python代码的开源过程尽可能清 晰和无痛.我不是 ...
- 创建成功的Python项目
创建成功的Python项目 前端开发工具技巧介绍—Sublime篇 SEO在网页制作中的应用 观察者模式 使用D3制作图表 英文原文:Create successful Python projects ...
- 精选 TOP45 值得学习的Python项目
精选 TOP45 值得学习的Python项目 [导读]热门资源博客 Mybridge AI 比较了 18000 个关于 Python 的项目,并从中精选出 45 个最具竞争力的项目.我们进行了翻译,在 ...
- 这10个Python项目超有趣!
前言: Python可谓是现在很多人正在学或者想学的一个脚本语言了,提到学习自然就少不了拿项目练手,可是一般的项目根本提不起兴趣嘛,这10个项目可是非常有趣的,不信你看看. [Python 图片转字符 ...
- python项目实现配置统一管理的方法
一个比较大的项目总是会涉及到很多的参数,最好的方法就是在一个地方统一管理这些参数.最近看了不少的python项目,总结了两种很有意思的配置管理方法. 第一种 基于easydict实现的配置管理 首先需 ...
- Docker如何部署Python项目
Docker 部署Python项目 作者:白宁超 2019年5月24日09:09:00 导读: 软件开发最大的麻烦事之一就是环境配置,操作系统设置,各种库和组件的安装.只有它们都正确,软件才能运行.如 ...
随机推荐
- mysqli语句的用法
改用了PHP7的环境后 mysql语句好像就不能用了.. 有点懵逼 就写一下该怎么用以免遗忘 ======= 1 链接数据库 $link=mysqli_connect('127.0.0.1:xxxx' ...
- Windows下Zookeeper安装使用
Windows下Zookeeper安装使用 ZooKeeper是一种分布式协调服务,用于管理大型主机. 在分布式环境中协调和管理服务是一个复杂的过程. ZooKeeper通过其简单的架构和API解决了 ...
- NET 实现 Cron 定时任务执行,告别第三方组件
原文连接: (96条消息) NET 实现 Cron 定时任务执行,告别第三方组件_.net 定时任务_Phil Arist的博客-CSDN博客 代码: using System.Globalizati ...
- loadrunner添加/清除 cookies
web_add_cookie("reloadCount=1;domain={Host}"); 清除 cookies web_cleanup_cookies():
- loadrunner入门(关联)
左右边界:提取第一个id web_reg_save_param_ex( "ParamName=Id", "LB=//OK[ ...
- cider 二面
cider 二面 1.祖传自我介绍 2.当前BLF外卖业务缺点是什么? 产品单一 : 跟竞品比较起来,产品单一导致用户流量很少 3.QLExpress二次开发的原因 流程对接 提升性能 后台对接 4. ...
- LaTeX in 24 Hours - 1. Introduction
文章目录 1.1 What is LaTeX? 1.2 Why LaTeX Over Other Word Processors 1.3 How to Prepare a LaTeX Input Fi ...
- PHP文件及运行(适合PHP初学者)
PHP文件可包含HTML.JavaScript代码和 PHP代码,换句话说PHP 代码可以嵌入HTML文档.PHP文件名以php为后缀. PHP代码以"<?php"开头,以& ...
- gitlab-ce安装
# vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=Gitlab CE Repository baseurl=https://mirrors. ...
- ububtu20.04下MySQL的安装及使用Navicat连接数据库
ububtu20.04下最新版本MySQL的安装及使用Navicat连接数据库 一.MySQL的安装 先通过如下命令更新软件包: sudo apt-get update 再通过如下命令安装MySQL: ...