2024秋軟體工程課程個人作業(第二次)

DriOgon發表於2024-09-18
軟體工程課程 班級連結
作業要求 作業連結
作業目標 用python開發“羊了個羊”小遊戲
學號 102201312

一、《球了個球》介紹

注意:專案已在Github開源,請跳轉至連結Github軟工個人第二次作業

(1)遊戲背景

​ 隨著進入大三以來體育課被取締以及學業課程越來越繁重,同學們很難騰出時間來進行體育鍛煉。正所謂“每天鍛鍊一小時 健康工作五十年 幸福生活一輩子”,體育鍛煉是重要的。本遊戲旨在用球類消消樂激發同學們進行體育鍛煉的熱情。

(2)遊戲規則介紹

​ 1.遊戲設有三個關卡,玩家透過點選選擇圖案,三個相同圖示即可消除,當所有圖案被消除時就可進入下一個關卡。若超出選擇限制(7個)則遊戲失敗。

​ 2.每關難度呈指數級上漲,以此分數也會遞增。第一關每消掉三個加一分,第二關每消掉三個加兩分,第三關則加三分。

(3)實現功能

  • 主選單,四個按鈕互動
  • 三種難度模式,給玩家不同的挑戰體驗。
  • 分數獎勵機制,為玩家提供鼓勵。
  • 排行榜,讓玩家得到競賽的快感。
  • 滑鼠懸停到選塊,出現提示音效

二、我的專案實現過程

我的程式設計環境:vscode

image-20240918224443326

我的AIGC應用:Github Copilot+ChatGPTimage-20240918224742011

我的AI文生圖:Copilot.Microsoft

image-20240918224833952

我的免費可商用圖示來源:(icons8.com)

image-20240918225314625

三、遊戲展示及過程

1.遊戲主介面

image-20240918220630070

2.遊戲的三個關卡

難度指數級上升

image-20240918220801292

image-20240918220911446

image-20240918221331257

3.遊戲的勝利介面

image-20240918220847202

4.遊戲失敗介面

image-20240918221020994

5.排行榜介面

遞減排序

image-20240918221624135

6.遊戲所用圖示展示

image-20240918222146330

四、遊戲實際測試

第一關

QQ2024918-231213

第二關

QQ2024918-231214

五、核心演算法展示和實現過程

1.主要邏輯

我設定了多種遊戲狀態game_state,使我流程順利地在主選單與其他介面之間切換狀態。image-20240918222643926

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)

image-20240918223129301

②第二關

# 第二關:金字塔
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 表格的管理,我的時間管理和專案組織能力也得到了很好的鍛鍊。

​ 不過時間倉促,有一些功能仍然沒有實現,希望以後能將這個專案完善。

相關文章