用python和pygame庫實現刮刮樂游戲

用python和pygame庫實現刮刮樂游戲

首先,確保你已經安裝了pygame庫。如果沒有安裝,可以通過以下命令安裝:

pip install pygame

示例有兩個。

一、簡單刮刮樂游戲

準備兩張圖片,一張作為背景bottom_image.png,一張作為刮開的圖片top_image.png:

請將bottom_image.png和top_image.png圖片文件與游戲代碼文件(.py文件)放在在同一目錄下。

以下是簡單刮刮樂游戲的代碼:

import pygame
import os# 初始化pygame
pygame.init()# 設置游戲窗口
width, height = 356, 358
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('刮刮樂游戲')# 定義顏色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)# 確保圖片文件存在
if not os.path.isfile('bottom_image.png') or not os.path.isfile('top_image.png'):raise Exception("圖片文件未找到,請確保bottom_image.png和top_image.png文件在同一目錄下。")# 加載圖片
bottom_image = pygame.image.load('bottom_image.png').convert()
top_image = pygame.image.load('top_image.png').convert_alpha()# 調整圖片大小以適應窗口
bottom_image = pygame.transform.scale(bottom_image, (width, height))
top_image = pygame.transform.scale(top_image, (width, height))# 創建一個與頂層圖片相同大小的透明表面
scratch_surface = pygame.Surface((width, height), pygame.SRCALPHA)# 將頂層圖片繪制到透明表面上
scratch_surface.blit(top_image, (0, 0))# 游戲主循環
running = True
while running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 獲取鼠標位置和狀態mouse_pos = pygame.mouse.get_pos()mouse_pressed = pygame.mouse.get_pressed()# 如果按下鼠標左鍵,則在透明表面上繪制透明圓形,模擬刮開效果if mouse_pressed[0]:  # 檢測鼠標左鍵是否按下pygame.draw.circle(scratch_surface, (0, 0, 0, 0), mouse_pos, 20)# 繪制背景圖片screen.blit(bottom_image, (0, 0))# 繪制刮開的透明表面screen.blit(scratch_surface, (0, 0))# 更新屏幕pygame.display.flip()# 退出游戲
pygame.quit()

運行效果:

二、多對圖片的刮刮樂游戲

使用多對圖片,準備了好了多對圖片,如bottom1.png和top1.png 、 bottom2.png和top2.png 、 bottom2.png和top3.png,并將它們放到了img文件夾中。用戶可以選擇圖對游戲,游戲過程中可按下ESC 鍵返回到菜單頁開始重玩。

項目的目錄(project_directory)結構如下:

源碼如下:

import pygame
import os
import sys# 初始化pygame
pygame.init()# 設置游戲窗口
width, height = 356, 358
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('刮刮樂游戲(可選擇圖片對)')# 定義顏色
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)# 圖片對列表
image_pairs = [("img/bottom1.png", "img/top1.png"),("img/bottom2.png", "img/top2.png"),("img/bottom3.png", "img/top3.png")
]# 加載圖片
def load_images(pair_index):bottom_image_path, top_image_path = image_pairs[pair_index]bottom_image = pygame.image.load(bottom_image_path).convert()top_image = pygame.image.load(top_image_path).convert_alpha()bottom_image = pygame.transform.scale(bottom_image, (width, height))top_image = pygame.transform.scale(top_image, (width, height))return bottom_image, top_image# 游戲主函數
def run_game(bottom_image, top_image):scratch_surface = pygame.Surface((width, height), pygame.SRCALPHA)scratch_surface.blit(top_image, (0, 0))running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 檢測鍵盤事件以返回菜單elif event.type == pygame.KEYDOWN:if event.key == pygame.K_ESCAPE:  # 按下ESC鍵return  # 返回到菜單,而不是退出游戲mouse_pos = pygame.mouse.get_pos()mouse_pressed = pygame.mouse.get_pressed()if mouse_pressed[0]:pygame.draw.circle(scratch_surface, (0, 0, 0, 0), mouse_pos, 20)screen.blit(bottom_image, (0, 0))screen.blit(scratch_surface, (0, 0))pygame.display.flip()# 菜單函數
def menu():font = pygame.font.Font(None, 26)    menu_running = Truetext_surfaces = []text_rects = []for i, pair in enumerate(image_pairs):text = font.render(f"[ Image {i+1} ]", True, RED)text_rect = text.get_rect(topleft=(10, 40 + i * 30))text_surfaces.append(text)text_rects.append(text_rect)while menu_running:screen.fill(WHITE)text = font.render(f"Press Esc to return to the menu:", True, BLACK)text_rect = text.get_rect(topleft=(10, 5))screen.blit(text, text_rect)for i, text in enumerate(text_surfaces):screen.blit(text, text_rects[i])pygame.display.flip()for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:  # Left clickfor i, rect in enumerate(text_rects):if rect.collidepoint(event.pos):bottom_image, top_image = load_images(i)run_game(bottom_image, top_image)# 在這里不需要設置menu_running = False,因為我們希望在游戲結束后自動返回菜單# 運行菜單
menu()

