# 🐑 作業:牧羊人生活模擬器 (Shepherd Life Simulator) ## 🎯 作業目標 透過物件導向程式設計,建立一個模擬牧羊人日常生活的互動式程式,管理牧場上的羊群,並與牧羊犬互動。 ## 📌 需要實作的類別與結構 你必須實作以下的類別 (Class) 與結構: ### 📍 羊毛 (Wool) 類別 - 屬性 (private): - 顏色 (color):如白色、黑色、棕色 - 觸感 (texture):如柔軟、粗糙 - 是否可收割 (readyToHarvest) - 功能 (public): - 判斷羊毛是否可收割 (isReady) - 描述羊毛資訊 (describe) - 收割羊毛 (harvest) ### 📍 羊 (Sheep) 類別 - 屬性 (private): - ID 編號(自動增加,不可重複) - 名字 (name) - 年齡 (age) - 飢餓狀態 (isHungry) - 羊毛 (Wool物件) - 功能 (public): - 羊叫聲 (bleat) - 吃東西 (eat),特別喜歡草 - 顯示羊的完整資訊 (showInfo) ### 📍 牧羊犬 (Dog) 類別 - 屬性 (private): - 名字 (name) - 功能 (public): - 吠叫 (bark) - 找出餓的羊 (findHungrySheep) - 找出羊毛可收割的羊 (findWoolReadySheep) ### 📍 羊群管理 (SheepNode) - 使用 Linked List - 透過鏈結串列管理多隻羊。 - [補充](#補充) ## 🔧 模擬器必備的功能 你需要透過互動式選單提供以下功能: 1. 新增羊 使用者輸入羊的名字、年齡、羊毛顏色、觸感、羊毛是否可收割。 2. 顯示全部羊隻資訊 列出羊群所有羊的完整資訊 (ID、飢餓狀態、羊毛狀態等)。 3. 餵食羊隻 透過羊的 ID 指定餵食特定的羊(記住羊喜歡草)。 4. 牧羊犬尋找飢餓的羊 牧羊犬找出第一隻飢餓的羊,顯示牠的 ID 和名字。 5. 牧羊犬尋找羊毛可收割的羊 牧羊犬找出所有羊毛已經可以收割的羊,顯示牠們的 ID 和名字。 6. 清空羊群 將目前所有的羊從系統中安全地刪除,確保記憶體釋放。 7. 收割羊毛 透過輸入羊的 ID,收割指定羊的羊毛(若可收割)。 8. 離開模擬器 正常結束程式,確認所有記憶體都已被妥善釋放。 ## 📋 程式規格要求 - 使用良好的封裝技巧 (private、public)。 - 透過動態記憶體配置 (new、delete) 管理物件。 ## 🚩 互動式操作範例 ```text ===== 牧羊人生活模擬器 ===== 1. 新增一隻羊 2. 顯示全部羊 3. 餵食羊 4. 牧羊犬尋找飢餓的羊 5. 牧羊犬尋找羊毛可收割的羊 6. 清空羊群 7. 收割羊毛 0. 離開 ============================ 選擇操作:4 🐶 找到飢餓的羊:「小花」,ID: 3 ``` ## Demo ![render1753510986005Compress](https://hackmd.io/_uploads/SJdFOxzDxx.gif) ## 補充 ### 📍 羊群管理 (SheepNode) - 使用 Linked List 為了有效管理大量的羊群,你必須使用 鏈結串列 (Linked List) 的資料結構來實作羊群管理系統。 #### 🔖 什麼是 Linked List? 鏈結串列是一種動態的資料結構,用來儲存多個同類型物件。在這個作業中,你會使用鏈結串列儲存每一隻羊的物件指標 (Sheep*),透過節點 (SheepNode) 的方式串接彼此,形成一個羊群。 - [Linked list visualizer](https://vonvista.github.io/Linked-List/) #### 🧱 結構定義 ```cpp struct SheepNode { Sheep* sheep; // 指向羊物件的指標 SheepNode* next; // 指向下一個節點的指標 }; ``` - sheep:儲存羊的指標,指向實際的羊物件。 - next:指向下一隻羊節點 (SheepNode) 的指標。 #### ⚙️ 必須實作的功能 你需要實作以下三個功能來管理羊群: - 新增羊到羊群 (addSheep) 接受一隻新羊的指標並加入到串列末端。 ```cpp void addSheep(SheepNode*& head, Sheep* newSheep); ``` - 顯示所有羊資訊 (showAllSheep) 遍歷整個串列,依序顯示每隻羊的完整資訊。 ```cpp void showAllSheep(SheepNode* head); ``` - 刪除所有羊並釋放記憶體 (deleteAllSheep) 安全地釋放每個羊物件與節點,避免記憶體洩漏。 ```cpp void deleteAllSheep(SheepNode*& head); ``` #### 🚩 使用 Linked List 的好處 - 動態管理:可以隨時增加或刪除羊的數量,不需要事先指定數量。 - 記憶體效率:不會浪費不必要的空間,隨用隨增,隨刪隨釋放。 - 彈性高:容易新增未來擴充的功能,例如依據特定條件排序或搜尋特定的羊。 #### 🖥️ 執行範例 ```cpp SheepNode* flock = nullptr; // 新增羊隻到羊群 addSheep(flock, new Sheep("小白", 2, new Wool("白色", "柔軟", true))); addSheep(flock, new Sheep("小黑", 3, new Wool("黑色", "粗糙", false))); // 顯示全部羊隻資訊 showAllSheep(flock); // 釋放全部羊隻記憶體 deleteAllSheep(flock); ```