python实现超级玛丽游戏

2023-10-30 21:20

本文主要是介绍python实现超级玛丽游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

          • 1、需求分析
          • 2、游戏功能结构
          • 3、游戏业务流程
          • 4、游戏预览
          • 5、开发必备
          • 6、玛丽冒险游戏实现
            • 6.1、游戏窗体的实现
            • 6.2、地图加载
            • 6.3、玛丽的跳跃功能
            • 6.4、随机出现障碍
            • 6.5、背景音乐的播放与停止
            • 6.6、碰撞与积分功能实现
          • 7、结束

1、需求分析

具备功能

  1. 播放与停止背景音乐
  2. 随机生成管道与导弹障碍
  3. 显示积分
  4. 跳跃躲避障碍
  5. 碰撞障碍
2、游戏功能结构

玛丽冒险的功能结构主要分为三类,分别为音效、主窗体以及随机出现的障碍物。如下图

image-20231028213612463

3、游戏业务流程

根据该游戏的需求分析以及功能结构

image-20231028214036292

4、游戏预览

image-20231028215603717

5、开发必备

游戏开发运行环境

  1. python3.7以上
  2. 开发工具PyCharm
  3. Python内置模块:itertools、random
  4. 第三方模块:pygame

文件夹组织结构

玛丽冒险游戏的文件夹组织结构主要分为: audio(保存音效文件)和 image (保存图片)

image-20231028215838389

6、玛丽冒险游戏实现
6.1、游戏窗体的实现

在实现游戏窗体时,首先需要定义窗体的宽度与高度,然后通过 ygame 模块中的 init0 方法,实现初始化功能,接下来需要创建循环,在循环中通过 pdate0 函数不断更新窗体,最后需要判断用户是否单击了关闭窗体的按钮,如果单击了“关闭”按钮,将关闭窗体,否则继续循环显示窗体

image-20231028220745048

通过pygame模块实现玛丽主窗体具体步骤如下

  1. 创建文件夹,一个保存音频,一个图片,创建marie.py文件
  2. 导入pygame库与pygame中的常用库,然后定义窗体宽度与高度
import pygame
from pygame.locals import *
import sys# 设置游戏窗口的宽度和高度
SCREENWIDTH = 822
SCREENHEIGHT = 199
# 设置游戏帧率
FPS = 60

创建 mainGame0 方法,在该方法中首先进行 pygame 的初始化工作,然后创建时间对象用于更新窗体中的画面,再创建窗体实例并设置窗体的标题文字,最后通过循环实现窗体的显示与刷新。

def mainGame():score = 0over = Falseglobal SCREEN, FPSCLOCK# 初始化pygame库pygame.init()# 初始化时钟对象FPSCLOCK = pygame.time.Clock()# 创建窗口对象SCREEN = pygame.display.set_mode((SCREENWIDTH, SCREENHEIGHT))# 设置窗口标题pygame.display.set_caption("玛丽冒险")while True:# 处理游戏事件for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()# 更新窗口内容pygame.display.update()# 控制帧率FPSCLOCK.tick(FPS)if __name__ == "__main__":mainGame()
6.2、地图加载

image-20231028221849551
创建一个名称为 MyMap 的滚动地图类,然后在该类的初始化方法中加载背景图片和定义X与Y的坐标

class MyMap():def __init__(self, x, y):self.bg = pygame.image.load("image/bg.png").convert_alpha()self.x = xself.y = y

在 MyMap 类中创建 map _rolling0方法,在该方法中根据地图背景图片的X坐标判断是否移出窗体,如果移出就给图片设置一个新的坐标点,否则按照每次 5 个像素的跨度向左移动

    def map_rolling(self):if self.x < -790:self.x = 800else:self.x -= 5

在MyMap类中创建 map update0方法,在该方法中实现地图无限滚动的效果

    def map_update(self):SCREEN.blit(self.bg,(self.x,self.y))

在 mainGame0方法中,设置标题文字代码的下面创建两个背景图片的对象

    bg1 = MyMap(0,0)bg2 = MyMap(800,0)

在mainGame0方法的循环中,实现无限循环滚动的地图

            if over == False:bg1.map_update()bg1.map_rolling()bg2.map_update()bg2.map_rolling()
6.3、玛丽的跳跃功能

