C语言实战:用Pygame打造高难度水果消消乐游戏

水果消消乐 - 困难模式

以下是一个基于PythonPygame的水果消消乐游戏实现,包含困难模式的特点:

import pygame
import random
import sys
from pygame.locals import *# 初始化
pygame.init()
pygame.mixer.init()# 游戏常量
FPS = 60
WINDOW_WIDTH = 800
WINDOW_HEIGHT = 600
GRID_SIZE = 8
CELL_SIZE = 60
GRID_OFFSET_X = (WINDOW_WIDTH - GRID_SIZE * CELL_SIZE) // 2
GRID_OFFSET_Y = (WINDOW_HEIGHT - GRID_SIZE * CELL_SIZE) // 2 + 20# 颜色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
BACKGROUND_COLOR = (230, 230, 250)
GRID_COLOR = (200, 200, 220)# 水果类型
FRUITS = ['apple', 'banana', 'orange', 'pear', 'watermelon', 'strawberry', 'grape']
FRUIT_COLORS = {'apple': (255, 50, 50),'banana': (255, 255, 100),'orange': (255, 165, 0),'pear': (150, 255, 150),'watermelon': (100, 200, 100),'strawberry': (255, 100, 150),'grape': (150, 50, 200)
}# 困难模式设置
TIME_LIMIT = 90  # 90秒时间限制
MOVE_LIMIT = 25  # 25步限制
TARGET_SCORE = 2000  # 目标分数class Fruit:def __init__(self, x, y, type):self.x = xself.y = yself.type = typeself.color = FRUIT_COLORS[type]self.selected = Falseself.scale = 1.0self.scale_direction = 1def draw(self, surface):rect = pygame.Rect(GRID_OFFSET_X + self.x * CELL_SIZE + 5,GRID_OFFSET_Y + self.y * CELL_SIZE + 5,CELL_SIZE - 10,CELL_SIZE - 10)if self.selected:pygame.draw.rect(surface, WHITE, rect, 3)# 绘制水果(简化版,实际游戏可以用图片)pygame.draw.ellipse(surface, self.color, rect)# 水果动画效果if self.scale < 0.95 or self.scale > 1.05:self.scale_direction *= -1self.scale += 0.005 * self.scale_directionclass Game:def __init__(self):self.clock = pygame.time.Clock()self.screen = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))pygame.display.set_caption('水果消消乐 - 困难模式')self.font = pygame.font.SysFont('Arial', 24)self.big_font = pygame.font.SysFont('Arial', 48)self.grid = [[None for _ in range(GRID_SIZE)] for _ in range(GRID_SIZE)]self.selected = Noneself.score = 0self.time_left = TIME_LIMITself.moves_left = MOVE_LIMITself.game_over = Falseself.win = Falseself.last_time = pygame.time.get_ticks()# 初始化网格self.initialize_grid()def initialize_grid(self):# 确保初始网格没有匹配项while True:for y in range(GRID_SIZE):for x in range(GRID_SIZE):self.grid[y][x] = Fruit(x, y, random.choice(FRUITS))if not self.check_matches(False):breakdef draw(self):self.screen.fill(BACKGROUND_COLOR)# 绘制网格背景for y in range(GRID_SIZE):for x in range(GRID_SIZE):rect = pygame.Rect(GRID_OFFSET_X + x * CELL_SIZE,GRID_OFFSET_Y + y * CELL_SIZE,CELL_SIZE,CELL_SIZE)pygame.draw.rect(self.screen, GRID_COLOR, rect, 1)# 绘制水果for row in self.grid:for fruit in row:if fruit:fruit.draw(self.screen)# 绘制游戏信息score_text = self.font.render(f'分数: {self.score}', True, BLACK)time_text = self.font.render(f'时间: {int(self.time_left)}秒', True, BLACK)moves_text = self.font.render(f'剩余步数: {self.moves_left}', True, BLACK)target_text = self.font.render(f'目标: {TARGET_SCORE}', True, BLACK)self.screen.blit(score_text, (20, 20))self.screen.blit(time_text, (20, 50))self.screen.blit(moves_text, (20, 80))self.screen.blit(target_text, (20, 110))# 游戏结束提示if self.game_over:if self.win:text = self.big_font.render('恭喜获胜!', True, (0, 200, 0))else:text = self.big_font.render('游戏结束!', True, (200, 0, 0))text_rect = text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2))self.screen.blit(text, text_rect)restart_text = self.font.render('按R键重新开始', True, BLACK)restart_rect = restart_text.get_rect(center=(WINDOW_WIDTH//2, WINDOW_HEIGHT//2 + 50))self.screen.blit(restart_text, restart_rect)pygame.display.flip()def handle_events(self):for event in pygame.event.get():if event.type == QUIT:pygame.quit()sys.exit()if event.type == KEYDOWN:if event.key == K_r and self.game_over:self.__init__()  # 重置游戏if not self.game_over and event.type == MOUSEBUTTONDOWN:x, y = event.posgrid_x = (x - GRID_OFFSET_X) // CELL_SIZEgrid_y = (y - GRID_OFFSET_Y) // CELL_SIZEif 0 <= grid_x < GRID_SIZE and 0 <= grid_y < GRID_SIZE:if self.selected is None:self.selected = (grid_x, grid_y)self.grid[grid_y][grid_x].selected = Trueelse:prev_x, prev_y = self.selected# 检查是否是相邻的格子if ((abs(grid_x - prev_x) == 1 and grid_y == prev_y) or (abs(grid_y - prev_y) == 1 and grid_x == prev_x)):# 交换水果self.swap_fruits(prev_x, prev_y, grid_x, grid_y)# 检查是否有匹配matches = self.check_matches()if not matches:# 如果没有匹配,交换回来self.swap_fruits(prev_x, prev_y, grid_x, grid_y)else:# 减少步数self.moves_left -= 1# 取消选择self.grid[prev_y][prev_x].selected = Falseself.selected = Nonedef swap_fruits(self, x1, y1, x2, y2):self.grid[y1][x1].x, self.grid[y2][x2].x = self.grid[y2][x2].x, self.grid[y1][x1].xself.grid[y1][x1].y, self.grid[y2][x2].y = self.grid[y2][x2].y, self.grid[y1][x1].yself.grid[y1][x1], self.grid[y2][x2] = self.grid[y2][x2], self.grid[y1][x1]def check_matches(self, remove=True):matches = []# 检查水平匹配for y in range(GRID_SIZE):for x in range(GRID_SIZE - 2):if (self.grid[y][x] and self.grid[y][x+1] and self.grid[y][x+2] andself.grid[y][x].type == self.grid[y][x+1].type == self.grid[y][x+2].type):match = [(x, y), (x+1, y), (x+2, y)]# 检查更长的匹配for i in range(x+3, GRID_SIZE):if self.grid[y][i] and self.grid[y][i].type == self.grid[y][x].type:match.append((i, y))else:breakmatches.append(match)# 检查垂直匹配for x in range(GRID_SIZE):for y in range(GRID_SIZE - 2):if (self.grid[y][x] and self.grid[y+1][x] and self.grid[y+2][x] andself.grid[y][x].type == self.grid[y+1][x].type == self.grid[y+2][x].type):match = [(x, y), (x, y+1), (x, y+2)]# 检查更长的匹配for i in range(y+3, GRID_SIZE):if self.grid[i][x] and self.grid[i][x].type == self.grid[y][x].type:match.append((x, i))else:breakmatches.append(match)if remove and matches:# 移除匹配的水果并计算分数removed = set()for match in matches:for x, y in match:if (x, y) not in removed:removed.add((x, y))self.score += 10 * len(match)  # 匹配越长分数越高# 移除水果并填充新水果for x, y in sorted(removed, key=lambda pos: pos[1]):# 从上方掉落水果for dy in range(y, 0, -1):self.grid[dy][x] = self.grid[dy-1][x]if self.grid[dy][x]:self.grid[dy][x].y = dy# 顶部添加新水果self.grid[0][x] = Fruit(x, 0, random.choice(FRUITS))# 递归检查新的匹配self.check_matches()return len(matches) > 0def update(self):if self.game_over:return# 更新时间current_time = pygame.time.get_ticks()if current_time - self.last_time > 1000:  # 每秒更新一次self.time_left -= 1self.last_time = current_time# 检查游戏结束条件if self.time_left <= 0 or self.moves_left <= 0:self.game_over = Trueself.win = self.score >= TARGET_SCOREif self.score >= TARGET_SCORE:self.game_over = Trueself.win = Truedef run(self):while True:self.handle_events()self.update()self.draw()self.clock.tick(FPS)if __name__ == '__main__':game = Game()game.run()

