Python实现接糖果小游戏

介绍:

基于Pygame的糖果从屏幕顶部下落的游戏代码。这个游戏包括了一个可以左右移动的篮子来接住下落的糖果,接住糖果会增加得分。

代码:

import pygame
import random
import os# 初始化pygame和设置屏幕大小
pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))# 设置颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
ORANGE = (255, 128, 0)
BLACK = (0, 0, 0)# 糖果和篮子的尺寸
candy_width, candy_height = 30, 30
basket_width, basket_height = 100, 50# 初始化篮子的位置
basket_x = screen_width // 2
basket_y = screen_height - basket_height# 糖果列表
candies = []# 初始化得分
score = 0# 最高得分
highest_score = 0# 设置游戏运行时间(毫秒)
game_duration = 30000# 难度和对应的下落速度
DIFFICULTIES = {'Easy': 10,'Medium': 20,'Hard': 30
}# 按钮的位置和大小
button_width = 150
button_height = 50
button_x_offset = 100
button_y = screen_height // 2 - (button_height // 2)# 字体
font = pygame.font.Font(None, 36)# 难度选择函数
def select_difficulty():selected_difficulty = Noneclock = pygame.time.Clock()  # 添加一个时钟对象来控制帧率while not selected_difficulty:for event in pygame.event.get():if event.type == pygame.QUIT:return Noneelif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()if button_x_offset <= mouse_x < button_x_offset + button_width and button_y <= mouse_y < button_y + button_height:selected_difficulty = 'Easy'elif button_x_offset + button_width + 10 <= mouse_x < button_x_offset + 2 * button_width + 10 and button_y <= mouse_y < button_y + button_height:selected_difficulty = 'Medium'elif button_x_offset + 2 * button_width + 20 <= mouse_x < button_x_offset + 3 * button_width + 20 and button_y <= mouse_y < button_y + button_height:selected_difficulty = 'Hard'# 在循环内渲染难度选择界面screen.fill(WHITE)# 绘制按钮pygame.draw.rect(screen, RED, (button_x_offset, button_y, button_width, button_height))pygame.draw.rect(screen, RED, (button_x_offset + button_width + 10, button_y, button_width, button_height))pygame.draw.rect(screen, RED, (button_x_offset + 2 * button_width + 20, button_y, button_width, button_height))# 绘制按钮文本easy_text = font.render("Easy", True, WHITE)screen.blit(easy_text, (button_x_offset + (button_width - easy_text.get_width()) // 2,button_y + (button_height - easy_text.get_height()) // 2))medium_text = font.render("Medium", True, WHITE)screen.blit(medium_text, (button_x_offset + button_width + 10 + (button_width - medium_text.get_width()) // 2,button_y + (button_height - medium_text.get_height()) // 2))hard_text = font.render("Hard", True, WHITE)screen.blit(hard_text, (button_x_offset + 2 * button_width + 20 + (button_width - hard_text.get_width()) // 2,button_y + (button_height - hard_text.get_height()) // 2))pygame.display.flip()  # 更新屏幕显示# 控制帧率clock.tick(60)return selected_difficulty# 加载或设置历史最高分数
def load_highest_score():global highest_scorefile_path = os.path.join(os.getcwd(), 'highest_score.txt')try:with open(file_path, 'r') as file:highest_score = int(file.read().strip())except FileNotFoundError:highest_score = 0def save_highest_score():global highest_scorefile_path = os.path.join(os.getcwd(), 'highest_score.txt')with open(file_path, 'w') as file:file.write(str(highest_score))def check_restart_button(event):button_rect = pygame.Rect(screen_width - 100, screen_height - 50, 100, 50)return event.type == pygame.MOUSEBUTTONDOWN and event.button == 1 and button_rect.collidepoint(event.pos)# 选择难度
difficulty = select_difficulty()
if difficulty is None:pygame.quit()# 根据难度设置下落速度
speed = DIFFICULTIES[difficulty]# 游戏主循环
clock = pygame.time.Clock()
running = True
game_over = False
load_highest_score()  # 加载历史最高分数
game_start_time = pygame.time.get_ticks()  # 记录游戏开始时间
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.MOUSEMOTION:basket_x = event.pos[0]basket_x = max(0, min(basket_x, screen_width - basket_width))elif check_restart_button(event):game_start_time = pygame.time.get_ticks()candies.clear()score = 0# 计算已经过去的时间(毫秒)elapsed_time = pygame.time.get_ticks() - game_start_time# 将毫秒转换为秒elapsed_seconds = elapsed_time / 1000# 生成新的糖果(限制生成频率)if random.random() < 0.02 and len(candies) < 10:candy_x = random.randint(0, screen_width - candy_width)candy_y = 0 - candy_height  # 开始时稍微在屏幕外candies.append([candy_x, candy_y])# 移动糖果for candy in candies:candy[1] += speed# 检查糖果是否超出屏幕底部if candy[1] > screen_height:candies.remove(candy)# 检查是否接到糖果(在糖果掉出屏幕之前)if (basket_x < candy[0] < basket_x + basket_width andbasket_y - candy_height < candy[1] < basket_y):score += 1candies.remove(candy)# 在游戏结束时保存最高分数if not candies and score > highest_score:highest_score = scoresave_highest_score()# 绘制游戏元素screen.fill(WHITE)  # 填充背景色for candy_x, candy_y in candies:pygame.draw.rect(screen, (255, 0, 0), (candy_x, candy_y, candy_width, candy_height))pygame.draw.rect(screen, (100, 50, 0), (basket_x, basket_y, basket_width, basket_height))  # 绘制篮子矩形# 显示得分score_text = font.render(f"Score: {score}", True, BLACK)highest_score_text = font.render(f"Highest score: {highest_score}", True, BLACK)screen.blit(score_text, (10, 10))screen.blit(highest_score_text, (10, 50))time = game_duration - elapsed_time# 获取秒数的后三位last_three_digits = time % 1000# 转换为字符串以便显示time1 = int(time/1000)time_str = str(last_three_digits).zfill(3)if time > 0:screen.blit(font.render(f"remainder: {time1}.{time_str}", True, RED), (300, 10))# 绘制“重新开始”按钮pygame.draw.rect(screen, BLACK, (screen_width - 100, screen_height - 50, 100, 50))pygame.draw.rect(screen, WHITE, (screen_width - 98, screen_height - 48, 96, 46), 2)screen.blit(font.render("restart", True, ORANGE), (screen_width - 85, screen_width - 300))# 检查游戏是否应该结束if time < 0:font1 = pygame.font.Font(None, 52)screen.blit(font1.render("game over", True, RED), (300, 300))candies.clear()score = 0# 更新屏幕显示pygame.display.flip()# 控制游戏循环的速度clock.tick(60)# 退出pygame
pygame.quit()

