基于Python实现原创程序猿乘风破浪小游戏
作者:神奇代码在哪里_ 发布时间:2021-03-09 01:41:51
一、游戏展示
所谓:开局一张图,后面全靠编。先放图片、动画展示一波。
游戏玩法很简单,按空格猴子↑跳起来,躲开巨浪袭击,时间越长得分越高,碰到巨浪游戏结束统计得分。
游戏展示画面
二、游戏逻辑
为了通俗易懂,这里就不用代码结构的方式解释。游戏大致可以分为四大部分,分别为:
游戏背景
1、天空背景。用多条蓝色横线点缀的白色天空,使用Python代码让天空背景从右到左不停的移动,从而制造猴子向右移动的假象。
天空背景
背景精灵代码:
class Background(GameSprite):
"""游戏背景精灵"""
def __init__(self,image_path, is_alt=False):
# 1.调用父类方法实现精灵的创建(image/rect/speed)
super().__init__(image_path)
# 2.判断是否是交替图像,如果是,需要设置初始位置
if is_alt is True:
self.rect.x = self.rect.width
else:
self.rect.x = 0
def update(self):
# 1.调用父类的方法实现
super().update()
# 2.判断是否移出屏幕,如果移出屏幕,将图像设置到屏幕的上方
if self.rect.x <= -SCREEN_RECT.width:
self.rect.x = self.rect.width
2、海洋背景。海洋背景使用了内层海洋和外层海洋两张背景图片,同时让他们的移动速度与天空背景不一致,两个内层与外层海洋之间的移动速度也不一致,从而制造游戏的立体层次感,让2D游戏增加3D的立体感觉。
def __create_sprites(self):
"""创建背景精灵和精灵组"""
# 天空背景
bg1 = Background("./images/background_16_9.png", False)
bg2 = Background("./images/background_16_9.png", True)
self.back_group = pygame.sprite.Group(bg1, bg2)
# 内层海洋背景
sea_bg_1 = Background("./images/sea_bg_1_16_9.png", False)
sea_bg_2 = Background("./images/sea_bg_1_16_9.png", True)
#移动速度
sea_bg_1.speed = 2
sea_bg_2.speed = 2
sea_bg_1.rect.bottom = SCREEN_RECT.height
sea_bg_2.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_1 = pygame.sprite.Group(sea_bg_1, sea_bg_2)
# 外层海洋背景
sea_bg_3 = Background("./images/sea_bg_2_16_9.png", False)
sea_bg_4 = Background("./images/sea_bg_2_16_9.png", True)
# 移动速度
sea_bg_3.speed = 3
sea_bg_4.speed = 3
sea_bg_3.rect.bottom = SCREEN_RECT.height
sea_bg_4.rect.bottom = SCREEN_RECT.height
self.sea_bg_ground_2 = pygame.sprite.Group(sea_bg_3, sea_bg_4)
猴子游戏精灵(玩家)
1、让猴子精灵上下跳动。使用Python监听键盘时间,当按下键盘空格键时,给猴子精灵一个向上(y轴负值)的速度,当键盘空格键没按下时给猴子精灵一个向下(y轴正值)的速度,这样就可以实现猴子精灵的上下跳动。
主要代码如下:
# 使用键盘提供的方法获取键盘按键 - 按键元组
keys_pressed = pygame.key.get_pressed()
# 判断用户按下键盘空格键
if keys_pressed[pygame.K_SPACE]:
# 跳起
self.man.speed = -10
else:
# 下降
self.man.speed = 10
2、让猴子不能飞出游戏屏幕。使用Python代码监控猴子的位置,当猴子y轴的值小于0(碰到屏幕上边缘)时y轴的值重置为0,当猴子y轴的值大于360(碰到屏幕下边缘)时y轴重置为360。
主要代码如下:
def update(self):
# 猴子在水平方向移动
self.rect.y += self.speed
# 控制猴子不能移出屏幕
if self.rect.y < 0:
self.rect.y = 0
elif self.rect.bottom > self.bottom_to_ground:
self.rect.bottom = self.bottom_to_ground
3、让猴子置与内层海洋和外层海洋之间,增加游戏层次感。在调用Pygame刷新界面函数时,先调用内层海洋刷新函数,再调用猴子精灵刷新函数,最后在调用外层海洋刷新函数,既可以实现预期效果。
主要代码如下:
def __update_sprites(self):
"""刷新各个精灵组"""
# 先刷新内层海洋
self.sea_bg_ground_1.update()
self.sea_bg_ground_1.draw(self.screen)
# 再刷新猴子
self.man_group.update()
self.man_group.draw(self.screen)
# 最后刷新外层海洋
self.sea_bg_ground_2.update()
self.sea_bg_ground_2.draw(self.screen)
巨浪游戏精力(敌人)
1、每个一段时间生成一股巨浪,巨浪由右到左出现,速度有快有慢。首先继承pygame.sprite.Sprite创建巨浪精灵类,使其具有速度speed等属性。
class Wave(GameSprite):
"""海浪精灵"""
def __init__(self):
# 1.调用父类方法,创建海浪精灵,同时指定海浪图片
super().__init__("./images/wave.png")
# 2.指定海浪的初始随机速度
self.speed = random.randint(2, 4)
# 3.指定海浪的初始随机位置
self.rect.x = SCREEN_RECT.width
self.rect.bottom = SCREEN_RECT.height
然后创建Pygame自定义事件CREATE_WAVE_EVENT。
# 创建海浪的定时器事件常量
CREATE_WAVE_EVENT = pygame.USEREVENT+1
同时使用pygame.time.set_timer创建定时器,每3秒触发一次该事件。
# 4.设置定时器事件——每3秒创建一次海浪
pygame.time.set_timer(CREATE_WAVE_EVENT, 3000)
最后,若事件监听处理函数发现该事件后,创建一个巨浪精灵并加入精灵组。
elif event.type == CREATE_WAVE_EVENT:
# 创建海浪精灵
wave = Wave()
# 将海浪精灵添加到海浪精灵组
self.wave_group.add(wave)
2、巨浪与猴子碰撞后结束游戏。每帧使用def __check_collide(self)检测猴子精灵与巨浪精灵组是否出现碰撞,若碰撞了就结束本回合游戏。
碰撞检测代码如下:
def __check_collide(self):
# 1.撞到海浪
waves = pygame.sprite.spritecollide(self.man, self.wave_group, True)
# 2.判断碰撞列表长度
if len(waves) > 0:
# 该回合游戏结束,显示菜单
self.menu_sprite.display = True
self.game_state = 0
3、巨浪移出左屏幕后删除该巨浪。为了节省内存,当没有被碰到的巨浪从右至左移出屏幕左边缘的时候应该删除该巨浪精灵。可以每帧判断巨浪的右侧是否小于屏幕左边缘实现该删除操作。
定时器和得分
1、自定义定时器事件,每个1秒数字减1。游戏默认游玩时间为30秒,游戏开始后便开始倒数,右上角开始30,29,28更新数字。和创建巨浪类似,可以先创建一个倒数事件,然后使用定时器每秒触发,最后在监听事件函数中执行刷新数字操作。
主要代码如下:
创建自定义事件CREATE_I_EVENT。
# 创建游戏倒计时的定时器常量
CREATE_I_EVENT = pygame.USEREVENT+2
同时使用pygame.time.set_timer创建定时器,每1秒触发一次该事件。
# 5.设置定时器事件——倒计时每1秒触发一次
pygame.time.set_timer(CREATE_I_EVENT, 1000)
最后,若事件监听处理函数发现该事件后,倒计时减1。
elif event.type == CREATE_I_EVENT:
# 倒计时减1秒
self.countdown_sprite.start_time = self.countdown_sprite.start_time - 1
2、每个一秒加十分。和倒计时一样,只是这里是每秒加十分。
elif event.type == CREATE_I_EVENT:
# 每过1秒加十分
self.score_sprite.score = self.score_sprite.score + 10
3、游戏重新开始时,重置定时器及得分。如果用户点击重新开始游戏,则重置相关属性重新开始游戏。
来源:https://blog.csdn.net/qq616491978/article/details/126769079
猜你喜欢
- meta是html语言head区的一个辅助性标签。几乎所有的网页里,我们可以看到类似下面这段的html代码:<head> <meta&nbs
- 1 递归函数的特点特点一个函数 内部 调用自己函数内部可以调用其他函数,当然在函数内部也可以调用自己代码特点函数内部的 代码 是相同的,只是
- 输出用print加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下:>&g
- 我的测试环境是2000sever ie6.0+sp4 MYIE1.31 (成功通过测试)关闭窗口的途径常用4种:1.双击左上角图标2.直接双
- 神经网络模型一般用来做分类,回归预测模型不常见,本文基于一个用来分类的BP神经网络,对它进行修改,实现了一个回归模型,用来做室内定位。模型主
- Windows操作系统支持Python的Python2版本和Python3版本,下载安装时要根据windows的操作系统来选择对应的Pyth
- 一、概述 对象是Oracle8i以上版本中的一个新的特性,对象实际是对一组数据和操作的封装,对象的抽象就是类。在面向对象技术中,对象涉及到以
- 今天弄了一天,总算把win2003下的问题给解决了, LoadModule php5_module E:\server\php528\php
- 在Python多线程中如何创建一个线程对象如果你要创建一个线程对象,很简单,只要你的类继承threading.Thread,然后在__ini
- Django默认支持Session,并且默认是将Session数据存储在数据库中的修改session存取放在数据库中SESSION_ENGI
- 有什么办法可以列出数据视图吗?有,假设当前数据库为flashdays,则我们可用下列代码列出它的数据视图:pubDatabase
- 什么是LSTM1、LSTM的结构我们可以看出,在n时刻,LSTM的输入有三个:当前时刻网络的输入值Xt;上一时刻LSTM的输出值ht-1;上
- 一、简介Python 内置了 requests 模块,该模块主要用来发送 HTTP 请求,requests 模块比 urllib
- 工作闲余,除抱有浓厚兴趣领域,我很不喜欢看些晦涩难懂的文字,于是想像茶余饭后的闲聊,随谈点话题。一次和一朋友吃饭聊天,随便聊到了他最近做的一
- 最近在学一些基础的算法,发现我的数学功底太差劲了,特别是大学的这一部分,概率论、线性代数、高数等等,这些大学学的我是忘得一干二净(我当时学的
- 运行环境:IIS脚本语言:VBScript数据库:Access/SQL Server数据库语言:SQL1.概要:不论是在论坛,还是新闻系统,
- 一、爬取豆瓣热评该程序进行爬取豆瓣热评,将爬取的评论(json文件)保存到与该python文件同一级目录 * 意需要下载这几个库:reques
- 一,红绿灯揭示板案例思路1. 创建Traffic_light红绿灯类(1)静态属性 :<1> 绿灯时间,<2> 黄灯
- 通过使用bootstrap框架,并配合Django自带的Paginator分页组件即可实现简单的分页效果。1.创建MyWeb项目python
- 前言分水岭算法是用于分割的经典算法,在提取图像中粘连或重叠的对象时特别有用,例如下图中的硬币。使用传统的图像处理方法,如阈值和轮廓检测,我们