困难模式特点

  1. 时间限制:玩家只有90秒时间来完成游戏

  2. 步数限制:最多只能进行25步操作

  3. 高目标分数:需要达到2000分才能获胜

  4. 连锁反应:消除水果后会自动检查新的匹配,增加了策略性

  5. 惩罚机制:无效的交换不会消耗步数,但有效的交换会减少剩余步数

如何运行

  1. 确保安装了PythonPygame库pip install pygame

  2. 复制上面的代码到一个.py文件中

  3. 运行该文件

游戏操作说明

  1. 点击一个水果选中它(会显示白色边框)

  2. 点击相邻的水果进行交换

  3. 如果交换后形成3个或更多相同水果的直线,它们会被消除并获得分数

  4. 无效的交换会自动回退

  5. 游戏目标是在限时和限步数内达到目标分数

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

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

相关文章

Doris-BrokerLoad任务监控

BrokeLoad监控 #!/bin/bash target_label$1 user$2 password$3looptrue echo "开始循环了----------------------" while ${loop} dolabel$(mysql -h FE_IP -P9030 -urealtime -ppassword -D offline -e "show load where label${target_label}")if [ -z &…

企业微信私域运营,基于http协议实现SCRM+AI完整解决方案

1、方案介绍 基于企业微信原生功能已实现全场景的能力覆盖&#xff0c;并提供标准化可直接调用的API接口&#xff0c;可以帮助企业轻松实现上层应用的开发及落地&#xff0c;方案采用模拟通信技术可实现PC&#xff0c;手机&#xff0c;ipad三端的同时在线&#xff0c;单服务器…

