程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> 游戲大廳從基礎開始(1)——最簡單的關系,用戶與房間

游戲大廳從基礎開始(1)——最簡單的關系,用戶與房間

編輯:VB.NET

做游戲 就好像寫一篇簡單的記敘文

作為小學語文大綱要求 記敘文需要完整地敘述:

時間,地點,人物,事件

也就是 WHEN,WHERE,WHO,WHAT HAPPENED

猜猜哪個最重 要?

我選WHO

WHO

沒有WHO,沒有了某個意識的主觀活動影響客觀環境,故事就是 靜止的。那就不叫故事,叫速寫。

在一個網絡游戲服務模型中,最基礎的概念就是 WHO

有了WHO游戲才不是電影電視劇那樣的直接灌輸。

有了WHO電腦屏幕前的個體才能與別的個體有所 區分

有了個體的區分 網絡游戲才可以"互動"。

最最基礎的用戶的存在,至少 要有一個唯一的數據庫ID,一個登陸用的用戶名,一個友好的名字

唯一的ID 讓數據庫 認識你是WHO

唯一的登錄名 讓服務程序認識你是WHO

友好的名字 讓別的WHO認識你是 WHO

其次是

WHERE

WHERE的本質用途是 隔離WHO和資源。

試想有一座學校 ,沒有分別的教室而只有一間大會堂,三十多名老師和校工 四百多個學生一起辦公與學習,一邊在唱著 童年的歌謠,一邊在笑人齒缺曰狗窦大開。

把學校換成服務器 把學生換成用戶 這樣的爛攤子你 能收拾得了麼?

我們需要教室!

ID 表示房間是 504

Name 表示班級是三年二班

Users是全體在教室的同學

我們可以更換房間的名 字變成五年三班 但是我們改變不了這是五樓的第四間房

這就是ID和Name的區別

最基本的 User和Area的關系需求:

用戶和區域都能標識自己

用戶和區域都具有友好名

區域 間可以建立聯系,產生空間結構

區域可以被用戶進入

用戶可以在區域間移動

用戶 可以登出

這裡我們要著重分析一下房間與房間的關系

一維關系

典型的例子:棋牌 房間,勁x團,百戰天蟲,瘋狂坦克,浩方,QQ聊天室

這種樹形房間結構只有兩種關系:父,子 。實際上是在一個簡單維度上的兩個方向。一個房間有多個子房間,一般看成同一緯度上的若干不同的 點。用戶最基礎的移動操作就是 上一層 下一層。

二維關系

典型的例子:文字 MUD

常常聽說十字鏈表這個詞語,我最早就是從文字mud的開發文檔中接觸的。

作為一個 模擬真實的地圖,大家把區域模擬成類似國際象棋那樣的棋盤,彼此保留著鄰居的結構,或者類的引用

interface IArea

  property name as string ..

   ...

  ..

  property Warea as Area

  property  Earea as Area

  property Sarea as Area

  property Narea as Area

end class

用這種鏈表 用戶的身處環境就可以平滑有序的移動。

三維關系 一般網絡游戲(傳奇、RO)

後來更復雜些的MUD和網絡游戲 又增加了 UP和 DOWN兩個方向 比如xx地下城1層 2層,天空挑戰賽1層2層

有些是真的實現了立體鏈表 有些使 用更抽象的方式 在某個沒有鄰居的方向用二維十字鏈表模擬

多維關系和混合關系 (wow等等副 本游戲 立體地圖的部分游戲如孢子)

同目標多入口

比如ro 兩個地區間可能有2-3道 門 每一條都可以進入目標區域相應的位置。 所以相鄰的兩個地區間 僅僅維護一個彼此的引用是遠遠 不夠的

單程票

有的區域進得去出不來  

有的區域要滿足xx條件才能出來

有的區域要找另外一條道路才能出來

例外通路

回到最上層  回城

參考以 上可能性 我建立了目前的 IPathWay 接口

大圖

