軟工第二次個人作業

KaiInssy發表於2024-10-12

軟工第二次個人作業

這個作業屬於哪個課程 https://edu.cnblogs.com/campus/fzu/SE2024
這個作業要求在哪裡 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253
這個作業的目標 使用Python編寫一個“羊了個羊”風格的消除類小遊戲
學號 102202106

Github倉庫

目錄
  • 一.使用AICG工具生成需要圖片
    • AICG工具:豆包AI
    • 美工圖片展示
  • 二.任務規劃
    • 1.任務一
    • 2.任務二
    • 3.任務三
    • 4.任務四
  • 三.遊戲展示
    • 1.靜態展示
      • 主頁面
      • 遊戲主體
      • 遊戲勝利
      • 遊戲失敗
    • 2.動態展示
      • 選擇難度模式
      • 遊戲主要部分
  • 四.專案介紹
    • 實現思路
    • 前端設計
    • 技術與演算法
    • 監測用例
    • 遊戲評價
      • 優點
      • 改進
    • AIGC表格
  • 五.體驗與過程
    • AIGC的優點
    • AIGC的缺點
    • 學習內容與收穫
    • PSP表格
  • 六.個人總結
    • 體會與心得
      • 1.技術方面
      • 2.使用AIGC的體驗
    • 個人總結

一.使用AICG工具生成需要圖片

AICG工具:豆包AI

美工圖片展示


二.任務規劃

1.任務一

構思遊戲功能,設計兩個難度模式,設計遊戲主選單

2.任務二

設計遊戲主體,實現圖案的生成與分層擺放,確保圖案能夠被合理匹配和消除,實現三個相同影像消除

3.任務三

設定計時器,需要在規定時間內消除所有影像

4.任務四

設定計分器,每消除3個影像則積1分

三.遊戲展示

1.靜態展示

主頁面

遊戲主體

遊戲勝利

遊戲失敗

2.動態展示

選擇難度模式

遊戲主要部分

四.專案介紹

實現思路

  1. 初始化設定
    匯入庫:匯入pgzrun、pygame和random庫。
    常量定義:定義倒數計時、視窗尺寸、牌的尺寸等常量。
    初始化pygame:初始化pygame並設定定時器事件。
    全域性變數:定義遊戲狀態、計分、滑鼠位置等全域性變數。
  2. 遊戲初始化函式initialize_game()
    重置遊戲狀態:重置牌組、牌堆、分數、遊戲結束標誌和倒數計時。
    生成牌組:根據難度模式生成不同數量的牌,並隨機打亂。
    設定牌的位置和狀態:根據層數和難度模式設定牌的位置和狀態。
    設定定時器:每秒觸發一次定時器事件,用於倒數計時。
  3. 遊戲更新函式update(dt)
    更新滑鼠位置:獲取當前滑鼠位置。
    更新倒數計時:如果遊戲開始且未結束,減少倒數計時。如果時間用完,設定遊戲結束標誌並呼叫game_over()函式。
  4. 遊戲結束函式game_over()
    顯示結束畫面:在螢幕上顯示結束畫面。
  5. 繪製函式
    繪製倒數計時draw_time():在螢幕上顯示剩餘時間。
    繪製分數draw_score():在螢幕上顯示當前分數。
    主繪製函式draw():
    清屏並繪製背景。
    如果遊戲未開始,繪製標題和難度選擇按鈕。
    如果遊戲開始,繪製牌組和牌堆,並根據遊戲狀態顯示勝利或失敗畫面。
    繪製倒數計時和分數。
  6. 滑鼠點選響應函式on_mouse_down(pos)
    難度選擇:如果遊戲未開始,根據點選位置選擇難度並初始化遊戲。
    牌組互動:如果遊戲開始,處理牌組的點選事件,更新牌的狀態和位置,計算分數。

前端設計

前端設計主要包括以下幾個部分:

1.遊戲介面佈局:

遊戲標題和背景影像。
低難度和高難度按鈕。
遊戲進行中的牌組和牌堆。
倒數計時和分數顯示。
2.介面元素:

