Python-基于Pygame的小游戏(滑雪大冒险)(一)

server/2024/12/19 22:44:51/

前言:《滑雪大冒险》是一款休闲跑酷类游戏,玩家需要在游戏中与雪崩竞速,同时避开雪地上的各种障碍物,如石头、草丛和冰凌等。游戏的核心玩法是在雪山上滑行,避免被身后的雪崩吞没,并尽可能向前推进。与传统跑酷游戏不同的是,这款游戏中没有受伤或失败的概念,只有减速。当玩家的速度降到极慢时,可能会被雪崩追上。那么好,我们今天就一起来学习编写"滑雪大冒险"这款童年单机游戏(由于多方面的限制,制作的游戏可玩性不高,望大家包涵,后面我也会持续优化)。

编程思路:本次编程我们将会用到Python中的pygame,math,tkinter和random。其中,pygame是Python的第三方库,需要我们自行下载安装(不懂怎么下载的同学可以看一下我的前几篇有关pygame的文章,上面有相关教程)。

第一步:导入库

pygame游戏的主体,包括图片描绘,声音播放等都由它来完成,。random和math主要实现游戏的内部运行逻辑。tkinter则负责最后的得分结算展示

python">import pygame
import random
import math
from tkinter import messagebox

第二步:初始化游戏

python">pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("滑雪大冒险 - 初级版")
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)

我们先提供游戏的初始化部分:设置窗口的大小、标题和颜色,为后续的游戏逻辑和图形渲染做准备。

第三步:创建游戏相关类

游戏相关类其实主要就两个:障碍物(如冰山,石头,树等),滑雪者。

python">class Skier(pygame.sprite.Sprite):def __init__(self):super().__init__()self.images = [pygame.image.load("skier_1.png")]self.image = self.images[0]self.rect = self.image.get_rect()self.rect.center = (screen_width // 2, screen_height - 50)self.speed = 5self.direction = 0self.score = 0self.animation_index = 0self.is_jumping = Falseself.jump_height = 600self.jump_velocity = 0self.gravity = 0.1def update(self):if not self.is_jumping:self.rect.x += self.speed * self.directionif self.rect.left < 0:self.rect.left = 0if self.rect.right > screen_width:self.rect.right = screen_widthelse:self.jump_velocity += self.gravityself.rect.y += self.jump_velocityif self.rect.y >= screen_height - 50:self.rect.y = screen_height - 50self.is_jumping = False# 更新动画self.animation_index = (self.animation_index + 1) % len(self.images)self.image = self.images[self.animation_index]def turn(self, direction):self.direction = directiondef jump(self):if not self.is_jumping:self.is_jumping = Trueself.jump_velocity = -math.sqrt(2 * self.gravity * self.jump_height)class Obstacle(pygame.sprite.Sprite):def __init__(self, type):super().__init__()if type == "tree":self.image = pygame.image.load("tree.png")elif type == "rock":self.image = pygame.image.load("rock.png")elif type == "iceberg":self.image = pygame.image.load("iceberg.png")self.rect = self.image.get_rect()self.rect.x = screen_width + random.randint(0, 200)self.rect.y = screen_height - random.randint(100, 300)self.speed = 3def update(self):self.rect.x -= self.speedif self.rect.right < 0:self.kill()

第四步:游戏主循环

这一步是实现游戏整体效果的核心,需要调用到上面创建的各个类。

python">
skier = Skier()
obstacles = pygame.sprite.Group()
clock = pygame.time.Clock()
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:skier.turn(-1)elif event.key == pygame.K_RIGHT:skier.turn(1)elif event.key == pygame.K_UP:skier.jump()elif event.key == pygame.K_DOWN:skier.speed -= 1screen.fill(WHITE)skier.update()obstacles.update()# 随机生成障碍物if random.randint(0, 100) < 1:obstacle_type = random.choice(["tree", "rock", "iceberg"])obstacle = Obstacle(obstacle_type)obstacles.add(obstacle)# 检测碰撞if pygame.sprite.spritecollide(skier, obstacles, False):running = Falsemessagebox.showinfo("游戏结束", "得分:" + str(skier.score))screen.blit(skier.image, skier.rect)obstacles.draw(screen)# 显示分数font = pygame.font.Font(None, 36)score_text = font.render(f"Score: {skier.score}", True, WHITE)screen.blit(score_text, (10, 10))skier.score += 1pygame.display.flip()clock.tick(50)pygame.quit()

第五步:准备游戏相关图片

温馨体示:图片需要放在PyCharm的python项目下。(不理解的同学可以看我前几篇文章)

滑雪者(skier_1.png):

树(tree.png):

冰山(iceberg.png):

石头(rock.png):

第六步:完整代码展示

