如何用【Python】寫了一個水果忍者小游戲,玩過之後愛不釋手

来源:https://www.cnblogs.com/123456feng/archive/2022/04/13/16140011.html
-Advertisement-
Play Games

前言 水果忍者到家都玩過吧,但是Python寫的水果忍者你肯定沒有玩過。今天就給你表演一個新的,用Python寫一個水果忍者。 水果忍者的玩法很簡單,儘可能的切開拋出的水果就行。 今天就用python簡單的模擬一下這個游戲。在這個簡單的項目中,我們用滑鼠選擇水果來切割,同時炸彈也會隱藏在水果 中,如 ...


前言

水果忍者到家都玩過吧,但是Python寫的水果忍者你肯定沒有玩過。今天就給你表演一個新的,用Python寫一個水果忍者。

水果忍者的玩法很簡單,儘可能的切開拋出的水果就行。

今天就用python簡單的模擬一下這個游戲。在這個簡單的項目中,我們用滑鼠選擇水果來切割,同時炸彈也會隱藏在水果

中,如果切開了三次炸彈,玩家就會失敗。

在這裡插入圖片描述

一、需要導入的包

1.import pygame, sys


2.import os


3.import random

 

二、視窗界面設置

Python學習交流Q群:906715085###

1.# 游戲視窗


2.WIDTH = 800


3.HEIGHT = 500


4.FPS = 15             # gameDisplay的幀率,1/12秒刷新一次


5.pygame.init()


6.pygame.display.set_caption('水果忍者') # 標題


7.gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT)) # 固定視窗大小


8.clock = pygame.time.Clock()


9. 


10.# 用到的顏色


11.WHITE = (255,255,255)


12.BLACK = (0,0,0)


13.RED = (255,0,0)


14.GREEN = (0,255,0)


15.BLUE = (0,0,255)


16. 


17.background = pygame.image.load('背景.jpg') # 背景


18.font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42) # 字體


19.score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) # 得分字體樣式

 

在這裡插入圖片描述

三、隨機生成水果位置

Python學習交流Q群:906715085###
1.def generate_random_fruits(fruit):


2.    fruit_path = "images/" + fruit + ".png"


3.    data[fruit] = {


4.        'img': pygame.image.load(fruit_path),


5.        'x' : random.randint(100,500),


6.        'y' : 800,


7.        'speed_x': random.randint(-10,10),


8.        'speed_y': random.randint(-80, -60),


9.        'throw': False,


10.        't': 0,


11.        'hit': False,


12.    }


13. 


14.    if random.random() >= 0.75:


15.        data[fruit]['throw'] = True


16.    else:


17.        data[fruit]['throw'] = False


18. 


19.data = {}


20.for fruit in fruits:


21.    generate_random_fruits(fruit)

 

在這裡插入圖片描述

•這個函數用於隨機生成水果和保存水果的數據

•'x’和’y’存儲水果在x坐標和y坐標上的位置。

•Speed_x和speed_y是存儲水果在x和y方向的移動速度。它也控制水果的對角線移動。

•throw,用於判斷生成的水果坐標是否在游戲之外。如果在外面,那麼將被丟棄。

•data字典用於存放隨機生成的水果的數據。

四、繪製字體

1.font_name = pygame.font.match_font('comic.ttf')


2. 


3.def draw_text(display, text, size, x, y):


4.    font = pygame.font.Font(font_name, size)


5.    text_surface = font.render(text, True, WHITE)


6.    text_rect = text_surface.get_rect()


7.    text_rect.midtop = (x, y)


8.    gameDisplay.blit(text_surface, text_rect)

 

•Draw_text函數可以在屏幕上繪製文字。

•get_rect() 返回 Rect 對象。

•X和y是X方向和Y方向的位置。

•blit()在屏幕上的指定位置繪製圖像或寫入文字。

五、玩家生命的提示

1.# 繪製玩家的生命


2.def draw_lives(display, x, y, lives, image) :


3.for i in range(lives) :


4.img = pygame.image.load(image)


5.img_rect = img.get_rect()


6.img_rect.x = int(x + 35 * i)


7.img_rect.y = y


8.display.blit(img, img_rect)
1.def hide_cross_lives(x, y):


2.gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))

 

•img_rect獲取十字圖標的(x,y)坐標(位於最右上方)

•img_rect .x 設置下一個十字圖標距離前一個圖標35像素。

•img_rect.y負責確定十字圖標從屏幕頂部開始的位置。

•另外,搜索公眾號Linux就該這樣學後臺回覆“git書籍”,獲取一份驚喜禮包。

六、游戲開始與結束的畫面

1.def show_gameover_screen():


2.    gameDisplay.blit(background, (0,0))


3.    draw_text(gameDisplay, "FRUIT NINJA!", 90, WIDTH / 2, HEIGHT / 4)


4.    if not game_over :


5.        draw_text(gameDisplay,"Score : " + str(score), 50, WIDTH / 2, HEIGHT /2)


6. 


7.    draw_text(gameDisplay, "Press a key to begin!", 64, WIDTH / 2, HEIGHT * 3 / 4)


8.    pygame.display.flip()


9.    waiting = True


10.    while waiting:


11.        clock.tick(FPS)


12.        for event in pygame.event.get():


13.            if event.type == pygame.QUIT:


14.                pygame.quit()


15.            if event.type == pygame.KEYUP:


16.                waiting = False

 

•show_gameover_screen()函數顯示初始游戲畫面和游戲結束畫面。

•pygame.display.flip()將只更新屏幕的一部分,但如果沒有參數傳遞,則會更新整個屏幕。

•pygame.event.get()將返回存儲在pygame事件隊列中的所有事件。

•如果事件類型等於quit,那麼pygame將退出。

•event.KEYUP事件,當按鍵被按下和釋放時發生的事件。

在這裡插入圖片描述

七、游戲主迴圈

1.first_round = True


2.game_over = True        


3.game_running = True    


4.while game_running :


5.    if game_over :


6.        if first_round :


7.            show_gameover_screen()


8.            first_round = False


9.        game_over = False


10.        player_lives = 3


11.        draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')


12.        score = 0


13. 


14.    for event in pygame.event.get():


15. 


16.        if event.type == pygame.QUIT:


17.            game_running = False


18. 


19.    gameDisplay.blit(background, (0, 0))


20.    gameDisplay.blit(score_text, (0, 0))


21.    draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')


22. 


23.    for key, value in data.items():


24.        if value['throw']:


25.            value['x'] += value['speed_x']


26.            value['y'] += value['speed_y']


27.            value['speed_y'] += (1 * value['t'])


28.            value['t'] += 1


29. 


30.            if value['y'] <= 800:


31.                gameDisplay.blit(value['img'], (value['x'], value['y']))


32.            else:


33.                generate_random_fruits(key)


34. 


35.            current_position = pygame.mouse.get_pos()


36. 


37.            if not value['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 \


38.                    and current_position[1] > value['y'] and current_position[1] < value['y']+60:


39.                if key == 'bomb':


40.                    player_lives -= 1


41.                    if player_lives == 0:


42.                        hide_cross_lives(690, 15)


43.                    elif player_lives == 1 :


44.                        hide_cross_lives(725, 15)


45.                    elif player_lives == 2 :


46.                        hide_cross_lives(760, 15)


47.                  


48.                    if player_lives < 0 :


49.                        show_gameover_screen()


50.                        game_over = True


51. 


52.                    half_fruit_path = "images/explosion.png"


53.                else:


54.                    half_fruit_path = "images/" + "half_" + key + ".png"


55. 


56.                value['img'] = pygame.image.load(half_fruit_path)


57.                value['speed_x'] += 10


58.                if key != 'bomb' :


59.                    score += 1


60.                score_text = font.render('Score : ' + str(score), True, (255, 255, 255))


61.                value['hit'] = True


62.        else:


63.            generate_random_fruits(key)


64. 


65.    pygame.display.update()


66.    clock.tick(FPS)


67. 


68.pygame.quit()

 

在這裡插入圖片描述

•這是游戲的主迴圈

•如果超過3個炸彈被切掉,game_over終止游戲,同時迴圈。

•game_running 用於管理游戲迴圈。

•如果事件類型是退出,那麼游戲視窗將被關閉。

•在這個游戲迴圈中,我們動態顯示屏幕內的水果。

•如果一個水果沒有被切開,那麼它將不會發生任何事情。如果水果被切開,那麼一個半切開的水果圖像應該出現在該水果的地方

•如果用戶點擊了三次炸彈,將顯示GAME OVER信息,並重置視窗。

•clock.tick()將保持迴圈以正確的速度運行。迴圈應該在每1/12秒後更新一次

最後

大家都動手玩起來,這個小游戲還是特別不錯的,看看誰的手速快。今天的分享到這裡就沒有了,好想和大家一起玩水果忍者,

下一期見吧。

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 《零基礎學Java》 JDBC中常用的類和介面 利用JDBC的這些類和介面可以更方便地訪問並處理存儲在資料庫中的數據。 DriverManager類 DriverManager類 是JDBC的管理層,用來管理資料庫中的驅動程式。在使用Java操作資料庫之前,必須使用 Class類 的 靜態方法for ...
  • 來源:blog.csdn.net/qq_34886352/article/details/103581973 一、Nginx安裝 1、去官網http://nginx.org/下載對應的nginx包,推薦使用穩定版本 2、上傳nginx到linux系統 3、安裝依賴環境 (1)安裝gcc環境 yum ...
  • 前景介紹## 標題 最近小伙伴們聽歌的興趣大漲,網抑雲綜合症已經遍佈各地。 咱們再來抬高一波QQ音樂的熱度吧。 爬它! 目標:歌手列表 任務:將A到Z的歌手以及全部頁數的歌存到本地和資料庫 觀察網頁url結構 當我們進入網頁時發現此時是一個無參數的html網頁載入。 尋找我們想要拿到的位置尋找變化, ...
  • 一、線程的兩種調度模型: 1.分時調度模型:所有線程輪流使用CPU的使用權,平均分配每個線程占用CPU的時間片 2.搶占式調度模型:優先讓優先順序高的線程使用CPU,如果線程的優先順序相同,那麼會隨機選擇一個,優先順序高的線程獲取的CPU時間片相對多一點(Java使用的就是搶占式調度模型) 為什麼說搶占式 ...
  • 嵌套:將一系列字典存儲在列表中,或將列表作為值存儲在字典中,這稱為嵌套。既可以在列表中嵌套字典,也可以在字典中嵌套列表,甚至在字典中嵌套字典。 一、列表中嵌套字典 1)一般創建方式: student_A ={'name':'Allen','age':'14','grade':'8'} student ...
  • 第一章正則表達式 1.3 1.3.12 使用sub()和subn()搜索與替換 在最後一段,文中提到: “前面講到,使用匹配對象的group()方法除了能夠取出匹配分組編號外,還可以使用\N,其中 N 是在替換字元串中使用的分組編號。下麵的代碼僅僅只是將美式的日期表示法MM/DD/YY{,YY}格式 ...
  • 時間真是好快啊,又到每日跟大家分享Python小技巧的時候了,今天跟大家分享的是爬取豆瓣top250電影。這篇文章我會把源碼 以及視頻教程給大家,想學的小伙伴可以動手操辦起來。話不多說,這就來。 ## 1.python程式 Python學習交流Q群:906715085### #導入庫 import ...
  • 目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...