標題:在遊戲未開始時顯示。
按鈕:用於選擇遊戲難度,分別為“Easy”和“Hard”。
牌組:上方的所有牌,按層級排列。
牌堆:下方的牌堆,玩家點選牌後移動到這裡。
倒數計時:顯示剩餘時間。
分數:顯示當前得分。
3.互動設計:

滑鼠點選事件:用於選擇難度和點選牌。
倒數計時事件:每秒觸發一次,更新剩餘時間。
遊戲結束條件:時間用完或牌堆超過7張。
4.繪製邏輯:

draw()函式負責繪製所有介面元素。
draw_time()和draw_score()分別負責繪製倒數計時和分數。
on_mouse_down()函式處理滑鼠點選事件,更新遊戲狀態。
5.遊戲狀態管理:

game_started:遊戲是否開始。
easy_mode:是否為低難度模式。
game_over_flag:遊戲是否結束。
score:當前得分。
time_left:剩餘時間。

技術與演算法

技術分析
1.Pygame:

用於處理遊戲的圖形介面、事件和定時器。
pygame.init() 初始化 Pygame。
pygame.time.set_timer() 設定定時器事件。
2.Pygame Zero (pgzrun):

用於簡化 Pygame 的使用,特別是遊戲迴圈和繪製。
pgzrun.go() 啟動遊戲迴圈。
3.隨機數生成:

random.shuffle() 用於隨機打亂牌組。
4.全域性變數:

用於儲存遊戲狀態、計分、倒數計時等資訊。
演算法分析
1.初始化遊戲:

initialize_game() 函式初始化遊戲狀態,包括牌組、牌堆、分數和倒數計時。
根據難度模式生成不同數量的牌,並隨機打亂。
設定牌的位置和狀態,最頂層的牌可點選,其他牌不可點選。
2.更新遊戲狀態:

update(dt) 函式每幀呼叫一次,用於更新倒數計時和遊戲狀態。
如果倒數計時結束,設定遊戲結束標誌並呼叫 game_over() 函式。
3.繪製遊戲介面:

draw() 函式每幀呼叫一次,用於繪製遊戲介面。
根據遊戲狀態繪製不同的介面元素,包括背景、牌組、牌堆、倒數計時和分數。
如果遊戲未開始,繪製標題和難度選擇按鈕。
如果遊戲開始,繪製牌組和牌堆,並根據遊戲狀態顯示勝利或失敗畫面。
4.滑鼠點選響應:

on_mouse_down(pos) 函式處理滑鼠點選事件。
如果遊戲未開始,根據點選位置選擇難度並初始化遊戲。
如果遊戲開始,處理牌組的點選事件,更新牌的狀態和位置,計算分數。
逆序迴圈遍歷牌組,優先處理上方的牌,避免重複判定。
如果點選的牌可點選,更新其狀態並從牌組中移除。
如果牌堆中相同的牌數量少於2,新增到牌堆;否則,消除相同的牌並計分。
更新被覆蓋牌的狀態,如果沒有其他牌覆蓋,設定為可點選。
5.遊戲結束:

game_over() 函式顯示遊戲結束畫面。
如果牌堆中牌的數量超過7張或沒有剩餘牌,顯示失敗或勝利畫面。

監測用例

1.setUp 和 tearDown 方法:

setUp 方法在每個測試用例執行之前呼叫,用於初始化遊戲。
tearDown 方法在每個測試用例執行之後呼叫,用於清理資源。
2.test_initialize_game 方法:

測試遊戲初始化是否正確,包括牌組數量、牌堆數量、分數、遊戲結束標誌和倒數計時。
3.test_update 方法:

使用 patch 裝飾器模擬 pygame.time.get_ticks 方法,測試倒數計時功能是否正常。
4.test_on_mouse_down_easy_mode 和 test_on_mouse_down_hard_mode 方法:

使用 patch 裝飾器模擬 pygame.mouse.get_pos 方法,測試滑鼠點選事件是否正確處理,分別測試低難度和高難度模式。
5.test_game_over 方法:

測試遊戲結束條件是否正確

遊戲評價

這個遊戲的程式碼實現了一個簡單的牌類遊戲,整體結構清晰,功能完整。以下是對該程式碼的詳細評價:

優點

  1. 結構清晰:

    • 程式碼分為多個函式,每個函式負責特定的功能,如初始化遊戲、更新遊戲狀態、繪製介面、處理滑鼠點選等。
    • 使用全域性變數來管理遊戲狀態,便於在不同函式之間共享資料。
  2. 功能完整:

    • 實現了遊戲的基本功能,包括初始化、倒數計時、滑鼠點選響應、遊戲結束判定等。
    • 支援兩種難度模式(低難度和高難度),增加了遊戲的可玩性。
  3. 介面繪製:

    • 使用 Pygame Zero 簡化了介面繪製和事件處理。
    • 繪製了遊戲的背景、牌組、牌堆、倒數計時和分數,介面元素豐富。
  4. 註釋詳細:

    • 程式碼中有詳細的註釋,解釋了每個部分的功能和實現細節,便於理解和維護。

改進

  1. 程式碼複用:

    • 可以將一些重複的程式碼提取到獨立的函式中,提高程式碼的複用性和可讀性。例如,繪製按鈕的程式碼可以提取到一個函式中。
  2. 測試覆蓋:

    • 可以編寫更多的單元測試用例,覆蓋更多的功能和邊界情況,確保程式碼的正確性和穩定性。
  3. 使用者體驗:

    • 可以新增更多的使用者反饋,例如點選牌時的音效、遊戲結束時的提示等,提升使用者體驗。

AIGC表格

子任務 藉助的AIGC工具 實現的功能 效果
生成影像資源 豆包 生成各種需要的影像資源,滿足美工需要 使得遊戲介面更加美觀流暢,提高視覺吸引力,吸引玩家的興趣
圖層的堆疊 Github Copilot 實現多圖層的堆疊放置,正確地將影像放置在遊戲介面中 並未很好地實現預期效果,經過個人地修改後得到了不錯地效果
遊戲不同難度模式的開發 Github Copilot 在完成困難模式的編寫後使用AIGC工具模仿後生成簡單模式的程式碼部分 得到較好的效果,符合預期,實現了兩種的難度模式
遊戲倒數計時的功能 Github Copilot 在遊戲開始時進行倒數計時,倒數計時結束仍未完成遊戲任務判定為遊戲失敗 開始時效果不佳,設定計時器後倒數計時未開始,經過多次除錯,得到較好的效果

五.體驗與過程

AIGC的優點

  1. 提高生產力
    自動化重複任務:AIGC可以自動生成程式碼、文件和測試用例,減少開發人員的重複勞動。
    快速原型設計:可以快速生成原型程式碼,幫助開發人員更快地驗證和迭代設計思路。
    程式碼補全和建議:在編寫程式碼時,AIGC可以提供實時的程式碼補全和最佳化建議,提高編碼效率。
  2. 提升程式碼質量
    自動生成測試用例:AIGC可以根據程式碼自動生成單元測試和整合測試,提高程式碼的覆蓋率和可靠性。
    程式碼審查和最佳化:可以自動審查程式碼,發現潛在的錯誤和效能問題,並提供最佳化建議。
    一致性和規範性:透過自動生成程式碼,可以確保程式碼風格和規範的一致性,減少人為錯誤。
  3. 創新和探索
    新思路和創意:AIGC可以提供新的思路和創意,幫助開發人員探索不同的解決方案和設計模式。
    跨領域應用:可以將AIGC應用於不同領域,如遊戲開發、資料分析、自然語言處理等,推動跨領域的創新和發展。
  4. 降低成本
    減少人力成本:透過自動化生成內容,可以減少對人力資源的依賴,降低開發成本。
    提高效率:透過提高生產力和程式碼質量,可以縮短開發週期,降低專案成本。

AIGC的缺點

  1. 質量和準確性
    錯誤和漏洞:AIGC生成的程式碼可能包含錯誤和漏洞,尤其是在複雜的邏輯和邊界情況下。
    程式碼質量不一致:生成的程式碼質量可能不一致,有時可能需要手動調整和最佳化。
  2. 依賴性
    過度依賴:開發人員可能過度依賴AIGC,導致自身技能的退化和對工具的過度依賴。
    工具限制:AIGC工具可能有其自身的限制和侷限性,不能完全替代人類的創造力和判斷力。
  3. 創造力和獨特性
    缺乏創造力:AIGC生成的內容可能缺乏創造力和獨特性,難以滿足特定需求。
    模板化:生成的內容可能過於模板化,缺乏個性化和創新性。

學習內容與收穫

學習內容 收穫
Pygame 和 Pygame Zero 學習瞭如何使用 Pygame 和 Pygame Zero 建立遊戲,包括初始化、事件處理和繪製介面。
遊戲初始化 瞭解瞭如何初始化遊戲狀態,包括牌組、牌堆、分數和倒數計時。
倒數計時功能 學習瞭如何使用 Pygame 的定時器事件實現倒數計時功能。
滑鼠點選事件處理 學習瞭如何處理滑鼠點選事件,包括判斷點選位置和更新遊戲狀態。
遊戲狀態管理 瞭解瞭如何使用全域性變數管理遊戲狀態,如遊戲是否開始、是否結束、當前分數等。
介面繪製 學習瞭如何使用 Pygame Zero 繪製遊戲介面,包括背景、牌組、牌堆、倒數計時和分數。
遊戲結束判定 瞭解瞭如何判定遊戲結束條件,並在遊戲結束時顯示相應的畫面。
程式碼最佳化 學習瞭如何最佳化程式碼結構,提高程式碼的可讀性和複用性。
單元測試 瞭解瞭如何使用 unittest 編寫單元測試用例,確保程式碼的正確性和穩定性。
AIGC 的優缺點 學習了使用 AIGC 的優點和缺點,瞭解瞭如何合理使用 AIGC 提高生產力和程式碼質量。

PSP表格

PSP階段 預估時間(分鐘) 實際時間(分鐘) 備註
計劃 30 40 確定專案目標和需求,制定開發計劃。
開發 380 425
需求分析 30 30 設計遊戲的整體架構和各個模組的實現方案。
設計 50 60 設計遊戲的整體架構和各個模組的實現方案。
實現 240 280 編寫遊戲程式碼,包括初始化、事件處理、介面繪製等。
程式碼複審 30 25 複審程式碼,確保程式碼質量和規範性。
測試 30 30 編寫和執行單元測試,確保程式碼的正確性和穩定性。
報告 45 55
編寫文件 30 35 編寫專案文件,包括程式碼註釋、使用說明等。
經驗總結 15 20 總結專案經驗,記錄心得體會和改進建議。
總計 455 520

六.個人總結

體會與心得

1.技術方面

  • 事件處理:學會了如何處理滑鼠點選事件,包括判斷點選位置和更新遊戲狀態。瞭解瞭如何透過逆序迴圈遍歷牌組,優先處理上方的牌,避免重複判定。
  • 介面繪製:學會了如何使用 Pygame Zero 繪製遊戲介面,包括牌組、牌堆、倒數計時和分數。
  • 遊戲邏輯:學會了如何透過消除相同的牌來計分,並更新牌的狀態。
  • 錯誤處理:認識到在實際專案中,新增錯誤處理機制的重要性,以提高程式碼的健壯性。

2.使用AIGC的體驗

  • 提高生產力:使用AIGC工具可以快速生成程式碼、測試用例,顯著提高了開發效率。

  • 程式碼質量:AIGC生成的程式碼質量較高,但仍需手動調整和最佳化,以確保程式碼的正確性,可用性和可讀性。

  • 知識學習:使用AIGC工具提供的即時幫助和指導,幫助我快速解決問題,提升了學習效率。

個人總結

透過開發羊了個羊小遊戲這個專案,我學到了許多技術知識,提升了程式碼編寫、最佳化和測試的能力。同時,在使用AIGC工具的過程中,我體驗認識到其在提高生產力和程式碼質量方面的能力與潛力。在專案開發時,運用AIGC工具可以很好地提高效率,縮短開發時間成本。我將繼續探索和應用這些技術,不斷提升自己的程式設計技能和專案開發能力。

相關文章