python">import pygame
import random
import math
from tkinter import messageboxpygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("滑雪大冒险 - 初级版")
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BLUE = (0, 0, 255)class Skier(pygame.sprite.Sprite):def __init__(self):super().__init__()self.images = [pygame.image.load("skier_1.png")]self.image = self.images[0]self.rect = self.image.get_rect()self.rect.center = (screen_width // 2, screen_height - 50)self.speed = 5self.direction = 0self.score = 0self.animation_index = 0self.is_jumping = Falseself.jump_height = 600self.jump_velocity = 0self.gravity = 0.1def update(self):if not self.is_jumping:self.rect.x += self.speed * self.directionif self.rect.left < 0:self.rect.left = 0if self.rect.right > screen_width:self.rect.right = screen_widthelse:self.jump_velocity += self.gravityself.rect.y += self.jump_velocityif self.rect.y >= screen_height - 50:self.rect.y = screen_height - 50self.is_jumping = False# 更新动画self.animation_index = (self.animation_index + 1) % len(self.images)self.image = self.images[self.animation_index]def turn(self, direction):self.direction = directiondef jump(self):if not self.is_jumping:self.is_jumping = Trueself.jump_velocity = -math.sqrt(2 * self.gravity * self.jump_height)class Obstacle(pygame.sprite.Sprite):def __init__(self, type):super().__init__()if type == "tree":self.image = pygame.image.load("tree.png")elif type == "rock":self.image = pygame.image.load("rock.png")elif type == "iceberg":self.image = pygame.image.load("iceberg.png")self.rect = self.image.get_rect()self.rect.x = screen_width + random.randint(0, 200)self.rect.y = screen_height - random.randint(100, 300)self.speed = 3def update(self):self.rect.x -= self.speedif self.rect.right < 0:self.kill()skier = Skier()
obstacles = pygame.sprite.Group()
clock = pygame.time.Clock()
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:skier.turn(-1)elif event.key == pygame.K_RIGHT:skier.turn(1)elif event.key == pygame.K_UP:skier.jump()elif event.key == pygame.K_DOWN:skier.speed -= 1screen.fill(WHITE)skier.update()obstacles.update()# 随机生成障碍物if random.randint(0, 100) < 1:obstacle_type = random.choice(["tree", "rock", "iceberg"])obstacle = Obstacle(obstacle_type)obstacles.add(obstacle)# 检测碰撞if pygame.sprite.spritecollide(skier, obstacles, False):running = Falsemessagebox.showinfo("游戏结束", "得分:" + str(skier.score))screen.blit(skier.image, skier.rect)obstacles.draw(screen)# 显示分数font = pygame.font.Font(None, 36)score_text = font.render(f"Score: {skier.score}", True, WHITE)screen.blit(score_text, (10, 10))skier.score += 1pygame.display.flip()clock.tick(50)pygame.quit()

第七步:运行效果展示

(后续还会更新哦)

第八步:玩法介绍

左,右方向键控制滑雪者的滑行速度,上方向键控制滑雪者起跳。


http://www.ppmy.cn/server/151560.html

相关文章

supervision - 好用的计算机视觉 AI 工具库

Supervision库是一款出色的Python计算机视觉低代码工具&#xff0c;其设计初衷在于为用户提供一个便捷且高效的接口&#xff0c;用以处理数据集以及直观地展示检测结果。简化了对象检测、分类、标注、跟踪等计算机视觉的开发流程。开发者仅需加载数据集和模型&#xff0c;就能轻…

C# 入门编程

<div id"content_views" class"htmledit_views"><p> 无论你是编程新手&#xff0c;还是想要深化.NET技能的开发者&#xff0c;本文都将为你提供一条清晰的学习路径&#xff0c;从<a href"https://so.csdn.net/so/search?qC%23…

Redis API(springboot整合,已封装)

目录 结构maven导包 pom.xmlapplication.ymlredis 配置类编写Service方法调用示例 结构 maven导包 pom.xml 依赖项主要添加如下 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId…

信息化基础知识——电子商务(山东省大数据职称考试)

大数据分析应用-初级 第一部分 基础知识 一、大数据法律法规、政策文件、相关标准 二、计算机基础知识 三、信息化基础知识 四、密码学 五、大数据安全 六、数据库系统 七、数据仓库. 第二部分 专业知识 一、大数据技术与应用 二、大数据分析模型 三、数据科学 电子商务 大数…

鸿蒙app封装 axios post请求失败问题

这个问题是我的一个疏忽大意&#xff0c;在这里记录一下。如果有相同问题的朋友&#xff0c;可以借鉴。 当我 ohpm install ohos/axios 后&#xff0c;进行简单post请求验证&#xff0c;可以请求成功。 然后&#xff0c;我对axios 进行了封装。对axios 添加请求拦截器/添加响…

Android14 AOSP 允许system分区和vendor分区应用进行AIDL通信

在Android14上&#xff0c;出于种种原因&#xff0c;system分区的应用无法和vendor分区的应用直接通过AIDL的方法进行通信&#xff0c;但是项目的某个功能又需要如此。 好在Binder底层其实是支持的&#xff0c;只是在上层进行了屏蔽。 修改 frameworks/native/libs/binder/Bp…

Serverless监控和调试、持续集成和持续部署

接下来,我们将探讨Serverless架构中的监控和调试,以及如何在Serverless环境中实现持续集成和持续部署(CI/CD)。 在Serverless架构中,监控和调试是确保应用健康运行的关键。以下是一些监控和调试的最佳实践: 日志聚合:使用云服务提供商的日志服务(如AWS CloudWatch、Azu…

在 Mac ARM 架构(例如 M1 或 M2 芯片)上安装 Node.js

文章目录 方法一&#xff1a;使用 Homebrew 安装 Node.js方法二&#xff1a;使用 Node Version Manager (NVM) 安装 Node.js方法三&#xff1a;从 Node.js 官方网站下载安装包注意事项 在 Mac ARM 架构&#xff08;例如 M1 或 M2 芯片&#xff09;上安装 Node.js 可以通过几种不…