在实现玛丽的跳跃功能时,首先需要指定玛丽的固定坐标,也就是默认显示在地图上的固定位置,然后判断是否按下了键盘中的 (空格)键,如果按下了就开启玛丽的跳跃开关,让玛丽以5个像素的距离向上移动。当玛丽到达窗体顶部的边缘时,再让玛丽以5 个像素的距离向下移动,回到地面后关闭跳跃的开关。玛丽跳跃功能的业务流程如图

image-20231028222531648

导入选代工具,创建一个名称为 Marie 的玛丽类,然后在该类的初始化方法中,首先定义玛丽跳跃时所需要的变量,然后加载玛丽跑动的三张图片,最后加载玛丽跳跃时的音效并设置玛丽默认显示的坐标位置

from itertools import cycle# 玛丽类
class Marie():def __init__(self):# 初始化角色矩形对象self.rect = pygame.Rect(0, 0, 0, 0)# 角色跳跃状态,默认为Falseself.jumpState = False# 角色跳跃高度self.jumpHeight = 130# 角色最低y坐标self.lowest_y = 140# 角色已经跳跃的高度self.jumpValue = 0# 角色动作图片索引self.marieIndex = 0# 产生循环的角色动作图片索引值生成器self.marieIndexGen = cycle([0, 1, 2])# 角色动作图片元组self.adventure_img = (pygame.image.load("image/adventure1.png").convert_alpha(),pygame.image.load("image/adventure2.png").convert_alpha(),pygame.image.load("image/adventure3.png").convert_alpha(),)# 角色跳跃音频self.jump_audio = pygame.mixer.Sound("audio/jump.wav")# 设置角色矩形对象的大小为第一张动作图片的大小self.rect.size = self.adventure_img[0].get_size()# 角色初始位置self.x = 50self.y = self.lowest_yself.rect.topleft = (self.x, self.y)

在 Marie 类中创建 move方法,在该方法中判断如果玛丽的跳跃开关开启时,再判断玛丽是否在地面上,如果满足这两个条件玛丽就以5 个像素的距离向上移动。当玛丽到达窗体顶部时以5个像素的距离向下移动,当玛丽回到地面后关闭跳跃开关

    # 玛丽移动def move(self):if self.jumpState:# 如果角色的y坐标大于等于最低y坐标,设置跳跃值为-5if self.rect.y >= self.lowest_y:self.jumpValue = -5# 如果角色的y坐标小于等于最低y坐标减去跳跃高度,设置跳跃值为5if self.rect.y <= self.lowest_y - self.jumpHeight:self.jumpValue = 5# 修改角色的y坐标self.rect.y += self.jumpValue# 如果角色的y坐标大于等于最低y坐标,设置跳跃状态为Falseif self.rect.y >= self.lowest_y:self.jumpState = False

在 Marie 类中创建draw marie0方法,在该方法中首先匹配玛丽跑步的动图,然后进行玛丽的绘制

    #绘制玛丽def draw_marie(self):marieIndex = next(self.marieIndexGen)SCREEN.blit(self.adventure_img[marieIndex],(self.x,self.rect.y))

在mainGame()方法中,创建地图对象的代码下面创建玛丽对象

    marie = Marie()

在 mainGame0方法的 while 循环中,判断关闭窗体的下面判断是否按下了键盘中的space>(空格)键,如果按下了就开启玛丽跳跃开关并播放跳跃音效

if event.type == KEYDOWN and event.key == K_SPACE:# 如果玛丽的y坐标大于等于最低y坐标,播放跳跃音频,调用跳跃方法if marie.rect.y >= marie.lowest_y:marie.jump_audio.play()marie.jump()

在 mainGame0方法中,绘制地图的代码下面实现玛丽的移动与绘制功能

                marie.move()marie.draw_marie()
6.4、随机出现障碍

在实现障碍物的出现时,首先需要考虑到障碍物的大小以及障碍物不能相同,如果每次出现的障碍物都是相同的那么该游戏将失去了游戏的乐趣。所以需要加载两个大小不同的障碍物图片,然后随机抽选并显示,还需要通过计算来设置出现一个障碍并将障碍物显示在窗体当中的时间间隔

image-20231028223540234

导入随机数,创建一个名称为 Obstacle 的障碍物类,在该类中定义一个分数,然后在初始化方法中加载障碍物图片、分数图片以及加分音效。创建0至1 的随机数字,根据该数字抽选障碍物是管道还是飞行的导弹,最后根据图片的宽、高创建障碍物矩形的大小并设置障碍物的绘制坐标

