Python实现接糖果小游戏

news2024/11/16 5:55:01

介绍:

基于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 = None
    clock = pygame.time.Clock()  # 添加一个时钟对象来控制帧率
    while not selected_difficulty:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return None
            elif 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_score
    file_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 = 0


def save_highest_score():
    global highest_score
    file_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 = False
        elif 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 and
                basket_y - candy_height < candy[1] < basket_y):
            score += 1
            candies.remove(candy)

    # 在游戏结束时保存最高分数
    if not candies and score > highest_score:
        highest_score = score
        save_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.coloradmin.cn/o/1885066.html

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

相关文章

抖音矩阵云混剪系统源码 短视频矩阵营销系统V2(全开源版)

>>>系统简述&#xff1a; 抖音阵营销系统多平台多账号一站式管理&#xff0c;一键发布作品。智能标题&#xff0c;关键词优化&#xff0c;排名查询&#xff0c;混剪生成原创视频&#xff0c;账号分组&#xff0c;意向客户自动采集&#xff0c;智能回复&#xff0c;多…

Python基础小知识问答系列-可迭代型变量赋值

1. 问题&#xff1a; 怎样简洁的把列表中的元素赋值给单个变量&#xff1f; 当需要列表中指定几个值时&#xff0c;剩余的变量都收集在一起&#xff0c;该怎么进行变量赋值&#xff1f; 当只需要列表中指定某几个值&#xff0c;其他值都忽略时&#xff0c;该怎么…

拓扑排序[讲课留档]

拓扑排序 拓扑排序要解决的问题是给一个有向无环图的所有节点排序。 即在 A O E AOE AOE网中找关键路径。 前置芝士&#xff01; 有向图&#xff1a;有向图中的每一个边都是有向边&#xff0c;即其中的每一个元素都是有序二元组。在一条有向边 ( u , v ) (u,v) (u,v)中&…

数字营销执行团队的重要性及如何配置

在当今数字化商业环境中&#xff0c;数字营销执行团队的重要性不言而喻。 其重要性主要体现在以下几点&#xff1a;一是能精准触达目标客户&#xff0c;借助数据分析实现精准营销&#xff0c;提高营销效率和效果。二是紧跟数字技术发展潮流&#xff0c;及时采用新的营销手段和…

基于OpenCV与Keras的停车场车位自动识别系统

本项目旨在利用计算机视觉技术和深度学习算法&#xff0c;实现对停车场车位状态的实时自动识别。通过摄像头监控停车场内部&#xff0c;系统能够高效准确地辨认车位是否被占用&#xff0c;为车主提供实时的空闲车位信息&#xff0c;同时为停车场管理者提供智能化的车位管理工具…

【JVM-04】线上CPU100%

【JVM-04】线上CPU100% 1. 如何排查 1. 如何排查 ⼀般CPU100%疯狂GC&#xff0c;都是死循环的锅&#xff0c;那怎么排查呢&#xff1f;先进服务器&#xff0c;⽤top -c 命令找出当前进程的运⾏列表按⼀下 P 可以按照CPU使⽤率进⾏排序显示Java进程 PID 为 2609 的java进程消耗…

清新简约卡片风格蓝紫渐变色短视频苹果CMS模板

首途第三十三套清新简约卡片风格蓝紫渐变色短视频模板&#xff0c;一套苹果CMSV10主题。 这套主题是简约风格&#xff0c;以纯洁的白色和深邃的紫色为主色调&#xff0c;为您提供了一种清新、时尚的浏览体验。 在这个简洁而美丽的界面中&#xff0c;您可以轻松畅享各种精彩短…

【微服务】微服务之Feign 与 Ribbon

文章目录 强烈推荐引言优点Feign示例什么是Ribbon&#xff1f;Ribbon 的优点Netflix Feign 和 Ribbon整合Feign 与 Ribbon 的关系Feign 与 Ribbon 结合使用的示例配置文件&#xff08;application.yml&#xff09;说明&#xff1a; Feign 与 Ribbon 结合使用的应用场景1. 动态服…

Win10系统登录界面两个相同用户名的处理方法

