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 = 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.mfbz.cn/a/763403.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据资产的创新应用与未来展望:探讨数据资产在人工智能、物联网等新兴领域的应用前景,提出前瞻性的数据资产解决方案,为企业探索新的增长点,推动行业创新发展

目录 一、引言 二、数据资产在人工智能领域的应用 1、机器学习与深度学习 2、自然语言处理 3、计算机视觉 三、数据资产在物联网领域的应用 1、智能家居 2、工业物联网 3、智慧城市 四、前瞻性的数据资产解决方案 1、构建统一的数据管理平台 2、加强数据安全和隐私…

OkHttp的源码解读1

介绍 OkHttp 是 Square 公司开源的一款高效的 HTTP 客户端&#xff0c;用于与服务器进行 HTTP 请求和响应。它具有高效的连接池、透明的 GZIP 压缩和响应缓存等功能&#xff0c;是 Android 开发中广泛使用的网络库。 本文将详细解读 OkHttp 的源码&#xff0c;包括其主要组件…

认识100种电路之耦合电路

在电子电路的世界中&#xff0c;耦合电路宛如一座精巧的桥梁&#xff0c;连接着各个功能模块&#xff0c;发挥着至关重要的作用。 【为什么电路需要耦合】 在复杂的电子系统中&#xff0c;不同的电路模块往往需要协同工作&#xff0c;以实现特定的功能。然而&#xff0c;这些模…

推荐算法学习笔记2.1:基于深度学习的推荐算法-基于共线矩阵的深度推荐算法-NeuralCF模型

NeuralCF模型 NeuralCF模型将矩阵分解和逻辑回归思想进行结合&#xff0c;利用神经网络分别学习用户和物品的隐向量表示&#xff08;Embedding&#xff09;&#xff0c;然后将矩阵分解中的内积互操作替换成神经网络计算&#xff0c;从而更好地从特征中学习到有用的信息。 原论…

【划分型动态规划 马拉车 中心扩展】2472. 不重叠回文子字符串的最大数目

如果有不明白的&#xff0c;请加文末QQ群。 本文涉及知识点 划分型动态规划 马拉车 中心扩展 LeetCode2472. 不重叠回文子字符串的最大数目 给你一个字符串 s 和一个 正 整数 k 。 从字符串 s 中选出一组满足下述条件且 不重叠 的子字符串&#xff1a; 每个子字符串的长度 …

SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测

SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测 目录 SCI一区 | Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.【SCI一区级】Matlab实现DBO-TCN-LSTM-Attention多变量时间序列预测&#xff08;程…

Golang | Leetcode Golang题解之第210题课程表II

题目&#xff1a; 题解&#xff1a; func findOrder(numCourses int, prerequisites [][]int) []int {var (edges make([][]int, numCourses)indeg make([]int, numCourses)result []int)for _, info : range prerequisites {edges[info[1]] append(edges[info[1]], info[0…

Tech Talk:智能电视eMMC存储的五问五答

智能电视作为搭载操作系统的综合影音载体&#xff0c;以稳步扩大的市场规模走入越来越多的家庭&#xff0c;成为人们生活娱乐的重要组成部分。存储部件是智能电视不可或缺的组成部分&#xff0c;用于保存操作系统、应用程序、多媒体文件和用户数据等信息。智能电视使用eMMC作为…

STM32自己从零开始实操08:电机电路原理图

一、LC滤波电路 其实以下的滤波都可以叫低通滤波器。 1.1倒 “L” 型 LC 滤波电路 1.1.1定性分析 1.1.2仿真实验 电感&#xff1a;通低频阻高频的。仿真中高频信号通过电感&#xff0c;因为电感会阻止电流发生变化&#xff0c;故说阻止高频信号 电容&#xff1a;隔直通交。…

光荚含羞草基因组-文献精读26