class Obstacle():score = 1  # 初始化分数变量为1move = 5  # 设置移动速度为5obstacle_y = 150  # 设置障碍物的y坐标为150def __init__(self):self.rect = pygame.Rect(0,0,0,0)  # 创建用于碰撞检测的矩形对象self.missile = pygame.image.load("image/missile.png").convert_alpha()  # 加载导弹图片self.pipe = pygame.image.load("image/pipe.png").convert_alpha()  # 加载管道图片self.numbers = (  # 加载数字图片pygame.image.load("image/0.png").convert_alpha(),pygame.image.load("image/1.png").convert_alpha(),pygame.image.load("image/2.png").convert_alpha(),pygame.image.load("image/3.png").convert_alpha(),pygame.image.load("image/4.png").convert_alpha(),pygame.image.load("image/5.png").convert_alpha(),pygame.image.load("image/6.png").convert_alpha(),pygame.image.load("image/7.png").convert_alpha(),pygame.image.load("image/8.png").convert_alpha(),pygame.image.load("image/9.png").convert_alpha(),)self.score_audio = pygame.mixer.Sound("audio/score.wav")  # 加载得分音效r = random.randint(0,1)  # 生成随机数0或1if r == 0:# 如果随机数为0,设置障碍物为导弹,移动速度为15,y坐标为100self.image = self.missileself.move = 15self.obstacle_y = 100else:# 如果随机数为1,设置障碍物为管道self.image = self.pipe# 设置障碍物的大小和位置self.rect.size = self.image.get_size()self.width, self.height = self.rect.sizeself.x = 800  # 设置障碍物的初始位置为屏幕右侧self.y = self.obstacle_yself.rect.center = (self.x ,self.y)

在Obstacle 类中首先创建 obstacle move0方法,用于实现障碍物的移动,然后创建 drawobstacle()方法用于实现绘制障碍物

    #障碍物移动def obstacle_move(self):self.rect.x -= self.move#绘制障碍物def draw_obstacle(self):SCREEN.blit(self.image,(self.rect.x, self.rect.y))

在 mainGame()方法中,创建定义添加障碍物的时间与障碍物对象列表(玛丽对象的代码下面)

    addObstackeTimer = 0list = []

在 mainGame()方法中绘制计算障碍物出现的间隔时间(玛丽对象的代码下面)

if addObstackeTimer >= 100:  # 如果生成障碍物的计时器达到100r = random.randint(0, 50)  # 生成一个0到50之间的随机数if r > 15:  # 如果随机数大于15obstacle = Obstacle()  # 创建一个障碍物对象list.append(obstacle)  # 将障碍物对象添加到列表中
addObstackeTimer = 0  # 重置生成障碍物的计时器为0

在 mainGame0方法中计算循环遍历障碍物并进行障碍物的绘制(障碍物间隔时间代码的下面)

            for i in range(len(list)):list[i].obstacle_move()list[i].draw_obstacle()

在mainGame0方法中更新整个窗体代码的上面,增加障碍物时间

addObstackeTimer += 10
6.5、背景音乐的播放与停止

创建 Music Button 类,在该类中首先初始化背景音乐的音效文件与按钮图片,然后创建isselect0 方法用于判断鼠标是否在按钮范围内

# 背景音乐按钮
class Music_Button():is_open = True  # 背景音乐是否开启的状态标志def __init__(self):# 加载开启和关闭按钮的图像资源self.open_img = pygame.image.load("image/btn_open.png").convert_alpha()self.close_img = pygame.image.load("image/btn_close.png").convert_alpha()# 加载背景音乐的音频文件self.bg_music = pygame.mixer.Sound("audio/bg_music.wav")def is_select(self):# 获取鼠标的位置point_x, point_y = pygame.mouse.get_pos()# 获取开启按钮图像的宽度和高度w, h = self.open_img.get_size()# 判断鼠标是否在按钮范围内in_x = point_x > 20 and point_x < 20 + win_y = point_y > 20 and point_y < 20 + hreturn in_x and in_y

mainGame方法中障碍物对象列表代码的下面,创建背景音乐按钮对象,然后设置按钮默认图片,最后循环播放背景音乐。

    muscic_button = Music_Button()btu_img = muscic_button.open_imgmuscic_button.bg_music.play(-1)

在 mainGame0方法的 while 循环中,获取单击事件代码的下面实现单击按钮控制背景音乐的播放与停止功能

