python游戏代码示例_练习项目20:使用python制作游戏(中)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
上一篇教程,我们通过实现一个敌机由上至下的循环过程,初步了解了pygame这个模块的使用。
接下来,我们进行第二阶段,真正的实现一个通过鼠标控制的小游戏。
因为内容量相对前面的教程来说比较大,我们把第二阶段再分成两个部分来实现。
第一部分:实现配置文件和游戏对象模块;
第二部分:实现游戏主程序部分。
一、配置文件(config.ini)
在配置文件中,我们需要作如下配置:
游戏图片:图片的名称
游戏窗口:宽、高、背景色(红\蓝\绿)、边缘填充、是否全屏、字体尺寸
游戏速度:落下速度(敌方)、移动速度(己方)、速度增量(敌方)
游戏关卡:敌机数量
飞机实体:顶部、侧边
说明:飞机实体设置,是用于对己方飞机rect特性尺寸的调整,详见Plane类的代码。
配置文件内容:
[Image]
plane = images/plane.png
enemy = images/enemy.png
welcome = images/welcome.png
[Screen]
width = 360
height = 640
red = 255
blue = 255
green = 255
margin = 5
full_screen = 0
font_size = 24
[Speed]
drop_speed = 1
move_speed = 2
speed_increase = 1
[Level]
pre_level = 5
[Plane_padding]
top = 15
side = 15
二、游戏对象模块(objects.py)
1、导入模块并解析配置文件
在这个模块的开始,我们需要先导入需要使用的其它模块,并且对配置文件进行解析,方便在游戏对象类中使用配置数据。
示例代码:
import configparser # 导入配置文件解析模块
import pygame
from random import randrange
file = 'config.ini' # 配置文件路径
config = configparser.ConfigParser() # 创建解析器对象
config.read(file, encoding='UTF-8') # 读取并解析配置文件
2、创建抽象类
在游戏对象模块中,我们只需要创建Enemy(敌方飞机)和Plane(己方飞机)两个游戏对象类。
不过,在这两个类中,会有很多相同的代码。
我们可以把这些代码抽取出来,单独写成一个类。
示例代码:
class GameSprite(pygame.sprite.Sprite): # 定义游戏对象的抽象类
def __init__(self, image): # 定义构造方法(需要添加图片参数)
pygame.sprite.Sprite.__init__(self) # 重载超类的构造方法
self.image = pygame.image.load(image).convert_alpha() # 创建image特性存储Surface对象
self.rect = self.image.get_rect() # 通过image创建rect特性
screen = pygame.display.get_surface() # 获取屏幕外观
shrink = -config.getint('Screen', 'margin') # 获取配置文件数值
self.area = screen.get_rect().inflate(shrink, shrink) # 获取屏幕外观填充后的区域(飞机的活动区域)
3、创建敌方飞机对象类
敌方飞机我们要考虑以下内容,包括:
加载后的初始位置;
每次移出屏幕下方后重置的位置;
每一帧刷新后位置(受速度影响);
每一帧刷新时,判断敌方飞机是否从完全移出屏幕下边缘。
示例代码:
class Enemy(GameSprite): # 定义敌方飞机对象类
def __init__(self, speed): # 定义构造方法(需要添加速度参数)
GameSprite.__init__(self, config.get('Image', 'enemy')) # 重载超类构造方法(参数中传入图片)
self.speed = speed # 为敌方飞机设置速度特性
self.reset() # 重置敌方飞机位置
def reset(self): # 定义重置位置的方法
x = randrange(self.area.left, self.area.right) # 从活动范围中获取x轴的随机位置
self.rect.midbottom = x, 0 # 设置游戏对象底部中心位置
def update(self): # 定义刷新位置的方法
self.rect.top += self.speed # 设置每帧向下移动的距离
self.landed = self.rect.top >= self.area.bottom # 获取敌机是否已从屏幕下方完全移出
4、创建己方飞机对象类
己方飞机我们要考虑以下内容,包括:
垂直方向的初始位置;
水平方向可移动范围;
每一帧刷新后的位置(受鼠标指针位置和屏幕可活动区域影响);
触碰到敌方飞机的处理。
示例代码:
class Plane(GameSprite): # 定义己方飞机对象类
def __init__(self): # 定义构造方法
GameSprite.__init__(self, config.get('Image', 'plane')) # 重载超类构造方法(参数中传入图片)
self.rect.bottom = self.area.bottom # 设置游戏对象垂直方向底部初始位置在屏幕底部
self.pad_top = config.getint('Plane_padding', 'top') # 获取配置文件中游戏对象顶部填充数值
self.pad_side = config.getint('Plane_padding', 'side') # 获取配置文件中游戏对象两侧填充数值
def update(self): # 定义刷新位置的方法
self.rect.centerx = pygame.mouse.get_pos()[0] # 设置游戏对象水平中心位置为鼠标指针的x轴位置
self.rect = self.rect.clamp(self.area) # 设置游戏对象水平方向可活动区域为屏幕外观填充后的区域
def touches(self, other): # 设置触碰到其它游戏对象的方法
bounds = self.rect.inflate(-self.pad_side, -self.pad_top) # 获取游戏对象填充后的边界范围(顶部与两侧)
bounds.bottom = self.rect.bottom # 设置边界范围的底部为游戏对象的底部
return bounds.colliderect(other.rect) # 返回游戏对象边界是否触碰到其它游戏对象
在完成以上内容之后,我们就可以着手主程序模块的编写了。
在编写之前,我们先预先了解一下整个程序的结构。
我们已经完成了整个程序左侧的部分,在下一篇教程中,我们一起完成右侧的部分。
在这里,我们先对右侧部分内容做一些整体上的理解,这样在编写代码的时候才能有一个清晰的逻辑。
1、State类。
在游戏中有两个状态,我们来看一下状态的类型和产生,分别是:
暂停状态:进入游戏、进入关卡以及游戏结束时。
运行状态:游戏进行时。
2、Level类。
这个类是运行状态,主要是对关卡的处理,包括控制游戏的速度、创建游戏对象、判断游戏结束或者进入下一关以及关卡屏幕的显示方案等。
3、Paused类。
在游戏中会有多个暂停状态,包括:
打开游戏时;
显示信息时;
游戏过关时;
游戏结束时。
每一个暂停的状态,都可以点击继续,都要显示背景颜色、图片以及文字。
所以,我们在Paused类中将多个暂停状态共有的内容进行抽象处理。
4、Paused类的子类。
Paused类的子类包含以下几个:
Infol类:游戏信息
StartUp类:打开游戏
LevelCleared类:游戏过关
GameOver类:游戏结束
这些子类只需要定义显示的图片以及文字内容,或者其它独有的功能。
5、Game类。
进行游戏初始化以及定义游戏运行的方法。
综上所述,在游戏主程序模块中,代码的结构如下所示。
示例代码:(planegame.py)
import pygame, sys
from pygame.locals import *
import objects # 导入游戏对象模块
import configparser
file = 'config.ini'
config = configparser.ConfigParser()
config.read(file, encoding='UTF-8')
class State:
"""泛型游戏状态类,可以处理事件和屏幕显示。"""
def handle(self, event):
"""处理退出事件。"""
pass
def paused_display(self, screen):
"""暂停时显示。"""
pass
def display(self, screen):
"""关卡中显示。"""
pass
class Level(State):
"""游戏等级,用于计算共有多少敌机落下,移动游戏对象以及其他与游戏相关的逻辑任务。"""
def __init__(self, number=1):
"""初始化关卡的等级和游戏对象。"""
pass
def update(self, game):
"""关卡运行,并进行游戏结束或通过关卡的处理。"""
pass
def display(self, screen):
"""关卡运行时的屏幕显示。"""
pass
class Paused(State):
"""暂停游戏的状态,按任意键或点击鼠标退出暂停状态。"""
def handle(self, event):
"""处理按任意键继续游戏。"""
pass
def update(self, game):
"""按任意键时进入下一个游戏状态。"""
pass
def paused_display(self, screen):
"""暂停时显示。"""
pass
class Info(Paused):
"""游戏信息。"""
pass
class StartUp(Paused):
"""进入游戏。"""
pass
class LevelCleared(Paused):
"""游戏过关。"""
def __init__(self, number):
"""过关信息。"""
pass
def next_state(self):
"""创建下一关卡。"""
pass
class GameOver(Paused):
"""游戏结束。"""
pass
class Game:
"""负责主事件循环的游戏对象,完成在不同状态间切换的任务。"""
def __init__(self):
"""初始化。"""
pass
def run(self):
"""运行游戏。"""
pass
if __name__ == '__main__':
game = Game()
game.run()
本节练习源代码:【点此下载】
python游戏代码示例_练习项目20:使用python制作游戏(中)相关推荐
- python游戏代码示例_用Python和Pygame写游戏-从入门到精通(Sprite篇)
这又是Pygame教程系列的一个--OVA篇,类似于py2exe篇一样,额外写的,也许不是pygame游戏开发必须的东西,但是知道了绝对大有裨益.因此友情大放送~ 看pygame模块介绍的时候,细心的 ...
- python游戏代码示例_代码实例1:python 小人打架游戏
中断了几年的python学习最近被重新拾起来了,实在是因为工作上需要用到的地方太多.不立flag了,记录学习成果,慢慢更新吧. 小人打架程序代码如下: ------------------------ ...
- 上海python招聘微信群_如何用20行Python代码打造一个微信群聊助手?
今天要教大家一个黑科技,20行代码实现自己定制的微信群聊助手,可以用来活跃群气氛,好多群主创建完群后,拉完一群人,之后就一片寂静,有个群聊助手,就可以帮忙活跃群里气氛,通过今天在自己的微信上有一大批好 ...
- 12个python编程代码_Python大牛私藏的20个python代码,短小精悍,用处无穷
本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 本文来自腾讯云 作者:龙哥 当今python编程语言的潮流已经成为不可阻挡的趋势, ...
- 动漫的python语言代码大全_下载动漫壁纸-Python代码
本帖最后由 我心她有丶 于 2020-4-16 19:28 编辑 前段时间在论坛找到一个下载动漫壁纸的软件,还挺好用的,这几天突然用一下,下载不出图片,下载的一片白,然后分析了下他的软件,得到了一个地 ...
- python怎么反转单链表_单链表反转python实现代码示例
单链表的反转可以使用循环,也可以使用递归的方式 1.循环反转单链表 循环的方法中,使用pre指向前一个结点,cur指向当前结点,每次把cur->next指向pre即可. 代码: class Li ...
- Python面向对象基础示例_创建对象
Python面向对象基础示例_创建对象 python是面向对象的语言,你可以很轻松的创建一个类和对象.本书代码源自<<Python 3 Object-Oriented Programmin ...
- python自动化办公实例展示_原创的20个Python自动化案例,一口一个,高效办公!...
=== 欢迎关注我的公众号:早起Python === 导读 大家好,自从4月底发布第一篇Python办公自动化办公系列文章以来,目前已经马不停蹄的更新了20个案例,累计阅读超10W+,为了方便大家阅读 ...
- python入门代码示例-总算知道python入门代码示例
Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.作为今年来越来越流行的语言,我们该如何学习或者转行学习Python呢,这里小迹为大家介绍如何入门学习Python.以下是小编为你整理 ...
最新文章
- 管理系统中的计算机应用信息可靠性,计算机信息处理系统的可靠性研究
- 用bert来训练quoras question pairs的代码仓
- Android拖拽详解
- 机器学习资源和路线图
- 字符编码转换_进制转换(GB2312,GBK,JNI,HexTOStr)
- 软件开发的MVC构架
- delphi tclientsocket接收不到返回数据_RS—485中教你主站发送报文结构、从站返回报文结构?系列11...
- 【LeetCode】3月28日打卡-Day13
- 190829课堂母版与子版
- tornado web高级开发项目
- java 蓝桥杯算法训练 快速排序
- 开了个股票模拟仓来玩玩
- linux跳转乌班图服务器,Ubuntu18.04连接Linux服务器与文件传输
- 腾讯地图api修改信息窗口样式_ThingJS通过地图的信息窗口展示常见数据
- PHP开源软件《个人管理系统》-希望大家一起来开发
- Python模块:bisect二分算法模块
- JSON.parse和eval的区别
- 音乐播放小窗口html,jQuery+html5迷你网页音乐播放器代码
- Web测试常用测试点
- 计算机机房通风,机房为什么要装通风系统?
热门文章
- linux虚拟实验服务,Linux虚拟服务器(LVS)实验文档PDF
- c#erp项目源码 mysql_Jsp+Ssm+Mysql实现图书馆预约占座管理系统项目源码(可带论文文档)...
- php+签到+二进制方式,PHP开发中如何实现二进制搜索?
- 密度图的密度估计_基于核密度的宝鸡地名文化特征与时空分布研究
- qt checkbox 选中事件_丽声事件 | 十堰市第五届全国青少儿播音主持等级考试圆满落幕...
- html自动轮播计时器不准,用jQuery写的图片轮播为何停止定时器只能停止一次?...
- 【java】带时区的时间格式化
- 【若依(ruoyi)】按钮样式
- 【SSL】java keytool工具创建自己的(localhost)(JKS)证书库
- 鸿蒙系统电视k歌,华为电视怎么k歌?看完两分钟快速开启K歌模式