運行效果如下圖所示:

用戶可以單擊菜單項選擇圖對游戲,游戲過程中可按下ESC 鍵返回到菜單頁開始重玩。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Leetcoder Day35| 動態規劃part02

62.不同路徑 一個機器人位于一個 m x n 網格的左上角 (起始點在下圖中標記為 “Start” )。 機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為 “Finish” )。 問總共有多少條不同的路徑&#xff…

如何在Linux配置C、C++、Go語言的編譯環境?

在 Linux 系統上配置 C、C、Go 語言的編譯環境可以通過安裝相應的編譯器和相關工具來實現。以下是在 Linux 系統上配置這些語言的編譯環境的一般步驟: 1. C 和 C 編譯環境配置: 安裝 GCC 編譯器(一般 Linux 發行版都會包含)&…

Android 顯示系統框架

一.FrameBuffer FrameBuffer 介紹: FrameBuffer中文譯名為幀緩沖驅動,它是出現在2.2.xx內核中的一種驅動程序接口。主設備號為29,次設備號遞增。 Linux抽象出FrameBuffer這個設備來供用戶態進程實現直接寫屏。FrameBuffer機制模仿顯卡的功能…

Day11:信息打點-Web應用企業產權指紋識別域名資產網絡空間威脅情報

目錄 Web信息收集工具 業務資產-應用類型分類 Web單域名獲取-接口查詢 Web子域名獲取-解析枚舉 Web架構資產-平臺指紋識別 思維導圖 章節知識點: Web:語言/CMS/中間件/數據庫/系統/WAF等 系統:操作系統/端口服務/網絡環境/防火墻等 應用…

dart中的事件隊列與微任務

dart在每個事件循環中,會先執行同步任務代碼,然后分別檢查兩個任務隊列:微任務隊列和事件隊列。dart總是先執行微任務隊列中的代碼,然后才是事件隊列中的代碼。當兩個隊列中的任務都執行完成后,線程進入休眠狀態&#…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在嘗試調用Stable Diffusion WebUI API的時候,打開http://127.0.0.1:7860/docs遇到了以下頁面 網絡診斷是這樣的原因: 修bug,改來改去遇到了以下兩種頁面: 此時http://127.0.0.1:7860可以如下正常顯示: 查資料的時候找…

vue+springboot項目部署服務器