Haplotype-resolved genome of Mimosa bimucronata revealed insights into leaf movement and nitrogen fixation 光荚含羞草单倍型解析基因组揭示了叶片运动和固氮的相关机制 摘要 背景 光荚含羞草起源于热带美洲&#xff0c;具有独特的叶片运动特征&#xff0c;其运动速度…

【netty系列-04】反应堆模式的种类和具体实现

Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…

沙箱在“一机两用”新规下的价值体现

在数字化时代&#xff0c;随着企业信息化建设的深入&#xff0c;数据安全问题愈发凸显其重要性。一机两用新规的出台&#xff0c;旨在通过技术创新和管理手段&#xff0c;实现终端设备的安全可控&#xff0c;确保敏感数据的安全存储与传输。SDC沙箱技术作为一种创新的安全防护手…

NLP篇1

场景&#xff1a;假设给你一篇文章。 目标&#xff1a;说白了&#xff0c;就是数学的分类。但是如何实现分类呢。下面将逐步一 一 分析与拆解。先把目标定好了和整体框架定好了。而不是只见树木而不见森林。 情感分类&#xff08;好评、差评&#xff0c;中性&#xff09; 整体…

基于“香港世界”的SLAM技术介绍

在视觉感知技术中&#xff0c;理解和描述复杂的三维室外场景至关重要&#xff0c;尤其是自动驾驶技术的发展要求对陌生环境具有更强的适应能力和鲁棒性。传统上&#xff0c;使用“曼哈顿世界”和“亚特兰大世界”模型来描述具有垂直和水平结构的城市场景。 当遇到像香港这样地形…

burpsuite 设置监听窗口 火狐利用插件快速切换代理状态

一、修改burpsuite监听端口 1、首先打开burpsuite&#xff0c;点击Proxy下的Options选项&#xff1a; 2、可以看到默认的监听端口为8080&#xff0c;首先选中我们想要修改的监听&#xff0c;点击Edit进行编辑 3、将端口改为9876&#xff0c;并保存 4、可以看到监听端口修改成功…

云卓SKYDROID-H30——科技改变未来

云卓H30采用高通处理器、搭载安卓嵌入式系统&#xff0c;拥有三个工作频率&#xff0c;让图像更清晰、延迟更低、距离远、抗干扰性强&#xff0c;支持多种接口&#xff0c;更有10.1寸高清工业级阳光可视屏&#xff0c;防尘耐磨&#xff0c;结构强度高&#xff0c;适用于各种严苛…

前端利用vue如何实现导入和导出功能.md

1. 前端利用vue如何实现导入和到处功能 1.1. 导入功能&#xff08;以导入Excel文件为例&#xff09; 1.1.1. 实现步骤: 1.1.1.1. 安装依赖: 首先&#xff0c;你需要安装处理Excel文件的库&#xff0c;如xlsx。1.1.1.2. 创建上传组件: 使用Element UI的<el-upload>组件或其…

windows USB 驱动开发-URB结构

通用串行总线 (USB) 客户端驱动程序无法直接与其设备通信。 相反&#xff0c;客户端驱动程序会创建请求并将其提交到 USB 驱动程序堆栈进行处理。 在每个请求中&#xff0c;客户端驱动程序提供一个可变长度的数据结构&#xff0c;称为 USB 请求块 (URB) &#xff0c;URB 结构描…

zdppy_api+vue3+antd开发前后端分离的tab卡片

后端代码 import api import uploadsave_dir "uploads"async def rand_content(request):key api.req.get_query(request, "key")return api.resp.success(f"{key} " * 100)app api.Api(routes[api.resp.get("/", rand_content),u…

2024科技文化节程序设计竞赛

补题链接 https://www.luogu.com.cn/contest/178895#problems A. 签到题 忽略掉大小为1的环&#xff0c;答案是剩下环的大小和减环的数量 #include<bits/stdc.h> #include<iostream> #include<cstdio> #include<vector> #include<map> #incl…