Python实现飞机大战-第一部分(附源码、素材、超详细实现过程)
这里写目录标题
- 源码、素材链接
- 前言
- 1.1.创建Pygame窗口
- 1.2.创建设置类
- 1.3.添加玩家飞机
- 1.4.重构main.py模块
- 1.4.1.check_keyboard() 监视键鼠事件的函数
- 1.4.2.update_screen() 刷新屏幕的函数
源码、素材链接
源码、素材免费下载链接
https://download.csdn.net/download/qq_44744724/12615682
前言
最近在家闲来无事,二刷了Python基础,对于Python类的使用一直都很困惑,类和继承都是面向对象编程语言的特性之一。二刷之后对类的相关知识有了新的认识。顺便找个小项目练练手,加深对函数、类、重构的理解,最后想通过这篇博客记录一下实现过程。如果遇到什么困难或者不理解的地方欢迎滴滴我,同时程序中可能会有很多不足,望不吝赐教。
看这篇教程之前你要熟悉掌握Python基础,比如:Python基础语法、函数、类、重构等等
Pygame就无所谓,这个项目是为了练习python,并不是为了掌握pygame。
这里是整个项目的第一部分,在游戏窗口内生成玩家飞机,并控制玩家飞机上下、左右移动,同时防止飞机超出游戏窗口
首先创建一个文件夹用来存放所有py文件,文件名自拟,我命名为AirplaneWar,同时在这个文件夹内创建名为image的子文件夹
1.1.创建Pygame窗口
在Airplane文件目录下创建一个名为main.py的文件,作为主文件
import pygame def start_game(): '''创建一个屏幕对象''' # 初始化游戏窗口 pygame.init() screen = pygame.display.set_mode((480,700)) # 窗口的标题 pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com") # 背景图片地址 background_image_path = './image/bg_image.png' # 加载背景图片 background = pygame.image.load(background_image).convert() while True: '''游戏主循环''' # 响应键鼠 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 填充背景图片 screen.blit(background, (0, 0)) # 刷新窗口 pygame.display.update() start_game()
下面运行代码
如图,游戏的窗口我们已经创建完成
1.2.创建设置类
这个设置类目前只是为了控制窗口的大小。
在同一目录下创建一个名为settings.py的文件
class Settings(): '''游戏设置的类''' def __init__(self): '''游戏设置初始化''' # 游戏窗口宽度 self.screen_weight = 480 # 游戏窗口高度 self.screen_height = 700 # 背景图片的地址 self.background_image = './image/bg_image.png'
在这个类中可以看到,包含了三个内容;窗口宽度、窗口高度、背景图片的path。接下来修改main.py内的代码
import sys import pygame from settings import Settings def start_game(): '''创建一个屏幕对象''' # 初始化游戏窗口 pygame.init() # 实例化Settings类 player_settings = Settings() # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口 # 调用user_settings对象中的screen_weight和screen_height属性 screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height)) # 设置窗口的标题 pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com") # 调用player_settings中的image属性,其中有背景图片的路径 background = pygame.image.load(player_settings.background_image).convert() while True: '''游戏主循环''' for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() # 填充背景图片 screen.blit(background, (0, 0)) pygame.display.update() start_game()
首先在文件的头部引入settings.py中的
Settings类,接着实例化Settings类。
1.3.添加玩家飞机
在窗口的底部的中央添加一个玩家的飞机,首先创建player_plane.py,创建玩家飞机类
import pygame class Plane(): '''玩家飞机的类''' def __init__(self, screen, player_settings): self.screen = screen self.image = pygame.image.load('image/player.png') self.rect = self.image.get_rect() self.screen_rect = screen.get_rect() self.player_settings = player_settings # 飞机放在屏幕底部中间 self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom def blitme(self): '''绘制飞机位置''' self.screen.blit(self.image, self.rect)
修改main.py中的代码
加载图像后,使用get_rect()来获取图像的矩形边框,接着使用rect对象的属性center、centerx、centery,可让图像居中;使用属性bottom、top、left、right,可让图像屏幕边缘对齐;属性x、y,可调整图像的水平和垂直的位置。
import sys import pygame from settings import Settings from player_plane import Plane def start_game(): '''创建一个屏幕对象''' # 初始化游戏窗口 pygame.init() -- skip -- 重复的代码不再写,只提示在相应位置添加部分代码 # 实例化飞机类,对象为players_plane players_plane = Plane(screen, player_settings) while True: -- skip -- # 绘制玩家飞机 players_plane.blitme() start_game()
接着运行代码,看看效果。
添加成功了。
1.4.重构main.py模块
如果你还不知道什么是重构那么可以看这篇文章…待续
重构就是为了使代码结构清晰,逻辑更加清楚容易理解。
可以通过将main.py中实现某一功能的代码段,提取出来放到一个函数里面,然后创建一个新的py文件(比如game_functions.py)用来存放这些函数,当main.py中需要使用到这些函数时我们可以通过import game_functions调用模块中的某个函数。
1.4.1.check_keyboard() 监视键鼠事件的函数
在main.py中这个代码段实现的功能就是监视键盘鼠标,接下来创建一个函数实现同样的功能,添加到game_functions.py中。
import sys import pygame def check_keyboard(): '''监视键盘和鼠标事件''' for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit()
1.4.2.update_screen() 刷新屏幕的函数
同理,添加update_screen()到game_functions.py中。
import sys import pygame def update_screen(player_settings,players_plane, screen): '''更新窗口图像''' # 调用player_settings中的image属性,其中有背景图片的路径 background = pygame.image.load(player_settings.background_image).convert() # 填充窗口背景 screen.blit(background, (0, 0)) # 绘制玩家飞机 players_plane.blitme() # 刷新屏幕: update只刷新窗口有变动的地方,flip刷新整个窗口 pygame.display.update() # pygame.display.flip()
修改main.py
import pygame from settings import Settings from player_plane import Plane import game_functions as game_functions def start_game(): '''创建一个屏幕对象''' # 初始化游戏窗口 pygame.init() # 实例化Settings类 player_settings = Settings() # 创建一个高度为player_settings.screen_height,宽度为player_settings.screen_weight的游戏窗口 # 调用user_settings对象中的screen_weight和screen_height属性 screen = pygame.display.set_mode((player_settings.screen_weight, player_settings.screen_height)) # 设置窗口的标题 pygame.display.set_caption("飞机大战_By:小鼠标-www.zsb1999.com") # 实例化飞机类,对象为players_plane players_plane = Plane(screen, player_settings) while True: '''游戏主循环''' # 调用文件game_functions内的check_keyboard函数,是一个响应键鼠的函数 game_functions.check_keyboard() # 调用update_screen函数,更新窗口 game_functions.update_screen(player_settings,players_plane, screen) start_game()
一系列操作之后,main.py是不是更加的简洁,逻辑非常清晰。
1.5.控制飞机移动
1.5.1.左右移动
添加玩家飞时我们用到bottom和centerx控制飞机图像放置的位置,centerx用来控制图像的水平坐标。要让图像左右移动,只需要改变rect.centerx属性的值,添加一个方法change_position来修改rect.centerx的值。
为了实现用户按下键盘,飞机一直连续移动,需要给Plane类添加一个移动标志,初值为False(此时飞机不动),如果监测到键盘按下,移动标志被赋值为Ture。键盘松开,赋值为False。
player_plane.py
import pygame class Plane(): '''玩家的飞机的类''' def __init__(self, screen, player_settings): --skip-- # 是否移动标志 self.moving_right = False self.moving_left = False def change_position(self): '''根据移动标志改变飞机的位置''' if self.moving_right: self.rect.centerx += 1 if self.moving_left: self.rect.centerx -= 1
修改了Plane的类,还要修改监视键盘的函数。
game.functions
'''储存大量游戏内的函数''' import sys import pygame def check_keyboard(players_plane): '''监视键盘和鼠标事件''' --skip-- # KEYDOWN检测键盘是否按下 elif event.type == pygame.KEYDOWN: # 检测右箭头键是否按下 if event.key == pygame.K_RIGHT: players_plane.moving_right = True # 检测左箭头键是否按下 elif event.key == pygame.K_LEFT: players_plane.moving_left = True # KEYUP检测键盘是否松开 elif event.type == pygame.KEYUP: # 检测右箭头键是否松开 if event.key == pygame.K_RIGHT: players_plane.moving_right = False # 检测左箭头键是否松开 elif event.key == pygame.K_LEFT: players_plane.moving_left = False
1.5.2.上下移动
上下移动需要飞机的rect的bottom属性控制,代码的实现与上下移动基本相似,不再赘述。
player_plane.py
import pygame class Plane(): '''玩家的飞机的类''' def __init__(self, screen): --skip-- # 是否移动标志 self.moving_up = False self.moving_down = False def change_position(self): --skip-- if self.moving_up: self.rect.bottom -= 1 if self.moving_down: self.rect.bottom += 1
game.functions
在左右移动的下方添加下面的代码
# 检测上箭头键是否按下 elif event.key == pygame.K_UP: players_plane.moving_up = True #检测下箭头键是否按下 elif event.key == pygame.K_DOWN: players_plane.moving_down = True # 检测上箭头键是否松开 elif event.key == pygame.K_UP: players_plane.moving_up = False # 加测下箭头键是否松开 elif event.key == pygame.K_DOWN: players_plane.moving_down = False
运行代码,按下上下左右代码,测试一下效果。
1.6.控制玩家飞机移动速度
运行代码后,有木有感觉这飞机特喵的飞的好慢啊。接下来实现如何调整飞机的移动速度。
接下来画面转移到这里(Plane的类中的change_position方法),
注意:把下图中的self.rect.y改为self.rect.bottom
在这可以看出,键盘被按下后每次只改变1,现在修改这个值。在Settings类中添加一个player_change_speed属性,再把player_change_speed属性赋值给相应坐标的变化。这里注意,添加的属性再settings.py内,在player_plane.py中引用时,需要使用from settings import Settings 引入这个类。
player_plane.py
只需修改change_position()方法
settings.py
1.7.限制飞机移动范围
程序中的screen_rect对象可以get到游戏窗口的矩形边框,rect对象可以get到飞机图像的矩形边框。可以通过他们的属性right、left、top、bottom,来限制飞机的移动范围。
例如:我不想让飞机超出屏幕的下边缘,就可以让飞机图像的下边缘rect.bottom小于游戏窗口的下边缘screen_rect.bottom,那么我在Plane类中的change_position()方法中的if语句再加一个条件 rect.bottom < screen_rect.bottom,剩下左右和上边缘道理相同,不再赘述。
修改Plane类的change_position()方法,如下代码。
def change_position(self): '''根据移动标志改变飞机的位置''' if self.moving_right and self.rect.right < self.screen_rect.right: self.rect.centerx += self.player_settings.player_change_speed if self.moving_left and self.rect.left > 0: self.rect.centerx -= self.player_settings.player_change_speed if self.moving_up and self.rect.top > self.screen_rect.top: self.rect.bottom -= self.player_settings.player_change_speed if self.moving_down and self.rect.bottom < self.screen_rect.bottom: self.rect.bottom += self.player_settings.player_change_speed
1.8.文件目录
现附上目录图
完成第一部分后的文件目录大概是这个样子的。
- Python实现飞机大战-第二部分(附源码、素材、超详细教程)
- python 实现自动上传文件到百度网盘(附程序源码及实现过程)
- OpenStack建立实例完整过程源码详细分析(12)----依据AMQP通信架构实现消息发送机制解析之一
- OpenStack建立实例完整过程源码详细分析(13)----依据AMQP通信架构实现消息发送机制解析之二
- canny 算子实现图像边缘检测(详细过程附源码)
- [源码分享]微风IM 3.2 实现新用户注册 含详细过程
- [源码分享]微风IM 3.2 实现新用户注册 含详细过程
- canny 算子实现图像边缘检测(详细过程附源码)
- OpenStack建立实例完整过程源码详细分析(15)----依据AMQP通信架构实现消息接收机制解析之二
- OpenStack建立实例完整过程源码详细分析(14)----依据AMQP通信架构实现消息接收机制解析之一
- 贝叶斯分类器(Python实现+详细完整源码和原理)——补充原理和修正错误
- 小甲鱼python小游戏“飞机大战”源码素材
- 源码实现lamp环境搭建的详细过程
- 用源码包来实现LAMP 的详细过程
- python数据结构——选择排序、冒泡排序代码实现详细过程
- ORM,ASP.NET中ORM学习,ASP.NET中ORM学习心得,WEB2.0中ORM实现原理,Asp.net简单ORM示例源码详细讲解,Asp.net2.0:如何使用ObjectDataSource(配合ORM )(二)
- python算法--置换选择排序详细实现
- TCP/IP源码学习(54)——TCP的连接过程的实现(3)
- python算法--堆排序详细实现
- 第一部分:使用iReport制作报表的详细过程(Windows环境下)