項目倉庫:vuespringboot-demo: vuespringboot增刪改查的demo (gitee.com) ①vue中修改配置 在public文件夾下新建config.json文件: {"serverUrl": "http://localhost:9090"//這里localhost在打包后記得修改為服務器公網ip } 然后…

[NSSCTF 2nd] web復現

1.php簽到 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, $value)){return false;}}return true; }if(i…

nginx 配置瀏覽器不緩存文件 每次都會從服務器 請求新的文件

目錄 解決問題方法說明 測試html環境js環境第一步然后修改內容 打開帶有js緩存的頁面強制刷新 配置nginx 每次打開頁面都會重新請求index.js 文件重啟nginx再次修改index.js 總結設置為全局 解決問題 適用于實時更新數據的&#xff0c;網頁 可以讓用戶每次都是重新請求&#x…

C語言中的套娃——函數遞歸

目錄 一、什么是遞歸 1.1.遞歸的思想 1.2.遞歸的限制條件 二、舉例體會 2.1.求n的階乘 2.2.順序打印整數的每一位 2.3.斐波那契數列 三、遞歸與迭代 一、什么是遞歸 在學習C語言的過程中&#xff0c;我們經常會跟遞歸打交道&#xff0c;什么是遞歸呢&#xff1f;它其實…

LNMP 架構

環境準備&#xff1a;lnmp 需要安裝 nginx mysql php 論壇/博客 軟件 使用LNMP架構搭建 論壇 1. 關閉防火墻和和核心防護 systemctl disable --now firewalld setenforce 0 2. 編譯安裝 nginx 安裝依賴包 yum -y install pcre-devel zlib-devel gcc gcc-c make 創建…

在Redhat 7 Linux上安裝llama.cpp [ 錯誤stdatomic.h: No such file or directory]

前期準備 在github上下載llama.cpp或克隆。 GitHub - ggerganov/llama.cpp: LLM inference in C/C ? git clone https://github.com/ggerganov/llama.cpp.gitcd llama.cpp 執行make命令編譯llama.cpp make 在huggingface里下載量化了的 gguf格式的llama2模型。 https:/…

每日一練:筆試題復盤-LeeCode原題-判斷二叉樹兩數之和-->找到滿足二叉樹兩數之和的所有路徑

用Java實現&#xff0c;給定一個二叉樹root和一個值 sum &#xff0c;找到從根節點到葉子節點的節點值之和等于 sum 的路徑。 1.該題路徑定義為從樹的根結點開始往下一直到葉子結點所經過的結點 2.葉子節點是指沒有子節點的節點 3.路徑只能從父節點到子節點&#xff0c;不能從子…

Compiling from source on UNIX(cmake doxygen ant maven ccache)

前言 源碼鏈接 cmake-3.18.0 https://cmake.org/files/v3.18/cmake-3.18.0.tar.gzdoxygen-1.10.0 https://www.doxygen.nl/files/doxygen-1.10.0.src.tar.gzapache-ant-1.10.8-bin https://archive.apache.org/dist/ant/binaries/apache-ant-1.10.8-bin.tar.gzapache-maven-3…

#WEB前端(表單)

1.實驗&#xff1a; form、input、label 登錄界面&#xff0c;表單填寫界面 2.IDE&#xff1a;VSCODE 3.記錄&#xff1a; 4.代碼&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

RedisTemplate中opaForValue.set的注意之處

問題 原本寫了一個小項目&#xff0c;想通過redis緩存實現登錄退出功能&#xff0c;結果出現了莫名奇妙的問題 代碼如下&#xff1a; 報錯&#xff1a; 經過多次調試之后我發現是opsForValue.set(key,value,expireTime)這行代碼的問題&#xff0c;沒有指定過期時間的單位&…

備戰藍橋杯---動態規劃之懸線法

Em...屬于一知道就會&#xff0c;不知道的話比較難想。 我們先看題&#xff1a; 我們不妨把1抽象成一個平面上的點&#xff0c;因此可以變成這一幅圖&#xff1a; 我們假設每一個點被向上牽拉了一根線&#xff1a; 顯然&#xff0c;每一條懸線都有可能成為邊界限制&#xff0c…

JS值和引用

在javaScript中&#xff0c;數據類型整體上可以分為兩大類&#xff1a;基本數據類型和引用數據類型 基本數據類型&#xff1a; string , symbol , number , boolean , undefined , null 引用數據類型&#xff1a; object 1.簡單值&#xff08;原始值&#xff09; 由于簡單…

職業生涯知識回顧-關于抽象類和接口的思考

抽象類和接口是兩個很容易產生疑惑的概念&#xff0c;分不清它們的使用場景&#xff0c;其實只要記住兩點就比較好理解&#xff1a; 接口是對行為的抽象抽象類是對子類有哪些屬性和行為的抽象 當你需要對一個類有哪些行為進行約束時&#xff0c;使用接口&#xff1b;需要為其…

Bulingbuling - 《歷史的教訓》 [ The Lessons of History ]

《歷史的教訓》 兩位當代最偉大思想家的著名論文集&#xff0c;匯集了 5000 多年的歷史 作者&#xff1a;威爾-杜蘭特和阿里爾-杜蘭特 The Lessons of History The celebrated collection of essays compiling over 5,000 years of history by two of the greatest thinkers …