2010-11-23 105 views
4

我目前正在創建一個簡單的基於控制檯的遊戲,玩家可以在不同的房間之間移動,拿起和使用物品,並吃東西。在遊戲目前的狀態下就是這樣。幫助程序設計

我需要的是幫助:

創造良好的「事件」類我的比賽。我希望它的工作方式是每個項目和房間都應該能夠與一個事件相關聯。

由於我是新來的這一點,我會很感激有關這種程序的任何閱讀材料,或作爲建議,怎麼會是最好的設置我的課(ES)考慮下面點,或簡單地如何攻擊這種問題(即無法決定如何設置類)

我希望能夠創建不同類型的事件,例如:

  • 輸出一些文字,然後問玩家的問題。如果玩家給出了正確的答案,請做一些事情。

  • 輸出一些文字,然後從玩家的庫存中移除一個物品,然後將玩家移動到另一個房間。

我試圖避免:

  • 遊戲的整個的一點是要養成良好的一流的設計,這樣的東西,如責任驅動設計,凝聚力和耦合是重要方面。因此我希望它儘可能簡單,可重用和獨立。

  • 必須對每個事件進行硬編碼,以便項目或房間只需調用Event類中的特定方法。

我此刻在想什麼:

創建幾個子類,這樣我可以如創造新的事件(和它們相關聯)使用: itemObject.setEvent(新事件(新問題(「introText」,「outroText」,「correctAnswer」)));

請讓我知道是否需要更多信息! 謝謝!

+0

您能更具體地處理您的問題嗎? – jzd 2010-11-23 17:51:00

回答

2

遊戲編程寶石書很棒......雖然有點貴。

你也許可以找到相關文章或兩個以上的GameDev's Article list,並可能有一些好東西埋在their forums

至於事件類,你幾乎可以肯定要使用一些一些子類(MoveEvent一個基類,InventoryEvent等)。如果你想真的想要避免硬編碼的東西,你應該在數據文件中定義你的遊戲。房間,物品和事件...以及稍後您將要粘貼的任何內容。你用來定義事物的格式完全取決於你。我推薦一些可以給你實踐經驗的東西,因爲這是一個學習練習:例如你沒有使用的XML解析器。不是最有效的解析格式,但這是一個控制檯遊戲,所以這不是一個問題。

我對事件子類的一個建議是將其他事件鏈接在一起。界面不會改變,它可以讓你做一些事情,比如「把這個添加到玩家的庫存中,把它拿走,並把它們移到這裏」。

2

我會考慮的一件事是分離輸入文本的解析以及從底層域模型生成輸出文本。你的問題似乎混合在一起,而我認爲問題的文本部分作爲表示層。

例如,您的域名可能包括以下接口:

public enum Action { HIT, TALK_TO, EAT, USE }; 

public interface GameEntity { 
    /** 
    * Performs the specified action on this GameEntity, passing in zero or 
    * more other GameEntity instances as parameters. 
    */ 
    void applyAction(Action action, GameEntity... params);  
} 

public interface Item extends GameEntity { } 
public interface Person extends GameEntity { } 

此外,您可以定義將處理輸入字符串TextParser類,並導致調用領域層否則返回默認迴應:「我不明白。」例如,輸入短語「門上使用鑰匙」將導致方法調用:

key.applyAction(Action.USE, door); 
1

我最近實施了類似於你描述的東西。我從創建一個具有「發佈」和「訂閱」方法的EventManager類開始。當系統啓動時,它會掃描所有加載的程序集(庫)實現了IEventListener接口的類:

/// <summary> 
/// A class that intends to listen for specific events to be published by an 
/// event manager. 
/// <see cref="EventManager"/> 
/// </summary> 
public interface IEventListener 
{ 
    /// <summary> 
    /// Subscribes to the event types that this listener wishes to listen for. 
    /// </summary> 
    /// <param name="eventManager"></param> 
    void RegisterSubscriptions(EventManager eventManager); 
} 

...並呼籲他們每個人的RegisterSubscriptions方法。 (EventManager中只有一個實例被使用到處;我使用依賴注入將它綁定爲一個單例實例。)

RegisterSubscriptions將簡單地調用給定類所針對的每個事件類型和處理程序的Subscribe方法處理。 (我使用的是.NET,因此事件和處理程序可以更容易地使用,但是您可以使用匿名子類在Java中執行相同的操作。)

典型事件可能類似於RoomEntered和參數與此活動相關的信息將包括房間ID以及有關房間的其他一些屬性。遊戲引擎在用戶進入房間時發佈此事件,爲該房間提供適當的事件參數,然後EventManager類負責調用訂閱了該事件類型的每個處理程序。此事件的一個處理程序可能是「HandleEnterRoomWithMonsters」,它會檢查房間是否有怪物,並相應地執行操作。

這是否有意義的整體?你對這種方法有任何疑問嗎?

2

當談到事件時,想起observer pattern。你可以將你的遊戲想象成由幾臺狀態機內部呈現(你也可以在維基百科上查看,因爲我是新來的,所以我不能自己添加第二個鏈接)。從一個階段到另一個階段的每個過渡都是一個事件,可以傳達給該事件的註冊觀察者。

在例如:

USE KEY ON LOCK:觸發清除鍵和門的開口;在沒有額外的用戶互動(開門)的情況下暗含「下降」到下一個事件:觸發具有額外出口的房間等。