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.pswp.cn/diannao/80012.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80012.shtml
英文地址,請注明出處:http://en.pswp.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找不到的問題。…