选择难度页面示例:

 游戏页面:

源码下载 

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

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

相关文章

海康视频播放,包含h5和web插件

自行下载 海康开放平台 demo 都写得很清楚&#xff0c;不多描述 1.视频web插件 vue2写法&#xff0c;公共vue文件写法&#xff0c;调用文件即可 开始时需要以下配置&#xff0c;不知道的找对接平台数据的人&#xff0c;必须要&#xff0c;否则播不了 getParameterData: {po…

万字总结随机森林原理、核心参数以及调优思路

万字总结随机森林原理、核心参数以及调优思路 在机器学习的世界里&#xff0c;随机森林&#xff08;Random Forest, RF&#xff09;以其强大的预测能力和对数据集的鲁棒性而备受青睐。作为一种集成学习方法&#xff0c;随机森林通过构建多个决策树并将它们的预测结果进行汇总&…

暴雨来袭,陈赫家变“水帘洞”网友:赫哥滴滴打船吗?

在魔都上海&#xff0c;一场突如其来的暴雨 不仅让街道变成了河流&#xff0c;还悄悄上演了一场现实版的“水帘洞”奇遇 而这场奇遇的主角&#xff0c;竟然是喜剧界的明星——陈赫&#xff01; 这天&#xff0c;乌云密布&#xff0c;电闪雷鸣 魔都的天空仿佛被捅了个窟窿 雨…

吴恩达《LangChain for LLM Application Development》课程笔记

目录 1. 前言 2. 课程笔记 2.1. 模型、提示和解析器 2.2. LLM记忆&#xff0c;上下文管理 2.3. 链式操作 2.4. 文档问答 2.4.1. stuff 方法 2.4.2. 其他方法 2.5. LLM应用评估 2.6. 代理 2.6.1. 预定义工具 2.6.2. 自定义工具 代码资源&#xff1a; 1. 前言 LangC…

文心一言 VS 讯飞星火 VS chatgpt (293)-- 算法导论21.4 2题

二、证明&#xff1a;每个结点的秩最多为 ⌊lgm⌋ 。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 在数据结构和算法中&#xff0c;当我们谈论“结点的秩”时&#xff0c;这通常与某些特定的数据结构&#xff08;如B树或B树&#xff09;相关&#xff0c;其中每…

代码随想录算法训练营第40天| 518. 零钱兑换 II、 377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)

518. 零钱兑换 II 题目链接&#xff1a;518. 零钱兑换 II 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; 和494.目标和类似&#xff0c;这题属于组合问题&#xff0c;当我们有一个硬币coin时&#xff0c;对于每个金额j&#xff0c;通过添加这个硬币&a…

平安养老险陕西分公司参加2024上半年省级单位驻富平帮扶团联席会

6月28日&#xff0c;平安养老险陕西分公司工会副主席武媛携驻村工作队赴富平县庄里镇永安村参加2024上半年度省级单位驻富平帮扶团联席会议。 会议由省委金融办副主任、省委金融工委委员李嘉辉及省委金融办选派挂职干部、富平县副县长席玮共同主持。 会上&#xff0c;席玮县长带…

