游戏大厅 从基础开始(1)——最简单的关系,用户与房间

 

游戏大厅 从基础开始(1)2008121507524789.gif2008121523174597.jpg2008121523184070.jpg2008121523192135.jpg2008121523195086.jpg2008121523202140.jpg2008121523204470.jpg

——最简单的关系,用户与房间。

 

做游戏 就好像写一篇简单的记叙文

作为小学语文大纲要求 记叙文需要完整地叙述:

时间,地点,人物,事件

也就是 WHEN , WHERE, WHO, WHAT HAPPENED

猜猜哪个最重要?

我选WHO

 

WHO

 

没有WHO,没有了某个意识的主观活动影响客观环境,故事就是静止的。那就不叫故事,叫速写。

 

在一个网络游戏服务模型中,最基础的概念就是 WHO

有了WHO游戏才不是电影电视剧那样的直接灌输。

有了WHO电脑屏幕前的个体才能与别的个体有所区分

有了个体的区分 网络游戏才可以"互动"。

 

最最基础的用户的存在,至少要有一个唯一的数据库ID,一个登陆用的用户名,一个友好的名字

121108_1453_11.png

  • 唯一的ID 让数据库认识你是WHO
  • 唯一的登录名 让服务程序认识你是WHO
  • 友好的名字 让别的WHO认识你是WHO

 

其次是

WHERE

WHERE的本质用途是 隔离WHO和资源。

试想有一座学校 ,没有分别的教室而只有一间大会堂,三十多名老师和校工 四百多个学生一起办公与学习,一边在唱着童年的歌谣,一边在笑人齿缺曰狗窦大开。

把学校换成服务器 把学生换成用户 这样的烂摊子你能收拾得了么?

我们需要教室!

121108_1453_12.png

  • 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 接口

 

 121108_1453_13.png

 

 

 

IArea之间不再用链表而是使用IPathWay互相连接。IPathWay是单程的  是可以附加属性的(坐标,范围,条件)

IArea本身可以通过添加或者减少IPathWay来保证与其他Area的连接

Iuser可以选择直接移动  还是按照已经准备好的IPathWay 规则来移动。

每个IPathWay 都有自己的方向

对于父子树来说 之需要一个水平方向的x轴,  深层是正方向

对于二维十字地图链表  我们把地图映射到坐标系   东为x的正方向  北为Y轴正方向

对于三维  上为正

对于更多。。。。

对于完全没有道理但是一定会存在的那种特殊路径  在6维空间以下的坐标系  我们可以直接放在C轴

 

这就是最简单的房间与用户的交互

房间组织 -〉  用户进入 ——〉  用户移动

 

参考代码:

 

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code

'-----------------------------
'
         Wayne Wang 
'
          个人研究 
'
    不是什么了不起的东西 
'
    有错误的话还请告诉我
'
          努力奋斗
'
            Yeah!
'
-----------------------------



Namespace Common
    
''' <summary>
    
''' 基础“区域”
    
''' Basic Area
    
''' </summary>
    
''' <remarks>
    
''' 能够通过AreaLink和其他区域,或者与其他用户交互 Can interactive with other areas(by arealink)  and  users
    
''' </remarks>

    
Public Interface IArea

        
''' <summary>
        
''' 区域名称
        
''' Area Display Name
        
''' </summary>
        
''' <remarks>显示名称</remarks>
        
''' <value>"0000001|GameHall"</value>

        
ReadOnly Property Name() As String

        
''' <summary>
        
''' 区域的唯一ID
        
''' Unique ID of Area
        
''' </summary>
        
''' <remarks>
        
''' 随机生成 临时的 或者被设置为特殊用途的特定值(AutoGen  tempory or be set for special use.)
        
''' </remarks>
        
''' <value>{guid xxxxx-xxxxx-xxxx-xxxx}</value>
        ReadOnly Property ID() As String

        
''' <summary>
        
''' 用户列表
        
''' </summary>
        ReadOnly Property Users() As IDictionary(Of String, Common.IUser)

        
''' <summary>
        
''' 本区域对外的通路
        
''' </summary>
        ReadOnly Property PathWays(ByVal axis As IPathWay.PathWayAxis, ByVal direction As IPathWay.PathWayDirection) As System.Collections.Generic.IEnumerable(Of IPathWay)

        
ReadOnly Property CreateTime() As Date


        
''' <summary>
        
''' 加入一个通路
        
''' </summary>
        Sub PathMount(ByVal path As IPathWay)

        
''' <summary>
        
''' 去掉一个通路
        
''' </summary>
        Sub PathDemount(ByVal path As IPathWay)

        
''' <summary>
        
''' 为两区域之间添加一条双向通路  也就是两条不同方向的通路
        
''' </summary>
        
''' <remarks></remarks>
        Sub AreaCreatePairPathWay(ByVal targetArea As IArea, ByVal axis As IPathWay.PathWayAxis, ByVal targetDirection As IPathWay.PathWayDirection)

        
''' <summary>
        
''' 用户加入
        
''' </summary>
        Sub UserJoin(ByVal user As Common.IUser)

        
''' <summary>
        
''' 用户离开
        
''' </summary>
        Sub UserLeave(ByVal User As Common.IUser)


















    
End Interface
End Namespace






 

 

ContractedBlock.gif ExpandedBlockStart.gif Code

'-----------------------------
'
         Wayne Wang 
'
          个人研究 
'
    不是什么了不起的东西 
'
    有错误的话还请告诉我
'
          努力奋斗
'
            Yeah!
'
-----------------------------



Namespace Common


    
''' <summary>
    
''' PathWay: A Link From one area to another
    
''' 通路: 一条从一个区域到另一个区域的连接
    
''' </summary>
    
''' <remarks>
    
''' 
    
''' 
    
''' 如果是一维父子关系  那么只存在x轴上的  -1up(上一层)和1down(下一层)的两种通路
    
''' 
    
''' 如果是2维的十字链表地图 则可以用x y两个轴。
    
''' 
    
''' 
    
''' 通路的两个端点的属性 由 SourceProperties和TargetProperties 两个集合保存
    
''' </remarks>
    Public Interface IPathWay


        
''' <summary>
        
''' 这个路径在当前纬度的方向。
        
''' </summary>
        ReadOnly Property Direction() As PathWayDirection

        
''' <summary>
        
''' 路径终点的区域
        
''' </summary>
        ReadOnly Property TargetArea() As IArea

        
''' <summary>
        
''' 路径终点的参数字典
        
''' </summary>
        ReadOnly Property TargetProperties() As IDictionary(Of StringObject)

        
''' <summary>
        
''' 路径起点的参数字典
        
''' </summary>
        ReadOnly Property SourceProperties() As System.Collections.Generic.IDictionary(Of StringObject)






        
''' <summary>
        
''' 表示这个路径在区域的轴上的上方还是下方
        
''' </summary>
        Enum PathWayDirection

            
''' <summary>
            
''' 任意
            
''' </summary>
            Any = Nothing
            
''' <summary>
            
''' 正方向
            
''' </summary>
            Forward = 1
            
''' <summary>
            
''' 负方向
            
''' </summary>
            Backward = -1


        
End Enum

        
''' <summary>
        
''' 表示这个路径在区域的哪个轴
        
''' </summary>
        Enum PathWayAxis
            
''' <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

        
End Enum

    
End Interface
End Namespace

 

 

ContractedBlock.gif ExpandedBlockStart.gif Code

'-----------------------------
'
         Wayne Wang 
'
          个人研究 
'
    不是什么了不起的东西 
'
    有错误的话还请告诉我
'
          努力奋斗
'
            Yeah!
'
-----------------------------


Namespace Common


    
''' <summary>
    
''' Basic User  
    
''' 基础用户
    
''' </summary>
    
''' <remarks>
    
''' 登陆的基础单位  
    
''' 一个逻辑可操作的人
    
''' </remarks>
    Public Interface IUser


        
''' <summary>
        
''' 用户的登陆名(小写)
        
''' </summary>
        ReadOnly Property UID() As String

        
''' <summary>
        
''' 用户在数据库中同样有效的行Key
        
''' </summary>
        ReadOnly Property DatabaseID() As Guid
        
''' <summary>
        
''' 用户的友好名
        
''' </summary>
        Property NickName() As String

        
''' <summary>
        
''' 用户当前的位置
        
''' </summary>
        ReadOnly Property CurrentArea() As IArea

        
''' <summary>
        
''' 用户的登陆时间
        
''' </summary>
        Property LoginTime() As Date

        
''' <summary>
        
''' 用户的客户端连接
        
''' </summary>
        ReadOnly Property ClientLink() As Communication.IClientLink
        
''' <summary>
        
''' 用户移动到另一个位置
        
''' </summary>
        
''' <param name="targetArea">目标位置</param>
        Sub Move(ByVal targetArea As IArea)

        
''' <summary>
        
''' 用户顺着某一个路径移动到另一个位置
        
''' </summary>
        
''' <param name="leadingPathWay">作为移动根据的路径</param>
        Sub Move(ByVal leadingPathWay As IPathWay)

        
''' <summary>
        
''' 用户移动到另一个用户的位置
        
''' </summary>
        Sub Move(ByVal targetUser As IUser)

        
''' <summary>
        
''' 用户退出
        
''' </summary>
        Sub Logoff()








    
End Interface
End Namespace

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1621917.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈

平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…

解决MASM32代码汇编出错: error A2181: initializer must be a string or single item

最近用MASM32编程更新SysInfo&#xff0c;增加对IPv6连接信息的收集&#xff0c;使用到了 typedef struct _MIB_TCP6ROW_OWNER_MODULE {UCHAR ucLocalAddr[16];DWORD dwLocalScopeId;DWORD dwLocalPort;UCHAR ucRemoteAddr[16];DWORD …

文本分类任务

文章目录 引言1. 文本分类-使用场景2. 自定义类别任务3. 贝叶斯算法3.1 预备知识3.2 贝叶斯公式3.3 贝叶斯公式的应用3.4 贝叶斯公式在NLP中的应用3.5 贝叶斯公式-文本分类3.6 代码实现3.7 贝叶斯算法的优缺点 4. 支持向量机4.1 支持向量机-核函数4.2 支持向量机-解决多分类4.3…

android系统启动流程之zygote如何创建SystemServer进程

SystemServer:是独立的进程&#xff0c;主要工作是管理服务的&#xff0c;它将启动大约90种服务Services. 它主要承担的职责是为APP的运行提供各种服务&#xff0c;像AMS,WMS这些服务并不是一个独立的进程&#xff0c; 它们其实都是SystemServer进程中需要管理的的众多服务之一…

从零到富:探索CSGO搬砖项目的无限可能

在如今互联网时代&#xff0c;有一项令人惊叹的项目正悄然兴起&#xff0c;它就是CSGO搬砖项目。作为一个从零开始的家伙&#xff0c;我亲身经历了这个项目的神奇魅力&#xff0c;每天轻松赚取几十上百的收益&#xff0c;无风险&#xff0c;低成本。今天&#xff0c;我将带领大…

Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

一、Redis是什么 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、…

围棋与育种

最近因为娃子报名了围棋课&#xff0c;我本着交一次课学两个人的态度&#xff0c;入门围棋&#xff0c;买了些书&#xff0c;听了些课&#xff0c;有所得。学了两个多月&#xff0c;现在6级水平&#xff0c;了解了基本的攻杀技巧&#xff0c;会判断输赢。 下面截图是今天的一盘…

QQ号大规模被盗与你我有什么关系?你我该如何做?

QQ号大规模被盗与你我有什么关系&#xff1f;你我该如何做&#xff1f; 时值QQ号大规模被告事件已经过去多天&#xff0c;今天&#xff0c;我们再次回顾一下此次事件的经过&#xff1a; 1、大规模用户被盗号。 2、不法分子用盗得账号向家人、朋友及其他联系人发送不雅图片。 …

wireshark抓包QQ号

过滤栏输入oicq&#xff0c;然后随便打开一个数据包&#xff0c;就可看到其qq号。 查看移动端QQ的账号 因为是用的是TCP协议&#xff0c;而TCP数据包众多&#xff0c;所以不方便过滤。 但是我发现在info栏中带有scotty-ft字样的数据包中可以找到qq号。你可以按ctrlF选择字符串过…

QQ号1941663132是一个诈骗

我一个拼多多订单(20元)中通运单丢失; 然后两个自称物流公司的电话联系我:19141980127/18988189942; 说是赔偿我 100 多块; 叫我订单截图发给他们客服QQ1941663132; 加了QQ、截图隐私信息打马赛克发了他; 对方给我一个二维码,我解析了一下,是一个 HTTP 协议不安全的网址…

[笔记] 阿里云域名知识

文章目录 前言一、域名二、域名常见分类2.1 泛域名2.2 为什么要设置子域名 三、记录类型3.1 A- 将域名指向一个PV4地址3.2 CNAME- 将域名指向另外一个域名3.3 AAAA- 将域名指向一个PV6地址3.4 MX- 将域名指向邮件服务器地址3.5 SRV- 记录提供特定的服务的服务器使用场景 3.6 TX…

飞秋接收文件提示防火墙

1、效果&#xff1a; 2、打开控制面板&#xff0c;设置小图标模式 3、打开防火墙设置 4、入站规则&#xff1a;把飞秋的路径添加 5、同理把出站规则也配一下。

飞秋与虚拟机的有关IP设置

由于各种原因公司规定&#xff0c;有一部分机器是不能上外网的。所以统一使用飞秋&#xff0c;这个聊天软件在公司内部。 今天&#xff0c;在自己的机器上弄了一个虚拟机&#xff0c;呵呵&#xff0c;你懂的哦&#xff0c;肯定使用的VMware了&#xff0c;不过咱使用的比较高的版…

如何使用飞秋FeiQ实现两电脑通信(或传输文件)

如何使用飞秋FeiQ实现两电脑通信&#xff08;或传输文件&#xff09; 1. 在两天电脑上&#xff0c;分别按照飞秋FeiQ 我使用的绿色飞秋2013正式版 2. 使用一根网线&#xff0c;将两电脑的网口连接一起 3. 设置飞秋FeiQ的端口号不同 &#xff08;1&#xff09;点击设置图标 &…

飞秋不能传递文件的两种情况

问题描述 当我们通过飞秋传递文件是经常出现失败的问题&#xff0c;但是说话没毛病。 下面列出两种解决办法&#xff0c;并且是又先后优先级的 情况一 我们首先需要的是将内网IP映射到外网的一个IP上&#xff0c;并且将IP与mac绑定&#xff0c;防止重启电脑后&#xff0c;内…

AndroidQ(十)Android Q功能和API

Android Q 功能和 API Android Q 为用户和开发者引入了强大的新功能。本文重点介绍面向开发者的新功能。 要了解新版 API&#xff0c;请阅读 API 差异报告或访问 Android API 参考。为醒目起见&#xff0c;将突出显示新版 API。此外&#xff0c;请务必查阅 Android Q 行为变更…

使用python模拟飞秋,网络助手发消息及自动回复简易制作

udp网络程序流程 创建一个基于udp的网络程序流程很简单&#xff0c;具体步骤如下&#xff1a; 创建客户端套接字&#xff1a;socket 发送/接收数据&#xff1a;sendto/recvfrom 关闭套接字 注意 此外还要对飞秋发送协议的简要了解&#xff0c;会更清楚帮助理解&#xff1…

Q-learning原理及其实现方法

Q_learning原理及其实现方法 声明前期回顾简介Q_learning算法Q_learning算法流程Q_learning算法理解Q_learning算法实现知识拓展 声明 学习博客快乐的强化学习1——Q_Learning及其实现方法&#xff0c;加之自己的理解写成&#xff0c;同时欢迎大家访问原博客 前期回顾 pytho…

2015Mac版飞秋无法接受文件夹!!!

飞秋Mac版和windows版在同一个网段下可以互传文件&#xff0c;但是不能传文件夹&#xff0c;脑壳疼。。。 各路大神可以重写飞秋的方法我就不敢说了&#xff0c;只能绕绕弯才能维持得了生活这样子&#xff0c;也可以用其他的飞鸽传书之类 但是大家都用飞秋我也没办法QAQ 用V…

用飞秋给朋友发送消息失败的原因分析及解决办法

作者&#xff1a;朱金灿 来源&#xff1a;http://blog.csdn.net/clever101 使用飞秋经常发生这样的错误&#xff1a; 给用户***发送失败&#xff01;可能用户已下线,或网络原因,或您发送的内容太长。您可刷新用户列表后重试。 温馨提示:如果对方不在线&#xff0c;您发送信息时…