Oracle Linux8 安装 MySQL 8.4.3,搭建一主一从

文章目录 安装依赖获取安装包解压准备相关目录设置配置文件启动数据库连接数据库socket 文件优化同样方法准备 3307 数据库实例设置配置文件启动 3307 实例数据库连接并查看 3307 数据库实例基于 bin log 搭建主从模式 安装依赖 yum install -y numactl libaio ncurses-compat…

Dataway在Spring Boot中的引入以及使用教程

Dataway是Hasor生态中的接口配置工具&#xff0c;能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式&#xff0c;可将SQL转换为DataQL执行&#xff0c;简化数据查询与交互&#xff0c;无需编写大量代码。接口配置完成后&#xff0c;可进行自测、冒烟测试&#xff0…

进程互斥的软件实现方法

单标志法 算法思想&#xff1a;两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予 int turn 0; //turn 表示当前允许进入临界区的进程号P0 进程&#xff1a; while (turn ! 0); ① //进入区 critical …

力扣150题-- 汇总区间和合并区间

Day 27 题目描述 思路 做法&#xff1a; 特殊处理空数组和数组只有一个元素的情况设置beg&#xff0c;end标记范围的起始和结束&#xff0c;x用来比较元素是否有序&#xff08;初始end和beg都指向nums[0[,x为nums[0]1&#xff09;遍历数组如果当前元素等于x&#xff0c;说明…

【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 当你想放弃时&#xff0c;想想为什么当初坚持走到了这里 ★★★ 本文前置知识&#xff1a; 类和对象&#xff08;上&#xff09; 类和对…

Spark-Streaming简介和核心编程

Spark-Streaming简介 概述&#xff1a;用于流式数据处理&#xff0c;支持Kafka、Flume等多种数据输入源&#xff0c;可使用Spark原语运算&#xff0c;结果能保存到HDFS、数据库等。它以DStream&#xff08;离散化流&#xff09;为抽象表示&#xff0c;是RDD在实时场景的封装&am…

verilog中的约束信息

1、保持约束 keep&#xff1a;当编译器在对FPGA设计进行映射时&#xff0c;一些线网将会被吸收到逻辑块中。 (* KEEP "{TRUE | FALSE}" *) keep_hierarchy:vivado默认会把设计变成一级一级模块化的调用转换为一个没有子模块的超大模块。这个约束会保留部分层级关系…

Missashe考研日记-day24

Missashe考研日记-day24 1 专业课408 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天把剩下的两个经典同步问题和管程部分的课看了&#xff0c;然后做课后习题。这部分的重点在PV大题&#xff0c;很多很经典&#xff0c;不过第一轮不打算做大题&#xff0c;把选择题做…

