問題

夏天我一直在學習C#,現在感覺像是從我到目前為止所做的一個小專案.我已經決定了一種基於文字的冒險遊戲.

遊戲的基本結構將涉及若干部門(或房間),進入房間後,將輸出一個描述,並採取一些行動,這樣你就可能採取;在房間裡檢查、接收、使用東西的能力;可能的戰鬥系統等等。

無論如何,在關於如何為此設計程式碼的論文中,我正在抓住部分程式碼的結構.

我已經決定了一個播放器類,以及一個代表級別/地牢/區域的“級別”類.這個級別類將由一些相互關聯的“部門”組成.在任何特定時間,播放器將出現在級別的某個部門.

所以這是混淆:

從邏輯上講,可以期望像 player.Move(Dir d) 這樣的方法
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 這種方法應該改變級物件中的“當前部門”欄位,這意味著類播放器需要知道類級別。 而級別可能需要操縱 Player 物件(例如,玩家進入房間,被某些東西伏擊,從庫存中丟失一些東西)所以現在級別也需要保持對 Player 物件的引用?

這不太好;一切都必須提及其他一切。

在這一點上,我記得從我正在使用的書中閱讀關於代表的內容.雖然我知道C的函式指標,但是關於代表的一章帶有一種“基於事件的”程式設計觀點的示例,我對此沒有多少啟發.

這給了我設計如下類的想法:

玩家:

 class Player
{
    //...

    public delegate void Movement(Dir d);   //enum Dir{NORTH, SOUTH, ...}

    public event Movement PlayerMoved;

    public void Move(Dir d)
    {        
        PlayerMoved(d);

        //Other code...
    }

}
 

職等:

 class Level
{
    private Sector currSector;
    private Player p;
    //etc etc...

    private void OnMove(Dir d)
    {
        switch (d)
        {
            case Dir.NORTH:
                //change currSector
                //other code
                break;

                //other cases
        }
    }

    public Level(Player p)
    {
        p.PlayerMoved += OnMove;  
        currSector = START_SECTOR;
        //other code
    }

    //etc...
}
 

這是一種正確的方法嗎?
2001年12月31日終了的兩年期收入和支出及準備金和基金結餘變動報表 如果代表章未按原樣呈現,我將不會考慮使用這樣的“事件”.那麼在不使用回撥的情況下實現這一點的好方法是什麼?

我習慣做非常詳細的帖子...對不起v_v

  最佳答案

什麼是“遊戲”類,它會包含大多數資訊,比如玩家和電流房間。對於像移動玩家這樣的操作,遊戲類可以根據房間的級別圖將玩家移動到另一個房間。

遊戲類將管理遊戲各個元件之間的所有互動。

使用事件來解決這樣的問題會帶來你的事件會變得混亂的危險。如果你不小心的話,你最終會發生事件,並且會溢位你的堆疊,這會導致標誌在特殊情況下關閉事件,以及一個不太可理解的程式。

UDPATE:

為了使程式碼更易於管理,您可以模擬主類之間的一些互動,如類本身,例如打擊類.使用介面來啟用主類來執行某些互動. (請注意,我已經自由發明了您在遊戲中可能不想要的一些東西).

例如:

 // Supports existance in a room.
interface IExistInRoom { Room GetCurrentRoom(); }

// Supports moving from one room to another.
interface IMoveable : IExistInRoom { void SetCurrentRoom(Room room); }

// Supports being involved in a fight.
interface IFightable
{
  Int32 HitPoints { get; set; }
  Int32 Skill { get; }
  Int32 Luck { get; }
}

// Example class declarations.
class RoomFeature : IExistInRoom
class Player : IMoveable, IFightable
class Monster : IMoveable, IFightable

// I'd proably choose to have this method in Game, as it alters the
// games state over one turn only.
void Move(IMoveable m, Direction d)
{
  // TODO: Check whether move is valid, if so perform move by
  // setting the player's location.
}

// I'd choose to put a fight in its own class because it might
// last more than one turn, and may contain some complex logic
// and involve player input.
class Fight
{
  public Fight(IFightable[] participants)

  public void Fight()
  {
    // TODO: Logic to perform the fight between the participants.
  }
}
 

在您的問題中,您確定了一個事實,即如果您在Player類上卡住了類似Move方法的東西,您會有很多必須相互瞭解的類.這是因為類似移動的東西既不屬於玩家,也不屬於房間 – 移動影響到兩個物件.透過建模主物件之間的“互動”,您可以避免許多這些依賴項.

  相同標籤的其他問題

c#oopdelegatesadventure