在Windows 10系统中只设置了一个帐户&#xff0c;即本地帐户Administrator&#xff0c;但由于一些应用对帐户的要求&#xff0c;会切换到微软帐户登录&#xff0c;而切换之后&#xff0c;在登录界面就会显示微软帐户的名称&#xff0c;故Windows 10系统在登录界面会显示两个相同…

windows网络进阶之listen参数含义

目录 一、前言 二、listen参数 三、实战案例 1. 使用Sleep函数让线程暂停 2. 案例代码展示 3. 编译生成exe文件 一、前言 一、前言 在Windows网络编程中&#xff0c;在使用TCP时&#xff0c;listen函数它是一个重要的关键的步骤&#xff0c;使得套接字能够接收传…

【C++】使用C++在线程中动态记录数据到外部文件

在现代软件开发中&#xff0c;多线程编程已成为处理并发任务、提高程序性能的重要手段。而在多线程环境下&#xff0c;如何有效地管理和记录数据&#xff0c;尤其是将动态生成的数据安全地写入外部文件&#xff0c;是许多应用程序必须面对的问题。本文将深入探讨如何在C中使用多…

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中&#xff0c;我钟情于node&#xff0c;高效的异步处理真是让我眼前一亮&#xff0c;同时&#xff0c;简单易懂的语法也让我非常倾心 但是但是&#xff0c;因为考虑要写一个深度学习算法的后端接口&#xff0c;所以不得不选用python作为…

传神论文中心|第15期人工智能领域论文推荐

在人工智能领域的快速发展中&#xff0c;我们不断看到令人振奋的技术进步和创新。近期&#xff0c;开放传神&#xff08;OpenCSG&#xff09;社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自的论…

【linux】虚拟机安装 BCLinux-R8-U4-Server-x86_64

目录 一、概述 1.1移动云Linux系统订阅服务 CLS 1.2 大云天元操作系统BC-Linux 二、安装 一、概述 1.1移动云Linux系统订阅服务 CLS 移动云Linux系统订阅服务 CLS &#xff08;Cloud Linux Service&#xff09;为使用BC-Linux操作系统的用户提供标准维保服务以及高级技术支…

JVM原理(九):JVM虚拟机工具之可视化故障处理工具

1. JHSDB:基于服务性代理的调试工具 JHSDB是一款基于服务性代理实现的进程外调试工具。 服务性代理是HotSpot虚拟机中一组用于映射Java虚拟机运行信息的、主要基于Java语言实现的API集合。 2. JConsole:Java监视与管理控制台 JConsole是一款基于JMX的可视化监视、管理工具。…

矩阵、混剪、大盘,3大功能升级优化!助力企业高效管理!

在数字化转型的浪潮中&#xff0c;企业对于工具与技术的需求愈发强烈。 为满足市场需求&#xff0c;本月【云略】为各企业上线了便捷功能&#xff0c;赋能企业经营决策和业务增长。 矩阵管理 √【矩阵号管理】抖音支持设置城市IP 内容管理 √【混剪任务】支持关联智能发布计…

模拟 ADC 的前端

ADC 的 SPICE 模拟 反复试验的方法将信号发送到 ADC 非常耗时&#xff0c;而且可能有效也可能无效。如果转换器捕获电压信息的关键时刻模拟输入引脚不稳定&#xff0c;则无法获得正确的输出数据。SPICE 模型允许您执行的步是验证所有模拟输入是否稳定&#xff0c;以便没有错误…

百家讲坛 | 裴伟伟:企业中安全团队应当如何反馈漏洞

作者简介&#xff1a;裴伟伟&#xff0c;洞源实验室创始人&#xff0c;国家网安基地网络安全行业专家&#xff0c;网安加社区特聘专家&#xff0c;持有CISSP、PMP证书&#xff0c;曾在HITCON、可信云大会、开源产业大会等安全论坛发表演讲。曾任国内某安全实验室负责人、某互金…

3.js - 色调映射(renderer.toneMapping)

// ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import * as TWEEN…

Stable DIffusion 线稿上色+风格迁移教程,建议收藏!

前言 Stable Diffusion 线稿上色与风格迁移教程。 欢迎来到Stable Diffusion的线稿上色与风格迁移教程&#xff01;在这个教程中&#xff0c;我们将引导你如何使用Stable Diffusion技术&#xff0c;将你的线稿作品进行上色&#xff0c;并迁移到不同的艺术风格。让我们开始吧&a…