力扣每日打卡17 49. 字母异位词分组 (中等)

力扣 49. 字母异位词分组 中等 前言一、题目内容二、解题方法1. 哈希函数2.官方题解2.1 前言2.2 方法一&#xff1a;排序2.2 方法二&#xff1a;计数 前言 这是刷算法题的第十七天&#xff0c;用到的语言是JS 题目&#xff1a;力扣 49. 字母异位词分组 (中等) 一、题目内容 给…

C#抽象类和虚方法的作用是什么?

抽象类 (abstract class)&#xff1a; 不能直接实例化&#xff0c;只能被继承。 用来定义一套基础框架和规范&#xff0c;强制子类必须实现某些方法&#xff08;抽象方法&#xff09;。 可用来封装一些共通的逻辑&#xff0c;减少代码重复。 虚方法 (virtual)&#xff1a; …

PowerBi中ALLEXCEPT怎么使用?

在 Power BI 的 DAX 中&#xff0c;ALLEXCEPT() 是一个非常重要的函数&#xff0c;用来实现**“在保留部分筛选条件的前提下&#xff0c;移除其他所有筛选器”**&#xff0c;它常用于 同比、占比、累计汇总 等分析中。 ✅ 一、ALLEXCEPT 是什么意思&#xff1f; 函数全称&…

IQ信号和实信号的关系与转换的matlab实现

IQ信号 IQ信号通常是指两路正交的信号(I路和Q路),在实际信号采样中,通常会进行IQ采样,将实信号转换为复基带信号进行存储。 IQ信号转实信号 IQ信号转为实信号,其实就是将IQ两路正交信号通过上变频合并为一个实数的带通信号,这通常在通信系统中用于将基带信号调制到载…

【锂电池剩余寿命预测】LSTM长短期记忆神经网络锂电池剩余寿命预测(Matlab源码)

目录 效果一览程序获取程序内容代码分享研究内容基于LSTM长短期记忆神经网络的锂电池剩余寿命预测摘要关键词1. 引言1.1 研究背景1.2 研究现状与问题1.3 研究目的与意义2. 文献综述2.1 锂电池剩余寿命预测方法概述2.2 传统预测方法的优势与不足2.3 LSTM在锂电池寿命预测中的应用…

具身智能的理论基础

引言 在人工智能与认知科学快速发展的背景下&#xff0c;“具身智能”&#xff08;Embodied Intelligence&#xff09;这一概念日益受到重视。具身智能是指智能体的认知能力不仅源于其大脑&#xff08;或中央处理单元&#xff09;&#xff0c;更根植于其身体的结构、感官与其所…

【数据结构】励志大厂版·初级(二刷复习)双链表

前引&#xff1a;今天学习的双链表属于链表结构中最复杂的一种&#xff08;带头双向循环链表&#xff09;&#xff0c;按照安排&#xff0c;我们会先进行复习&#xff0c;如何实现双链表&#xff0c;如基本的头插、头删、尾删、尾插&#xff0c;掌握每个细节&#xff0c;随后进…

CSS `display` 属性详解(完整版)

CSS display 属性详解&#xff08;完整版&#xff09; 1. 属性值及特性详解 display 属性控制元素的布局类型和生成的框类型&#xff0c;以下是 所有有效值 及其特性&#xff1a; 1.1 基础类型 值描述布局行为是否生成块级框典型用途block元素独占一行&#xff0c;宽度自动撑…

【数据结构 · 初阶】- 堆的实现

目录 一.初始化 二.插入 三.删除&#xff08;堆顶、根&#xff09; 四.整体代码 Heap.h Test.c Heap.c 我们使用顺序结构实现完全二叉树&#xff0c;也就是堆的实现 以前学的数据结构只是单纯的存储数据。堆除了存储数据&#xff0c;还有其他的价值——排序。是一个功能…

qt.tlsbackend.ossl: Failed to load libssl/libcrypto.

我的环境是windows&#xff0c;QT6.3.2&#xff08;msvc2019_64/mingw_64&#xff09; 出错原因 QT没有正确加载OpenSSL。 解决过程 1、确保安装的有openssl。 文章结尾有个注意&#xff0c;是其他方式安装过openssl&#xff0c;环境变量有&#xff0c;但是QT找不到的问题。…