Python-滑雪大冒险【附源码】

滑雪大冒险

《滑雪大冒险》是一款充满趣味性和挑战性的休闲竞技游戏,在游戏中,玩家将扮演一位勇敢的滑雪者,在雪山上展示他们的滑雪技巧,游戏采用2D图形界面,以第三人称视角呈现

运行效果:用方向键及方向键的组合使用来控制游戏角色的移动
在这里插入图片描述
在这里插入图片描述

一:主程序:

import sys
import cfg
import pygame
import random'''滑雪者类'''
class SkierClass(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)# 滑雪者的朝向(-2到2)self.direction = 0self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]self.image = pygame.image.load(self.imagepaths[self.direction])self.rect = self.image.get_rect()self.rect.center = [320, 100]self.speed = [self.direction, 6-abs(self.direction)*2]'''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''def turn(self, num):self.direction += numself.direction = max(-2, self.direction)self.direction = min(2, self.direction)center = self.rect.centerself.image = pygame.image.load(self.imagepaths[self.direction])self.rect = self.image.get_rect()self.rect.center = centerself.speed = [self.direction, 6-abs(self.direction)*2]return self.speed'''移动滑雪者'''def move(self):self.rect.centerx += self.speed[0]self.rect.centerx = max(20, self.rect.centerx)self.rect.centerx = min(620, self.rect.centerx)'''设置为摔倒状态'''def setFall(self):self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])'''设置为站立状态'''def setForward(self):self.direction = 0self.image = pygame.image.load(self.imagepaths[self.direction])'''
Function:障碍物类
Input:img_path: 障碍物图片路径location: 障碍物位置attribute: 障碍物类别属性
'''
class ObstacleClass(pygame.sprite.Sprite):def __init__(self, img_path, location, attribute):pygame.sprite.Sprite.__init__(self)self.img_path = img_pathself.image = pygame.image.load(self.img_path)self.location = locationself.rect = self.image.get_rect()self.rect.center = self.locationself.attribute = attributeself.passed = False'''移动'''def move(self, num):self.rect.centery = self.location[1] - num'''创建障碍物'''
def createObstacles(s, e, num=10):obstacles = pygame.sprite.Group()locations = []for i in range(num):row = random.randint(s, e)col = random.randint(0, 9)location  = [col*64+20, row*64+20]if location not in locations:locations.append(location)attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))img_path = cfg.OBSTACLE_PATHS[attribute]obstacle = ObstacleClass(img_path, location, attribute)obstacles.add(obstacle)return obstacles'''合并障碍物'''
def AddObstacles(obstacles0, obstacles1):obstacles = pygame.sprite.Group()for obstacle in obstacles0:obstacles.add(obstacle)for obstacle in obstacles1:obstacles.add(obstacle)return obstacles'''显示游戏开始界面'''
def ShowStartInterface(screen, screensize):screen.fill((255, 255, 255))tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)title = tfont.render(u'滑雪大冒险', True, (255, 0, 0))content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))trect = title.get_rect()trect.midtop = (screensize[0]/2, screensize[1]/5)crect = content.get_rect()crect.midtop = (screensize[0]/2, screensize[1]/2)screen.blit(title, trect)screen.blit(content, crect)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:returnpygame.display.update()'''显示分数'''
def showScore(screen, score, pos=(10, 10)):font = pygame.font.Font(cfg.FONTPATH, 30)score_text = font.render("Score: %s" % score, True, (0, 0, 0))screen.blit(score_text, pos)'''更新当前帧的游戏画面'''
def updateFrame(screen, obstacles, skier, score):screen.fill((255, 255, 255))obstacles.draw(screen)screen.blit(skier.image, skier.rect)showScore(screen, score)pygame.display.update()'''主程序'''
def main():# 游戏初始化pygame.init()pygame.mixer.init()pygame.mixer.music.load(cfg.BGMPATH)pygame.mixer.music.set_volume(0.4)pygame.mixer.music.play(-1)# 设置屏幕screen = pygame.display.set_mode(cfg.SCREENSIZE)pygame.display.set_caption('滑雪大冒险')# 游戏开始界面ShowStartInterface(screen, cfg.SCREENSIZE)# 实例化游戏精灵# --滑雪者skier = SkierClass()# --创建障碍物obstacles0 = createObstacles(20, 29)obstacles1 = createObstacles(10, 19)obstaclesflag = 0obstacles = AddObstacles(obstacles0, obstacles1)# 游戏clockclock = pygame.time.Clock()# 记录滑雪的距离distance = 0# 记录当前的分数score = 0# 记录当前的速度speed = [0, 6]# 游戏主循环while True:# --事件捕获for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT or event.key == pygame.K_a:speed = skier.turn(-1)elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:speed = skier.turn(1)# --更新当前游戏帧的数据skier.move()distance += speed[1]if distance >= 640 and obstaclesflag == 0:obstaclesflag = 1obstacles0 = createObstacles(20, 29)obstacles = AddObstacles(obstacles0, obstacles1)if distance >= 1280 and obstaclesflag == 1:obstaclesflag = 0distance -= 1280for obstacle in obstacles0:obstacle.location[1] = obstacle.location[1] - 1280obstacles1 = createObstacles(10, 19)obstacles = AddObstacles(obstacles0, obstacles1)for obstacle in obstacles:obstacle.move(distance)# --碰撞检测hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)if hitted_obstacles:if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:score -= 50skier.setFall()updateFrame(screen, obstacles, skier, score)pygame.time.delay(1000)skier.setForward()speed = [0, 6]hitted_obstacles[0].passed = Trueelif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:score += 10obstacles.remove(hitted_obstacles[0])# --更新屏幕updateFrame(screen, obstacles, skier, score)clock.tick(cfg.FPS)'''run'''
if __name__ == '__main__':main()

二:配置文件 - cfg.py

'''配置文件'''
import os'''FPS'''
FPS = 40
'''游戏屏幕大小'''
SCREENSIZE = (640, 640)
'''图片路径'''
SKIER_IMAGE_PATHS = [os.path.join(os.getcwd(), 'resources/images/skier_forward.png'),os.path.join(os.getcwd(), 'resources/images/skier_right1.png'),os.path.join(os.getcwd(), 'resources/images/skier_right2.png'),os.path.join(os.getcwd(), 'resources/images/skier_left2.png'),os.path.join(os.getcwd(), 'resources/images/skier_left1.png'),os.path.join(os.getcwd(), 'resources/images/skier_fall.png')
]
OBSTACLE_PATHS = {'tree': os.path.join(os.getcwd(), 'resources/images/tree.png'),'flag': os.path.join(os.getcwd(), 'resources/images/flag.png')
}
'''背景音乐路径'''
BGMPATH = os.path.join(os.getcwd(), 'resources/music/bgm.mp3')
'''字体路径'''
FONTPATH = os.path.join(os.getcwd(), 'resources/font/FZSTK.TTF')

三:素材包 - resources

素材包大家根据配置文件自己配置就好

或者私信我发你

最后祝大家大雪节气快乐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/206053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask 数据库迁移可能出现的六大问题,生成requirements文件夹方式,flask项目复写,

今日任务 项目分级显示 — app — — admin 代表 — — auth 代表用户的点赞 评论 登录等等 — — blog 代表blog的网页 首先单独把auth运行出来 第一步 1. 生成requirements文件夹 2.在一个新的虚拟环境里面完成requirements依赖下载 3.完成项目的复写 1. 生成requ…

算术运算(这么简单?进来坐坐?)

先热热身 算术运算,也称为四则运算,包括加法、减法、乘法和除法。此外,算术运算还包括乘方和开方。 在算术中,加减被视为一级运算,乘除被视为二级运算,乘方和开方被视为三级运算。在一道算式中,…

网站导航栏下滑隐藏,上滑显示,效果杠杆,兼容性强

前言 导航栏是网站必不可少的一部分,那么,导航栏应该怎么样子实现,可以高效自定义兼容开发呢?当然,不仅要实现,而且还要实现导航栏顶部固定位置,下拉隐藏,稍微往上滑动就会出现&…

Python中的并发编程(2)线程的实现

Python中线程的实现 1. 线程 在Python中,threading 库提供了线程的接口。我们通过threading 中提供的接口创建、启动、同步线程。 例1. 使用线程旋转指针 想象一个场景:程序执行了一个耗时较长的操作,如复制一个大文件,我们希…

2022年第十一届数学建模国际赛小美赛D题野生动物贸易是否应长期禁止解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 D题 野生动物贸易是否应长期禁止 原题再现: 野生动物市场被怀疑是此次疫情和2002年SARS疫情的源头,食用野生肉类被认为是非洲埃博拉病毒的一个来源。在冠状病毒爆发后,中国最高立法机构永久性地加强了野…

【git教程】

目录 git与SVN的区别:集中式与分布式的区别Windows上安装Git创建版本库/仓库(repository)将文件添加到repository报错处理 查看仓库的状态版本回退工作区和暂存区管理和修改撤销修改删除文件远程仓库添加远程仓库警告解除本地和远程的绑定关系…

一文3000字从0到1用Python进行gRPC接口测试!

gRPC 是一个高性能、通用的开源RPC框架,其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。 自gRPC推出以来,已经广泛应用于各种服务之中。在测…

数据结构如何影响程序的错误检测和调试?

在计算机科学中,数据结构是程序的基础,它组织和存储数据的方式直接影响程序的错误检测和调试。主要包含以下几个方面: 一、数据完整性 数据结构的选择直接影响数据的完整性。一些数据结构,如数组,可以确保数据的顺序…

AI助力智慧农业,基于SSD模型开发构建田间作物场景下庄稼作物、杂草检测识别系统

智慧农业随着数字化信息化浪潮的演变有了新的定义,在前面的系列博文中,我们从一些现实世界里面的所见所想所感进行了很多对应的实践,感兴趣的话可以自行移步阅读即可:《自建数据集,基于YOLOv7开发构建农田场景下杂草检…

【C语言快速学习基础篇】之二控制语句、循环语句、隐式转换

文章目录 一、控制语句1.1、for循环1.2、while循环1.3、注意:for循环和while循环使用上面等同1.4、do while循环1.4.1while条件成立时1.4.2、while条件不成立时 C语言介绍 C语言是一门面向过程的计算机编程语言,与C、C#、Java等面向对象编程语言有所不同…

【Jmeter】JSON Extractor变量包含转义字符,使用Beanshell脚本来消除

如果使用Jmeter的JSON Extractor提取的变量包含特殊字符,直接引用时会包含转义字符。可以使用Beanshell脚本来进行字符串转换,从而消除这些转义字符。 import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import com.ali…

利用 Python 进行数据分析实验(四)

一、实验目的 使用Python解决简单问题 二、实验要求 自主编写并运行代码,按照模板要求撰写实验报告 三、实验步骤 本次实验共有4题: 汉诺塔问题:有3根柱子,第一根有N个盘子,从上往下越来越大。要求把第一根柱子的…

“分割“安卓用户,对标iOS,鸿蒙崛起~

近期关于**“华为于明年推出不兼容安卓的鸿蒙版本”**的消息传出,引起了业界的热议关注。自从2019年8月,美国制裁下,华为不再能够获得谷歌安卓操作系统相关付费服务,如此情况下,华为“备胎”鸿蒙操作系统一夜转正。 华…

Java字符串操作系列(2)

1、字符串性能比较测试 以下实例演示了通过两种方式创建字符串&#xff0c;并测试其性能&#xff1a; public class StringComparePerformance{public static void main(String[] args){ long startTime System.currentTimeMillis();for(int i0;i<50000;i){String s…

Linux硬链接和软连接是什么?

在Linux操作系统中&#xff0c;文件管理是一个基本且重要的概念。其中&#xff0c;软链接&#xff08;Symbolic Link&#xff09;和硬链接&#xff08;Hard Link&#xff09;是文件系统中两种不同类型的链接方式&#xff0c;它们在文件管理和操作中扮演着重要的角色。软链接 软…

有效解决wordpress的502 Bad Gateway错误提示

摘要&#xff1a;最近有客户反映使用阿里云虚拟云主机&#xff0c;wordpress常提示502 Bad Gateway错误&#xff0c;网关错误是网站上遇到的常... wordpress的502 Bad Gateway错误如何修复&#xff1f; 第1步&#xff1a;偶发错误可尝试重新加载网站 偶尔出现流量突发爆增或是服…

Sql Server关于表的建立、修改、删除

表的创建&#xff1a; &#xff08;1&#xff09;在“对象资源管理器”面板中展开“数据库”节点&#xff0c;可以看到自己创建的数据库&#xff0c;比如Product。展开Product节点&#xff0c;右击“表”节点&#xff0c;在弹出的快捷菜单中选择“新建表”项&#xff0c;进入“…

mysql中information_schema.tables字段说明

第一篇 1. 获取所有表结构(TABLES) SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA数据库名; TABLES表&#xff1a;提供了关于数据库中的表的信息&#xff08;包括视图&#xff09;。详细表述了某个表属于哪个schema&#xff0c;表类型&#xff0c;表引擎&…

打工人副业变现秘籍,某多/某手变现底层引擎-Stable Diffusion简介

Stable Diffusion是2022年发布的深度学习文本到图像生成模型,它主要用于根据文本的描述产生详细图像,尽管它也可以应用于其他任务,如

K-means算法通俗原理及Python与R语言的分别实现

K均值聚类方法是一种划分聚类方法&#xff0c;它是将数据分成互不相交的K类。K均值法先指定聚类数&#xff0c;目标是使每个数据到数据点所属聚类中心的总距离变异平方和最小&#xff0c;规定聚类中心时则是以该类数据点的平均值作为聚类中心。 01K均值法原理与步骤 对于有N个…