吴恩达机器学习 第三课 week2 推荐算法(下)

目录 01 学习目标 02 基于内容的过滤算法 03 实现“电影推荐系统” 3.1 问题描述 3.2 算法实现 04 大项目&#xff08;数据很大&#xff09;的推荐方法※ 4.1 方法原理 4.2 实施示例 05 总结 01 学习目标 &#xff08;1&#xff09;理解基于内容的过滤算法&#xff08…

嵌入式问题分析思路

BUG解决总体思路: 1.1 定位bug范围及性质 要有效解决问题&#xff0c;首先要缩小范围&#xff0c;集中关注最近的代码变化。这有助于迅速定位可能引入问题的部分&#xff0c;避免无谓的时间浪费。检查最近的代码提交记录和修改日志&#xff0c;找出可能影响现有功能的变更。然…

如果使用Outlook 2024出现问题

大家好&#xff0c;才是真的好。 很多企业使用Domino服务器当作POP/IMAP邮箱服务器来使用&#xff0c;虽然这不能发挥Domino最佳效能&#xff0c;但也不失为一种简单用法。 另一种企业则使用Domino仅作为应用app平台&#xff0c;邮箱早已迁移至O365或其他平台&#xff0c;他们…

报销又乱又慢,财务如何解决报销困局?

费用报销是企业频繁发生的业务场景&#xff0c;不同的企业在费用报销的流程、标准、制度、管理上各有不同。作为一些公司日常运作中的薄弱环节&#xff0c;费用报销环节存在着较大的内控风险&#xff0c;如&#xff1a;费用报销滞后&#xff0c;造成会计信息的失真&#xff0c;…

【YOLOv5/v7改进系列】更换损失函数为CIOU、GIOU、SIOU、DIOU、EIOU、WIOUv1/v2/v3、Focal C/G/S/D/EIOU等

一、导言 在目标检测任务中&#xff0c;损失函数的主要作用是衡量模型预测的边界框&#xff08;bounding boxes&#xff09;与真实边界框之间的匹配程度&#xff0c;并指导模型学习如何更精确地定位和分类目标。损失函数通常由两部分构成&#xff1a;分类损失&#xff08;用于…

我的世界服务器-高版本服务器-MC服务器-生存服务器-RPG服务器-幻世星辰

生存为主&#xff0c;RPG乐趣为辅&#xff0c;重视每位玩家的建议&#xff0c;一起打造心目中的服务器&#xff0c;与小伙伴一起探险我的世界&#xff01; 服务器版本: 1.18.2 ~ 1.20.4 Q群&#xff1a; 338238381 服务器官网: 星辰毛毛雨-Minecraft高版本生存服务器我的世界…

springboot是否可以代替spring

Spring Boot不能直接代替Spring&#xff0c;但它是Spring框架的一个扩展和增强&#xff0c;提供了更加便捷和高效的开发体验。以下是关于Spring Boot和Spring关系的详细解释&#xff1a; Spring框架&#xff1a; Spring是一个广泛应用的开源Java框架&#xff0c;提供了一系列模…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

nccl 04 nvidia 官方小程序

1&#xff0c;代码重新编辑 为了地毯式地检查结果的正确性&#xff0c;这里修改了代码 主要步骤为 step1: data_p指向的空间中&#xff0c;分别生成随机数&#xff1b; step2: 分别拷贝到gpu的sendbuff的显存中&#xff1b; step3: 通过nccl_all_reduce sum&#xff1b;…

掌握 Python 中 isinstance 的正确用法

&#x1f44b; 简介 isinstance() 函数用于判断一个对象是否是一个特定类型或者在继承链中是否是特定类型的实例。它常用于确保函数接收到的参数类型是预期的。 &#x1f4d6; 正文 1 语法 isinstance(object, classinfo) object参数是要检查的对象&#xff1b;classinfo参数…

【工具推荐】ONLYOFFICE8.1版本编辑器测评——时下的办公利器

文章目录 一、产品介绍1. ONLYOFFICE 8.1简介2. 多元化多功能的编辑器 二、产品体验1. 云端协作空间2. 桌面编辑器本地版 三、产品界面设计1. 本地版本2. 云端版本 四、产品文档处理1. 文本文档&#xff08;Word)2. 电子表格&#xff08;Excel&#xff09;3. PDF表单&#xff0…

【C++ | 继承】|概念、方式、特性、作用域、6类默认函数

继承 1.继承的概念与定义2.继承的方式2.1继承基本特性2.2继承的作用域2.2.1隐藏赋值兼容 派生类的创建和销毁构造函数拷贝构造赋值重载 1.继承的概念与定义 继承是面向对象编程中的一个重要概念。它的由来可以追溯到软件开发中的模块化设计和代码复用的需求。 在软件开发过程…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…