if event.type == pygame.MOUSEBUTTONUP:# 判断是否为鼠标按键抬起事件if muscic_button.is_select():# 判断鼠标是否在背景音乐按钮范围内if muscic_button.is_open:# 如果背景音乐当前是开启状态btu_img = muscic_button.close_imgmuscic_button.is_open = Falsemuscic_button.bg_music.stop()else:# 如果背景音乐当前是关闭状态btu_img = muscic_button.open_imgmuscic_button.is_open = Truemuscic_button.bg_music.play(-1)

在 mainGame()方法中添加障碍物时间代码的下面,绘制背景音乐按钮

SCREEN.blit(btu_img, (20, 20))
6.6、碰撞与积分功能实现

在实现碰撞与积分时,首先需要判断玛丽与障碍物的两个矩形图片是否发生了碰撞,如果发生了碰撞就证明该游戏已经结束,否则判断玛丽是否跃过了障碍物,确认越过后进行加分操作并将分数显示在窗体顶部右侧的位置。

image-20231028225019597

在 Obstacle 类中,draw obstacle0方法的下面创建getScore0 方法用于获取分数并播放加分音效,然后创建 showScore() 方法用于在窗体顶部右侧的位置显示分数

def getSocre(self):"""获取分数并重置分数为0"""# 获取当前的分数tmp = self.score# 如果分数为1,播放分数音效if tmp == 1:self.score_audio.play()# 将分数重置为0self.score = 0# 返回原来的分数return tmp# 显示分数
def showScore(self, score):"""在游戏界面上显示分数"""# 将分数转换为一个数字列表self.scoreDigits = [int(x) for x in list(str(score))]# 计算所有数字图像的总宽度totalWidth = 0for digit in self.scoreDigits:totalWidth += self.numbers[digit].get_width()# 计算数字图像的起始横坐标Xoffset = (SCREENWIDTH - (totalWidth + 30))# 遍历分数的每个数字,将对应的数字图像绘制到屏幕上for digit in self.scoreDigits:# 绘制数字图像到屏幕上,并更新Xoffset的值SCREEN.blit(self.numbers[digit], (Xoffset, SCREENHEIGHT * 0.1))Xoffset += self.numbers[digit].get_width()

在 mainGame()方法的上面最外层创建 game over()方法,在该方法中首先需要加载与播放撞击的音效,然后获取窗体的宽度与高度,最后加载游戏结束的图片并将该图片显示在窗体的中间位置

def game_over():# 播放碰撞音效bump_audio = pygame.mixer.Sound("audio/bump.wav")bump_audio.play()# 获取屏幕的宽度和高度screen_w = pygame.display.Info().current_wscreen_h = pygame.display.Info().current_h# 加载游戏结束图片over_img = pygame.image.load("image/gameover.png").convert_alpha()# 在屏幕上绘制游戏结束图片,位置居中显示在屏幕中央SCREEN.blit(over_img, ((screen_w - over_img.get_width()) / 2, (screen_h - over_img.get_height()) / 2))

在 mainGame()方法中,绘制障碍物代码的下面判断玛丽与障碍物是否发生碰撞,如果发生了碰撞则开启游戏结束的开关,并调用游戏结束的方法显示游戏结束的图片,否则判断玛丽是否跃过了障碍物,越过就进行分数的增加并显示当前得分

if pygame.sprite.collide_rect(marie, list[i]):# 玛丽与物品发生碰撞over = True  # 游戏结束标志设为Truegame_over()  # 显示游戏结束画面music_button.bg_music.stop()  # 停止播放背景音乐
else:if (list[i].rect.x + list[i].rect.width) < marie.rect.x:# 物品已完全移出玛丽的右侧,计入分数score += list[i].getSocre()
list[i].showScore(score)

为了实现游戏结束后再次按下键盘上的 (空格)键时,重新启动游戏。所以需要在 mainGame0方法中开启玛丽跳的状态代码的下面判断游戏结束的开关是否开启,如果开启将重新调用mainGame0)方法重新启动游戏

if over == True:mainGame()
7、结束

需要源码留言

这篇关于python实现超级玛丽游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/310676

相关文章

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

利用Python打造一个Excel记账模板

《利用Python打造一个Excel记账模板》这篇文章主要为大家详细介绍了如何使用Python打造一个超实用的Excel记账模板,可以帮助大家高效管理财务,迈向财富自由之路,感兴趣的小伙伴快跟随小编一... 目录设置预算百分比超支标红预警记账模板功能介绍基础记账预算管理可视化分析摸鱼时间理财法碎片时间利用财

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B