2013-09-23 21 views
0

介紹的一些問題

我一直在嘗試,現在建立這個項目的幾個星期,並嘗試多種解決方案,我不能讓我的頭轉過身來。讓我稍微描述一下這個項目。這是一個基於文本的服務器,玩家可以登錄(通過telnet或客戶端),基本上就像一個MUD。然後,他們可以創建「對象」並與其進行交互,爲其提供「動詞」和「屬性」。關於建立網絡訪問,多用戶,可編程的,互動的環境

服務器基本上只是一個'對象'的數據庫,每個對象都有一個ID,一個名稱,一個位置(這是另一個對象),它的內容列表(對象)和其他標誌。對象可以有'動詞'和'屬性'。屬性只是存儲的數據(string,int,float,w/e)。動詞是方法/功能。對象使用諸如「放入容器中」的命令進行交互。舊版本的服務器已經存在,它被稱爲LambdaMOO。我試圖重新創建它,因爲它在很長很長的時間內沒有更新過。

你可以閱讀更深入的瞭解如何對象,動詞和性能應在工作中:http://bit.ly/17XIqjY

一個例子

讓我描述想什麼我。想象一下,我們有一個對象。對象#256,它被稱爲「按鈕」。它具有屬性「count」以及從其父項繼承的所有默認屬性(即'description')。它有一個「動詞」,稱爲「推」。這個動詞包含此代碼:

this.count += 1; 
this.description = "This button has been pushed " + this.count + " times."; 
player.tell("You press the button and feel a chill run down your spine."); 

當服務器上的玩家類型「按鈕」,「推」動詞將運行並輸出

You press the button and feel a chill run down your spine. 

如果再look的按鈕,你會看到它的更新說明。

請注意,上述腳本中的player指的是執行動詞的玩家的對象。 tell是玩家對象上的另一個動詞。然而tell動詞有一個標誌說它可以從其他動詞執行。

什麼語言?

我的主要問題是我可以使用哪些語言作爲'動詞'?我試過使用node.js和'vm'庫。我試過用C#來解析C#。我試着用C#來解析JavaScript。我一直得到的問題是我無法控制動詞和屬性的權限。如果我將它們翻譯爲JavaScript中的文字函數,我無法確定它們正在運行哪個對象以及它應具有哪些權限。如果用戶在另一個用戶對象上調用某個函數,那麼我無法攔截該調用並在權限不正確時停止該調用。我並不是完全不知道哪些語言用於動詞代碼,而只是需要將其「沙箱化」。只有當用戶設置屬性時,屬性才需要可讀/可寫,與動詞相同。我想我可以使用重載的語言(如PHP的__get,__set,__call)。

我還需要能夠注入這些變量爲動詞:(主要來自輸入的命令來確定,除非動詞正在從另一個動詞的稱呼)

player (object)   the player who typed the command 
this (object)   the object on which this verb was found 
caller (object)   this will be the same as ‘player’, unless another 
          verb calls the command in which case it is the object 
          containing that verb. 
verb (string)   the first word of the command 
argstr (string)   everything after the first word of the command 
args (list of strings) a list of the words in ‘argstr’ 
dobjstr (string)   the direct object string found during parsing 
dobj (object)   the direct object value found during matching 
prepstr (string)   the prepositional phrase found during parsing 
iobjstr (string)   the indirect object string 
iobj (object)   the indirect object value 

我也需要能夠從任何其他對象訪問任何對象(只要權限解決)。

// Object #128. Verb: multiply Prep: this none this Perms: +r +x 
return (args[0] * args[1]); 

// Object #256. Verb: square  Prep: this none this Perms: +r +x 
return #128:multiply(args[0], args[0]); 

// Object #512. Verb: touch  Prep: any any this  Perms: +r 
// Has a property (int) 'size' on it. 
this.size = #256:square(this.size); 
this.description = "It's a large button, it spans " + this.size + " metres."; 
player:tell("You touch the button, it gets bigger."); 

用戶然後可以push button和按鈕對象的大小屬性將平方。

推薦閱讀

我強烈建議你在http://bit.ly/17XIqjY讀取文檔的系統應該如何工作有更深入的想法。

我們還建議您閱讀以下文檔,μMOO基於LambdaMOO,它的方法:

+0

雖然我很欣賞這個問題的細節,但我建議你稍微編輯一下,以便更簡潔地理解主要問題。此外,僅供參考,有一個活躍的MOO開發社區:https://groups.google.com/forum/#!forum/moo-talk – georgek

+0

我知道MOO Talk論壇,但該論壇非常關注原始MOO服務器和核心。這是一個基於舊的原則的全新項目。我理解這個老人的工作原理是怎樣的,我不認爲他們可以提供這方面的幫助。無論如何,我會嘗試。我也不確定是否可以在不更加模糊的情況下編輯更多的問題,但是我得到的答案不會將整個概念考慮在內。 – R4wizard

+0

在GitHub上搜索LambdaMOO。有幾個現代的港口,你可以檢查出來。 – Brendan

回答

1

我把這個問題當作是要求一個語言年齡可以做你需要的東西。這就是我會試圖回答的。首先,這個任務絕對不適合任何主流或命令式語言,例如C#或Java。我甚至不會去想它。 Javascript是可能的,但不是它擅長什麼,也沒有什麼具體的推薦它。其次,如果你擁有合適的技能,那麼設計一種全新的語言並花上一年或兩年的時間來開展工作是一個很好的機會。人們真的這樣做,但我不推薦它,除非你喜歡那種自虐的經歷。 [I do。]

所以我的建議是,你擴大你的語言經驗,直到你找到一場比賽。在我熟悉的語言中,Ruby是最好先嚐試的。只要你說inject these variables into the verb你讓我想起了Ruby,因爲很多Ruby軟件(包括Rails)都是這樣構建的。忘記Python,Perl和Javascript:我真的不認爲他們會破解它。

除了Ruby之外,你可能會想到Lua。最近我還沒有使用它,它可能不適合,但它被廣泛用作遊戲腳本語言。

除此之外,還有真正的功能語言。其中最古老的是Lisp。你可以在Lisp中完成任何事情,包括首先實現你正在尋找的語言。然後是Scala和Haskell,僅舉兩個例子。他們想要學習,但很適合你的問題。

沒有太多的答案,因爲它基本上說:依次學習這些語言,直到你找到一個適合你的東西。 [如果可以的話,很樂意幫助。我對Moo有美好的回憶。]

+0

我一直在考慮設計自己的語言,但難以達到這個水平。我不是一個程序員,但設計一門語言並不是我深入研究的內容。你有我可以聯繫你的電子郵件地址嗎?也許我們可以開展一些工作。 MOO引發了我對計算機的興趣,並且我從未停止過,我很樂意將它轉移到現代。 – R4wizard

+0

如果您向我的個人資料中提到的任何一家公司發送電子郵件davidb,該郵件將發送給我。 –