軟工第二次個人作業
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/fzu/SE2024 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253 |
這個作業的目標 | 使用Python編寫一個“羊了個羊”風格的消除類小遊戲 |
學號 | 102202106 |
- 一.使用AICG工具生成需要圖片
- AICG工具:豆包AI
- 美工圖片展示
- 二.任務規劃
- 1.任務一
- 2.任務二
- 3.任務三
- 4.任務四
- 三.遊戲展示
- 1.靜態展示
- 主頁面
- 遊戲主體
- 遊戲勝利
- 遊戲失敗
- 2.動態展示
- 選擇難度模式
- 遊戲主要部分
- 1.靜態展示
- 四.專案介紹
- 實現思路
- 前端設計
- 技術與演算法
- 監測用例
- 遊戲評價
- 優點
- 改進
- AIGC表格
- 五.體驗與過程
- AIGC的優點
- AIGC的缺點
- 學習內容與收穫
- PSP表格
- 六.個人總結
- 體會與心得
- 1.技術方面
- 2.使用AIGC的體驗
- 個人總結
- 體會與心得
一.使用AICG工具生成需要圖片
AICG工具:豆包AI
美工圖片展示
二.任務規劃
1.任務一
構思遊戲功能,設計兩個難度模式,設計遊戲主選單
2.任務二
設計遊戲主體,實現圖案的生成與分層擺放,確保圖案能夠被合理匹配和消除,實現三個相同影像消除
3.任務三
設定計時器,需要在規定時間內消除所有影像
4.任務四
設定計分器,每消除3個影像則積1分
三.遊戲展示
1.靜態展示
主頁面
遊戲主體
遊戲勝利
遊戲失敗
2.動態展示
選擇難度模式
遊戲主要部分
四.專案介紹
實現思路
- 初始化設定
匯入庫:匯入pgzrun、pygame和random庫。
常量定義:定義倒數計時、視窗尺寸、牌的尺寸等常量。
初始化pygame:初始化pygame並設定定時器事件。
全域性變數:定義遊戲狀態、計分、滑鼠位置等全域性變數。 - 遊戲初始化函式initialize_game()
重置遊戲狀態:重置牌組、牌堆、分數、遊戲結束標誌和倒數計時。
生成牌組:根據難度模式生成不同數量的牌,並隨機打亂。
設定牌的位置和狀態:根據層數和難度模式設定牌的位置和狀態。
設定定時器:每秒觸發一次定時器事件,用於倒數計時。 - 遊戲更新函式update(dt)
更新滑鼠位置:獲取當前滑鼠位置。
更新倒數計時:如果遊戲開始且未結束,減少倒數計時。如果時間用完,設定遊戲結束標誌並呼叫game_over()函式。 - 遊戲結束函式game_over()
顯示結束畫面:在螢幕上顯示結束畫面。 - 繪製函式
繪製倒數計時draw_time():在螢幕上顯示剩餘時間。
繪製分數draw_score():在螢幕上顯示當前分數。
主繪製函式draw():
清屏並繪製背景。
如果遊戲未開始,繪製標題和難度選擇按鈕。
如果遊戲開始,繪製牌組和牌堆,並根據遊戲狀態顯示勝利或失敗畫面。
繪製倒數計時和分數。 - 滑鼠點選響應函式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 方法:
測試遊戲結束條件是否正確
遊戲評價
這個遊戲的程式碼實現了一個簡單的牌類遊戲,整體結構清晰,功能完整。以下是對該程式碼的詳細評價:
優點
-
結構清晰:
- 程式碼分為多個函式,每個函式負責特定的功能,如初始化遊戲、更新遊戲狀態、繪製介面、處理滑鼠點選等。
- 使用全域性變數來管理遊戲狀態,便於在不同函式之間共享資料。
-
功能完整:
- 實現了遊戲的基本功能,包括初始化、倒數計時、滑鼠點選響應、遊戲結束判定等。
- 支援兩種難度模式(低難度和高難度),增加了遊戲的可玩性。
-
介面繪製:
- 使用 Pygame Zero 簡化了介面繪製和事件處理。
- 繪製了遊戲的背景、牌組、牌堆、倒數計時和分數,介面元素豐富。
-
註釋詳細:
- 程式碼中有詳細的註釋,解釋了每個部分的功能和實現細節,便於理解和維護。
改進
-
程式碼複用:
- 可以將一些重複的程式碼提取到獨立的函式中,提高程式碼的複用性和可讀性。例如,繪製按鈕的程式碼可以提取到一個函式中。
-
測試覆蓋:
- 可以編寫更多的單元測試用例,覆蓋更多的功能和邊界情況,確保程式碼的正確性和穩定性。
-
使用者體驗:
- 可以新增更多的使用者反饋,例如點選牌時的音效、遊戲結束時的提示等,提升使用者體驗。
AIGC表格
子任務 | 藉助的AIGC工具 | 實現的功能 | 效果 |
---|---|---|---|
生成影像資源 | 豆包 | 生成各種需要的影像資源,滿足美工需要 | 使得遊戲介面更加美觀流暢,提高視覺吸引力,吸引玩家的興趣 |
圖層的堆疊 | Github Copilot | 實現多圖層的堆疊放置,正確地將影像放置在遊戲介面中 | 並未很好地實現預期效果,經過個人地修改後得到了不錯地效果 |
遊戲不同難度模式的開發 | Github Copilot | 在完成困難模式的編寫後使用AIGC工具模仿後生成簡單模式的程式碼部分 | 得到較好的效果,符合預期,實現了兩種的難度模式 |
遊戲倒數計時的功能 | Github Copilot | 在遊戲開始時進行倒數計時,倒數計時結束仍未完成遊戲任務判定為遊戲失敗 | 開始時效果不佳,設定計時器後倒數計時未開始,經過多次除錯,得到較好的效果 |
五.體驗與過程
AIGC的優點
- 提高生產力
自動化重複任務:AIGC可以自動生成程式碼、文件和測試用例,減少開發人員的重複勞動。
快速原型設計:可以快速生成原型程式碼,幫助開發人員更快地驗證和迭代設計思路。
程式碼補全和建議:在編寫程式碼時,AIGC可以提供實時的程式碼補全和最佳化建議,提高編碼效率。 - 提升程式碼質量
自動生成測試用例:AIGC可以根據程式碼自動生成單元測試和整合測試,提高程式碼的覆蓋率和可靠性。
程式碼審查和最佳化:可以自動審查程式碼,發現潛在的錯誤和效能問題,並提供最佳化建議。
一致性和規範性:透過自動生成程式碼,可以確保程式碼風格和規範的一致性,減少人為錯誤。 - 創新和探索
新思路和創意:AIGC可以提供新的思路和創意,幫助開發人員探索不同的解決方案和設計模式。
跨領域應用:可以將AIGC應用於不同領域,如遊戲開發、資料分析、自然語言處理等,推動跨領域的創新和發展。 - 降低成本
減少人力成本:透過自動化生成內容,可以減少對人力資源的依賴,降低開發成本。
提高效率:透過提高生產力和程式碼質量,可以縮短開發週期,降低專案成本。
AIGC的缺點
- 質量和準確性
錯誤和漏洞:AIGC生成的程式碼可能包含錯誤和漏洞,尤其是在複雜的邏輯和邊界情況下。
程式碼質量不一致:生成的程式碼質量可能不一致,有時可能需要手動調整和最佳化。 - 依賴性
過度依賴:開發人員可能過度依賴AIGC,導致自身技能的退化和對工具的過度依賴。
工具限制:AIGC工具可能有其自身的限制和侷限性,不能完全替代人類的創造力和判斷力。 - 創造力和獨特性
缺乏創造力: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工具可以很好地提高效率,縮短開發時間成本。我將繼續探索和應用這些技術,不斷提升自己的程式設計技能和專案開發能力。