IArea之間不再用鏈 表而是使用IPathWay互相連接。IPathWay是單程的 是可以附加屬性的(坐標,范圍,條件)

IArea 本身可以通過添加或者減少IPathWay來保證與其他Area的連接

Iuser可以選擇直接移動 還是按 照已經准備好的IPathWay 規則來移動。

每個IPathWay 都有自己的方向

對於父子樹來說 之需要一個水平方向的x軸,深層是正方向

對於二維十字地圖鏈表 我們把地圖映射到坐標系  東為x的正方向 北為Y軸正方向

對於三維 上為正

對於更多。。。。

對於完全 沒有道理但是一定會存在的那種特殊路徑 在6維空間以下的坐標系 我們可以直接放在C軸

這就 是最簡單的房間與用戶的交互

房間組織-〉 用戶進入——〉 用戶移動

參考 代碼:

Code

'-----------------------------
'     WayneWang
'     個人研究
'  不是什麼了不起的東西
'  有 錯誤的話還請告訴我
'     努力奮斗
'      Yeah!
'---- -------------------------

NamespaceCommon
   '''<summary>
  '''基礎“區域”
   '''BasicArea
  '''</summary>
   '''<remarks>
  '''能夠通過AreaLink和其他區域,或者與其 他用戶交互Caninteractivewithotherareas(byarealink) and users
   '''</remarks>
  PublicInterfaceIArea
     '''<summary>
    '''區域名稱
     '''AreaDisplayName
    '''</summary>
     '''<remarks>顯示名稱</remarks>
     '''<value>"0000001|GameHall"</value>
     ReadOnlyPropertyName()AsString
    '''<summary>
     '''區域的唯一ID
    '''UniqueIDofArea
     '''</summary>
    '''<remarks>
     '''隨機生成臨時的或者被設置為特殊用途的特定值(AutoGen  temporyorbesetforspecialuse.)
    '''</remarks>
     '''<value>{guidxxxxx-xxxxx-xxxx-xxxx}</value>
     ReadOnlyPropertyID()AsString
    '''<summary>
     '''用戶列表
    '''</summary>
     ReadOnlyPropertyUsers()AsIDictionary(OfString,Common.IUser)
     '''<summary>
    '''本區域對外的通路
     '''</summary>
    ReadOnlyPropertyPathWays (ByValaxisAsIPathWay.PathWayAxis,ByValdirectionAsIPathWay.PathWayDirection) AsSystem.Collections.Generic.IEnumerable(OfIPathWay)
     ReadOnlyPropertyCreateTime()AsDate
    '''<summary>
     '''加入一個通路
    '''</summary>
     SubPathMount(ByValpathAsIPathWay)
    '''<summary>
     '''去掉一個通路
    '''</summary>
     SubPathDemount(ByValpathAsIPathWay)
    '''<summary>
     '''為兩區域之間添加一條雙向通路 也就是兩條不同方向的通路
     '''</summary>
     '''<remarks></remarks>
    SubAreaCreatePairPathWay (ByValtargetAreaAsIArea,ByValaxisAsIPathWay.PathWayAxis,ByValtargetDirectionAsIPathWay.Path WayDirection)
    '''<summary>
    '''用戶 加入
    '''</summary>
    SubUserJoin (ByValuserAsCommon.IUser)
    '''<summary>
     '''用戶離開
    '''</summary>
     SubUserLeave(ByValUserAsCommon.IUser)

  EndInterface
EndNamespace

Code

'-----------------------------
'     WayneWang
'     個人研究
'  不是什麼了不起的東西
'  有錯誤的話還請告訴我
'     努力奮斗
'      Yeah!
'-----------------------------

NamespaceCommon
   '''<summary>
  '''PathWay:ALinkFromoneareatoanother
  '''通路:一條從一個區域到另一個區域的連接
   '''</summary>
  '''<remarks>
   '''
  '''
  '''如果是一維父子關系 那麼只 存在x軸上的 -1up(上一層)和1down(下一層)的兩種通路
  '''
   '''如果是2維的十字鏈表地圖則可以用xy兩個軸。
  '''
   '''
  '''通路的兩個端點的屬性由SourceProperties和 TargetProperties兩個集合保存
  '''</remarks>
   PublicInterfaceIPathWay
    '''<summary>
     '''這個路徑在當前緯度的方向。
    '''</summary>
    ReadOnlyPropertyDirection()AsPathWayDirection
     '''<summary>
    '''路徑終點的區域
     '''</summary>
    ReadOnlyPropertyTargetArea()AsIArea
     '''<summary>
    '''路徑終點的參數字典
     '''</summary>
    ReadOnlyPropertyTargetProperties() AsIDictionary(OfString,Object)
    '''<summary>
     '''路徑起點的參數字典
    '''</summary>
     ReadOnlyPropertySourceProperties()AsSystem.Collections.Generic.IDictionary (OfString,Object)

    '''<summary>
     '''表示這個路徑在區域的軸上的上方還是下方
     '''</summary>
    EnumPathWayDirection
       '''<summary>
      '''任意
       '''</summary>
      Any=Nothing
       '''<summary>
      '''正方向
       '''</summary>
      Forward=1
       '''<summary>
      '''負方向
       '''</summary>
      Backward=-1
    EndEnum
     '''<summary>
    '''表示這個路徑在區域的哪個軸
    '''</summary>
    EnumPathWayAxis
       '''<summary>
      '''任意
       '''</summary>
      Any=Nothing
       '''<summary>
      '''第1個軸
       '''</summary>
      x=0
       '''<summary>
      '''第2個軸
       '''</summary>
      y=1
       '''<summary>
      '''第3個軸
       '''</summary>
      z=2
       '''<summary>
      '''第4個軸
       '''</summary>
      a=3
       '''<summary>
      '''第5個軸
       '''</summary>
      b=4
       '''<summary>
      '''第6個軸
       '''</summary>
      c=5
    EndEnum
   EndInterface
EndNamespace

Code

'------------------------ -----
'    WayneWang
'     個人研究
'  不是什麼了不起 的東西
'  有錯誤的話還請告訴我
'     努力奮斗
'       Yeah!
'-----------------------------
NamespaceCommon
   '''<summary>
  '''BasicUser 
  ''' 基礎用戶
  '''</summary>
   '''<remarks>
  '''登陸的基礎單位 
   '''一個邏輯可操作的人
  '''</remarks>
   PublicInterfaceIUser
    '''<summary>
     '''用戶的登陸名(小寫)
    '''</summary>
     ReadOnlyPropertyUID()AsString
    '''<summary>
     '''用戶在數據庫中同樣有效的行Key
     '''</summary>
    ReadOnlyPropertyDatabaseID()AsGuid
     '''<summary>
    '''用戶的友好名
     '''</summary>
    PropertyNickName()AsString
     '''<summary>
    '''用戶當前的位置
     '''</summary>
    ReadOnlyPropertyCurrentArea()AsIArea
     '''<summary>
    '''用戶的登陸時間
     '''</summary>
    PropertyLoginTime()AsDate
     '''<summary>
    '''用戶的客戶端連接
     '''</summary>
    ReadOnlyPropertyClientLink() AsCommunication.IClientLink
    '''<summary>
     '''用戶移動到另一個位置
    '''</summary>
     '''<paramname="targetArea">目標位置</param>
     SubMove(ByValtargetAreaAsIArea)
    '''<summary>
     '''用戶順著某一個路徑移動到另一個位置
     '''</summary>
     '''<paramname="leadingPathWay">作為移動根據的路徑 </param>
    SubMove(ByValleadingPathWayAsIPathWay)
     '''<summary>
    '''用戶移動到另一個用戶的位置
    '''</summary>
    SubMove(ByValtargetUserAsIUser)
    '''<summary>
    '''用戶退出
     '''</summary>
    SubLogoff()

   EndInterface
EndNamespace

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved