軟體工程課程 | 班級連結 |
---|---|
作業要求 | 作業連結 |
作業目標 | 用python開發“羊了個羊”小遊戲 |
學號 | 102201312 |
一、《球了個球》介紹
注意:專案已在Github開源,請跳轉至連結Github軟工個人第二次作業
(1)遊戲背景
隨著進入大三以來體育課被取締以及學業課程越來越繁重,同學們很難騰出時間來進行體育鍛煉。正所謂“每天鍛鍊一小時 健康工作五十年 幸福生活一輩子”,體育鍛煉是重要的。本遊戲旨在用球類消消樂激發同學們進行體育鍛煉的熱情。
(2)遊戲規則介紹
1.遊戲設有三個關卡,玩家透過點選選擇圖案,三個相同圖示即可消除,當所有圖案被消除時就可進入下一個關卡。若超出選擇限制(7個)則遊戲失敗。
2.每關難度呈指數級上漲,以此分數也會遞增。第一關每消掉三個加一分,第二關每消掉三個加兩分,第三關則加三分。
(3)實現功能
- 主選單,四個按鈕互動。
- 三種難度模式,給玩家不同的挑戰體驗。
- 分數獎勵機制,為玩家提供鼓勵。
- 排行榜,讓玩家得到競賽的快感。
- 滑鼠懸停到選塊,出現提示音效。
二、我的專案實現過程
我的程式設計環境:vscode
我的AIGC應用:Github Copilot
+ChatGPT
我的AI文生圖:Copilot.Microsoft
我的免費可商用圖示來源:(icons8.com)
三、遊戲展示及過程
1.遊戲主介面
2.遊戲的三個關卡
難度指數級上升
3.遊戲的勝利介面
4.遊戲失敗介面
5.排行榜介面
遞減排序
6.遊戲所用圖示展示
四、遊戲實際測試
第一關
第二關
五、核心演算法展示和實現過程
1.主要邏輯
我設定了多種遊戲狀態game_state
,使我流程順利地在主選單與其他介面之間切換狀態。
2.三種關卡的演算法
①第一關
我詢問了Github Copilot
,它為我生成了簡單的演算法,以下是它的程式碼和分析。
# 第一關:只有一個平層,沒有覆蓋
def initialize_tiles_level1():
global tiles
tiles = []
ts = list(range(1, 13)) * 3 # 根據需要減少牌的數量
random.shuffle(ts)
n = 0
rows = 6 # 控制行數
cols = 6 # 控制列數
# 在平面上佈局牌,沒有層次
for i in range(rows):
for j in range(cols):
if n >= len(ts):
break
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 牌的位置用於碰撞檢測
'tag': t, # 牌的標籤1-12
'layer': 0, # 沒有層次
'status': 1 # 所有牌可點選
}
tile['rect'].topleft = (100 + j * tile_img.get_width(),
100 + i * tile_img.get_height() * 0.9)
tiles.append(tile)
②第二關
# 第二關:金字塔
def initialize_tiles_level2():
global tiles
tiles = []
ts = list(range(1, 13)) * 12
random.shuffle(ts)
n = 0
for k in range(7): # 7層
for i in range(7 - k): # 行
for j in range(7 - k): # 列
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 牌的位置用於碰撞檢測
'tag': t, # 牌的標籤1-12
'layer': k, # 牌的層數
'status': 1 if k == 6 else 0 # 只有最上層的牌可點選
}
tile['rect'].topleft = (120 + (k * 0.5 + j) * tile_img.get_width(),
100 + (k * 0.5 + i) * tile_img.get_height() * 0.9)
tiles.append(tile)
# 將多餘的4張牌放到下面
for i in range(4):
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(topleft=(210 + i * tile_img.get_width(), 516)),
'tag': t,
'layer': 0,
'status': 1
}
tiles.append(tile)
③第三關
根據前兩個的佈局,我讓Github Copilot
為我生成了更有難度的演算法。(我自己都無法通關)
# 第三關:更復雜的佈局和更多層次
def initialize_tiles_level3():
global tiles
tiles = []
# 計算總共需要的牌數
total_tiles_needed = sum((9 - k) ** 2 for k in range(9)) + 6 # 每層和底部的獨立牌
ts = list(range(1, 13)) * ((total_tiles_needed // 12) + 1) # 根據需要重複生成牌
random.shuffle(ts)
n = 0
layer_offsets = [0, 0.5, 1.0] # 控制每層牌的偏移,製造更復雜的佈局
y_offset = -30 # 向上移動 50 畫素
x_offset = -80 # 向左移動 30 畫素
# 9層的複雜佈局,每層牌數量不同
for k in range(9): # 9層
offset = layer_offsets[k % len(layer_offsets)] # 使用偏移
rows = 9 - k # 行數隨層數減少
cols = 9 - k # 列數隨層數減少
for i in range(rows): # 行
for j in range(cols): # 列
if n >= total_tiles_needed:
break
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(), # 牌的位置用於碰撞檢測
'tag': t, # 牌的標籤1-12
'layer': k, # 牌的層數
'status': 1 if k == 8 else 0 # 只有最上層的牌可點選
}
# 左移和上移 tile 的 X 和 Y 座標
tile['rect'].topleft = (120 + (offset + j) * tile_img.get_width() + x_offset,
50 + (offset + i) * tile_img.get_height() * 0.9 + y_offset)
tiles.append(tile)
# 在底部隨機放一些獨立的牌
for i in range(6):
t = ts[n]
n += 1
tile_img = pygame.image.load(f'images/tile{t}.png')
tile = {
'image': tile_img,
'rect': tile_img.get_rect(topleft=(random.randint(100, 500) + x_offset, random.randint(500, 600) + y_offset)),
'tag': t,
'layer': 0,
'status': 1
}
tiles.append(tile)
六、AIGC表格:學習內容及心得體會
AI輔助
子任務 | AIGC技術 | 實現功能 | 效果如何 |
---|---|---|---|
介面設計 | Copilot | 程式碼參考,基本框架構建 | 提供了較為簡單的基礎框架,方便進一步最佳化,但也存在一些小bug |
按鈕設計 | Copilot | 程式碼參考,基本框架構建 | 提供了pygame按鈕設計的相關函式,經過簡單修改可以正常使用 |
功能參考 | ChatGPT | 程式碼參考,基本框架構建 | 提供了一些函式的相關設計思路,比如影像消除等,要實現個性化的複雜程式碼還需要進一步除錯 |
素材參考 | icons8 | 提供免費圖片素材 | 告訴了一些網站參考和相關途徑,有一定參考價值 |
圖片生成 | Copilot | 文生圖生成簡單logo | 部分可以使用,需要耐心除錯 |
AI生成表格
專案 | 內容 |
---|---|
作業題目 | 開發“羊了個羊”小遊戲 |
背景 | 同學們體育時間減少,需要激發運動熱情 |
主要收穫 | 1. 學習瞭如何使用Pygame設計遊戲介面。 2. 理解了圖案生成與消除的基本邏輯。 3. 掌握瞭如何利用AIGC工具生成程式碼。 |
遇到的挑戰 | 1. 實現圖案的合理匹配與消除。 2. 設定倒數計時機制和難度調整。 3. 確保程式碼結構清晰且可維護。 |
改進建議 | 1. 增強圖案消除演算法以提高遊戲體驗。2.新增點選特效,增加綠框。 3. 改進介面設計以提高使用者體驗。 |
七、PSP表格:任務分解與時間管理
任務 | 描述 | 預估耗時 (小時) | 實際耗時 (小時) | 差異 (小時) | 備註 |
---|---|---|---|---|---|
計劃和需求分析 | 預估專案開發時間,制定整體開發計劃 | 1 | 2 | +1 | |
遊戲介面設計 | 使用Pygame或其他圖形庫設計主選單、遊戲介面和結束介面。 | 5 | 7 | +2 | 介面設計比較簡潔輕快,可以增加更多功能 |
圖案生成與擺放 | 實現圖案的生成和分層擺放邏輯。 | 3 | 2 | -1 | 圖案生成符合預期,較為合理 |
圖案選擇與消除邏輯 | 實現玩家點選選擇圖案並消除的邏輯。 | 4 | 2 | -2 | 消除邏輯順利實現,功能正常。 |
排行榜機制 | 設定分數和排行榜功能,遊戲失敗後計入前十名。 | 2 | 1 | -1 | 排行榜機制實現得比較順利。 |
難度設定 | 隨機生成圖案擺放順序或設定不同的關卡增加難度。 | 3 | 2.5 | -0.5 | 難度設定效果良好,但關卡設計還有很大提高空間。 |
使用AIGC工具生成程式碼 | 利用OpenAI等工具生成部分程式碼。 | 2 | 3 | +1 | 程式碼生成較為準確,註釋清晰。但仍需要人為調整修正 |
程式碼測試與除錯 | 測試遊戲功能並修復可能的bug。 | 5 | 7 | +2 | 測試過程中發現了一些意外的bug,透過修復得以解決 |
文件編寫與註釋 | 編寫程式碼註釋和專案文件。 | 2 | 3 | +1 | 文件編寫比較順利,註釋完整。 |
總耗時 | 27 | 29.5 |
八、 專案總結
在這個專案中,我藉助 Pygame 學會了從零開始開發一款 小 遊戲,特別是在介面佈局、音效設計與邏輯處理上有了顯著的進步。我更深入地認識到了細節設計的重要性,比如圖示的點選反饋和音效的應用如何顯著提升遊戲體驗。此外,透過對 PSP 表格的管理,我的時間管理和專案組織能力也得到了很好的鍛鍊。
不過時間倉促,有一些功能仍然沒有實現,希望以後能將這個專案完善。