首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ 遊戲平台設計:基類指標陣列實現多態與動態排序

     編輯:程式設計綜合問答

需求重述

  • 基類 Game 含純虛函式 start()、訪問次數 visitCount、名稱。
  • 三個衍生類 GGame1/2/3 實作 start()。
  • 主選單顯示遊戲列表,依 visitCount 遞減排序。
  • 使用者選擇遊戲 → 執行 → 返回選單,計數 +1。

關鍵修正點

  1. 基類指標陣列指向衍生物件合法:Game* games[3] = {new GGame1, new GGame2, new GGame3}; 利用**多態**,呼叫 games[i]->start() 會動態綁定到衍生類實作。
  2. 排序需自訂比較函式:std::sort 配合 lambda 或函式物件,比較 visitCount。
  3. 選單函式接收指標陣列:void menu(Game** games, int n) 或 void menu(Game* games[], int n)。
  4. 記憶體釋放**:迴圈結束前 delete 每個指標。

完整可編譯程式碼 (C++11)

#include 
#include 
#include 
#include  // 智慧指標

using namespace std;

class Game {
protected:
    string name;
    int visitCount = 0;
public:
    Game(string n) : name(move(n)) {}
    virtual ~Game() = default;

    virtual void start() = 0;
    void addVisit() { ++visitCount; }
    int getVisitCount() const { return visitCount; }
    void showName() const { cout << name; }
};

class GGame1 : public Game {
public: GGame1() : Game("遊戲 1: 猜數字") {}
    void start() override { cout << "歡迎進入猜數字遊戲!\n"; /* 遊戲邏輯 */ }
};
class GGame2 : public Game {
public: GGame2() : Game("遊戲 2: 石頭剪刀布") {}
    void start() override { cout << "歡迎進入石頭剪刀布!\n"; }
};
class GGame3 : public Game {
public: GGame3() : Game("遊戲 3: 冒險島") {}
    void start() override { cout << "歡迎進入冒險島!\n"; }
};

int main() {
    // 使用 unique_ptr 自動管理記憶體
    vector> games;
    games.push_back(make_unique());
    games.push_back(make_unique());
    games.push_back(make_unique());

    while (true) {
        // 依訪問次數遞減排序
        sort(games.begin(), games.end(),
            [](const unique_ptr& a, const unique_ptr& b) {
                return a->getVisitCount() > b->getVisitCount();
            });

        cout << "\n=== 遊戲平台 ===\n";
        for (size_t i = 0; i < games.size(); ++i) {
            cout << i + 1 << ". ";
            games[i]->showName();
            cout << " (訪問:" << games[i]->getVisitCount() << ")\n";
        }
        cout << "0. 離開\n選擇: ";

        int choice;
        if (!(cin >> choice) || choice == 0) break;
        if (choice < 1 || choice > (int)games.size()) continue;

        Game* g = games[choice - 1].get();
        g->addVisit();
        g->start();
        cout << "遊戲結束,返回主選單。\n";
    }
    return 0; // unique_ptr 自動 delete
}

設計亮點

  • 智慧指標:unique_ptr 避免記憶體洩漏,符合 RAII。
  • vector + sort:動態容器支援任意遊戲數量,排序邏輯集中。
  • 多態呼叫:g->start() 自動分派到正確衍生類。
  • 擴充性:新增遊戲只需繼承 Game 並 push_back,主迴圈零修改。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved