最近几天正在找工作,所以更新BLOG晚了一些。今天在老婆的催促下终于要更新了。
通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解。但是中心服务器和登录服务器毕竟是游戏外围的部分,也就是说设计好了它们也还是无法实现编写一款游戏的目的啊。今天我们就来探讨一下如何设计游戏服务器。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
通过对QQ游戏、远航、联众等游戏的分析。我们可以发现一些规律:
1:每个已经登录到大厅的玩家需要在树形列表中选择需要进入的游戏房间。
2:在游戏房间中我们可以进行坐下、更换座位、离开房间等操作。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
3:几乎每一款游戏进入后,都需要点击“开始”或者“准备”按钮。点击后玩家在房间游戏桌上的状态变为一个举手的标志,这表明玩家已经准备好随时进行游戏了。
4:当一个桌子的所有玩家都满足“游戏开始”状态以后,在游戏房间中会显示此游戏桌为游戏状态。
以上4点是几乎每一款游戏都具有的过程。通过分析我们可以发现如果以玩家角度来看,一个玩家大致具有一下这么6种状态:
1、  空闲:玩家已经进入房间,但是并没有做其它的操作。
2、  坐下:玩家点击了椅子,自己的头像已经在椅子上显示,并且游戏界面已经打开。
3、  举手:玩家已经点击了游戏界面上的开始(有的游戏叫举手)按钮。游戏界面上已经显示自己处于“准备”(QQ游戏显示准备)或者“等待开始”信息。
4、  游戏:玩家处在游戏过程之中。这种状态也包含类似于连连看、对对碰游戏中用于自己已经失败,但是还有其它玩家在游戏的情况。
5、  旁观:玩家点击一个已经开始的游戏桌中的一个玩家头像,可以看见此玩家正在游戏的即时信息。
6、  断线:玩家的客户端和服务端已经断开连接时的状态。
而对玩家这6种状态的维护是棋牌类游戏的一个很关键的部分。大家可以看到对于一个玩家来说,从进入一款游戏到退出游戏,他的状态就在这6种状态中来回变换。
下图为玩家状态转换图:
 
通过上面的分析,我们在定义玩家信息结构的时候就比较方便了。以下是我定义的玩家信息结构。
  RUserSocket = record
    Socket:TSocket;            //套接字
    UserID:Pchar;              //玩家编号
    UserName:Pchar;           //玩家名称
    UserKey:Pchar;            //玩家解密和加密时使用的密钥
    Room:Integer;             //玩家所在的房间
    Dask:Integer;              //玩家所在的座位
    PawID: Integer;            //座位号
    Sex: Boolean;              //玩家性别
    Email:pchar;               //电子邮件
    GameID: pchar;            //游戏编号
    ByName:Pchar;            //玩家昵称
    CurrState: Integer;          //玩家状态
    Face: Integer;              //玩家头像
    Grade: Integer;             //游戏等级
    Score: Integer;             //积分
    TotalScore: Integer;         //总成绩
    winnum: Integer;           //赢盘数
    losenum: Integer;           //输盘数
LookOnList:TList;          //旁观玩家列表
LogonTimer:TDateTime;     //玩家登录时间
    end;
  PUserSocket = ^RUserSocket;
对于一个游戏服务器上的用户的管理,我们可以放在一个全局链表中,对这个链表的维护我们可以放在一个类中(例如叫:TUserControl)。
如果我们以桌子为对象来看,游戏桌的状态应该分为:
1、  空闲状态:桌子没有开始游戏时候的状态。
2、  游戏状态:桌子正在游戏的时候的状态。
这样我们就可以设计出桌子的结构信息:
RDeskStatus = record
    GameID:string[2];           //游戏编号
    RoomID:Integer;            //房间编号
    DeskID:Integer;             //桌子编号
    UserNums:Integer;           //在这个桌子上的玩家个数(不含旁观用户)
    Status:Integer;               //桌子状态  0:没有开始游戏 1:已经开始游戏
  end;
PDeskStatus = ^RDeskStatus;
对于桌子的信息我们也放在一个链表中,并使用一个类来进行管理。(例如叫:TDeskControl)
接下来的问题就是,如何将玩家的信息和桌子的信息关联起来呢?
我们知道,一个玩家进入房间后,这个房间的其它玩家的坐下、举手、游戏开始等等的状态他都应该可以接收到。所以每一个房间的玩家信息都应该由一个链表来维护。同时这个链表应该还维护这个房间桌子的状态信息。
以下是我设计的房间信息的结构:
RUserRoom = record
    Room:Integer;                 //房间编号
    DeskStatusList:TList;           //本房间桌子状态信息链表  存放PdeskStatus指针。
    ListUser:TList;                //玩家列表                存放PuserSocket指针。
  end;
PUserRoom = ^ RUserRoom;
对于这个结构的维护我们也可以使用一个类来做(例如:TRoomControl)。
以上的3个类是游戏服务器主要编写的3个类。如何实现我们将在“实现篇”中来说明。
我们知道我们设计出来的游戏服务器应该具有良好的可扩展性,以便于我们以后添加一些未知的游戏和游戏类型。那如何做到游戏服务器的可扩展性呢?通过分析我们发现,每一套游戏差别主要在于游戏的本身。例如象棋游戏和挖坑游戏,它们的区别在于游戏的规则(一个是棋类游戏,一个是牌类游戏),而不在于玩家的状态(这两款游戏玩家都有坐下、举手、游戏等等功能)。所以我们要做到游戏服务器的可扩展性,应该将游戏的逻辑部分和玩家的状态区分开来。将玩家状态部分让游戏服务器来管理,将游戏逻辑部分使用脚本或者DLL的方式来动态加载。这样我们就可以实现游戏服务器的可扩展性。
下一篇我们就来探讨如何让游戏服务器动态的加载一个未知的游戏逻辑信息。

使用Delphi编写棋牌类游戏 – 设计篇(3)相关推荐

  1. 棋牌类游戏服务器架构全面总结

    一.棋牌类服务器的特点 1,棋牌类不分区不分服 一般来说,棋牌游戏都是不分区不分服的.所以棋牌类服务器要满足随着用户量的增加而扩展的需要. 2,房间模式 即在同一局游戏中就是在同一个房间中,同一个房间 ...

  2. 基于Java多线程的打怪升级类游戏设计与开发

    摘要:本文论述了通过JAVA多线程.基于JAVA Swing的GUI图形用户界面设计.IO输入输出流.JDBC技术,实现了游戏系统的UI设计.游戏数据的存储.关卡的设置.用户头像的上传与更改.游戏数据 ...

  3. 棋牌类游戏算法–牌分类_快速分类–三向和双枢轴

    棋牌类游戏算法–牌分类 毫无疑问,Quicksort被认为是本世纪最重要的算法之一,并且它是许多语言的事实上的系统排序,包括Java中的Arrays.sort . 那么,quicksort有何新功能? ...

  4. C# 写的棋牌类游戏(全源码)。

    C# 写的棋牌类游戏(全源码) http://d.namipan.com/d/b47c1bb0ed558e95c85313ba845e57ddad98b70568aa6704 有兴趣的开发者可以下载看 ...

  5. 斗地主棋牌类游戏中的洗牌和发牌算法

    前言 洗牌和发牌是棋牌类游戏中,非常重要的两个关键节点,而这两个关键节点涉及的算法,很多同学非常感兴趣,今天,我们就以NodeJS环境为例,通过JS代码给大家解说洗牌和发牌算法. 一. 洗牌算法 1. ...

  6. python设计棋牌游戏_python开发棋牌类游戏

    pycharm专门针对用户打造的一种可以进行编辑的工具,它的功能设置比较强大,而且具有跨平台的使用特性,能方便用户通过跨平台的方式使用该软件,有效节省的使用时间,那么这款详情>> 阅读: ...

  7. 棋牌类游戏的开发心得

    一个多人在线的棋牌类网络游戏的项目临近尾声,我参与了该项目的整个设计流程,并且完成了90%的核心代码.关于这个项目,有很多地方值得聊一聊.本系列不打算把这个项目将得多么详细规范,那是设计文档应该描述的 ...

  8. **[游戏测评]**点评新游《骇厉四斩》分析动作格斗类游戏设计

    今天带来的是Steam今年2月份上市的新游 --<Hellish Quart(骇厉四斩)>的分析评测.我会带领大家了解这款游戏,分享我自己的游戏体验,并从游戏专业的角度对这款游戏的设计进行 ...

  9. Unity|| 如何把生存类游戏设计得更优秀

    你是否曾经玩过这样的生存类游戏: 1.通过最初阶段后,你觉得游戏变得越来越简单 2.游戏的重点从生存转移到了基地建设或其他方面 诸如此类,很大程度上是由于糟糕的难度曲线所致.包括很多(非常受欢迎的)生 ...

最新文章

  1. 响应式网页的布局设计
  2. Delphi 正则表达式语法(3): 匹配范围
  3. 学python心得体会1000字-Python学习心得体会总结,不要采坑
  4. 人生中五个遗憾,共勉
  5. 致青春——谁的青春没有遗憾2018-01-05
  6. kibana操作elasticsearch:匹配查询(match)
  7. Dictionary Aizu - ALDS1_4_C
  8. python牛客网编程题_【面经】小米软件开发一面(python)面经 2020 2020
  9. libc 无法访问null_C中strlen的NULL参数
  10. 前端:HTML/03/超级链接,绝对地址URL,相对地址URL,特殊链接
  11. 麒麟980+巴龙5000!华为Mate 20 X 5G版通过3C认证:支持40W快充
  12. 笔者认为,中国的互联网行业需要真正的CEO
  13. unity中的UV是什么
  14. 用excel制作项目管理甘特图
  15. 周鸿祎说:编程能力比马化腾强,不如雷军。你怎么看?
  16. android win7共享文件夹,手把手教你win7系统怎么共享文件夹
  17. jzoj6152. 【GDOI2019Day2模拟2019.4.29】Endless (倍增维护并查集,平方串)
  18. 不拆微动,一招解决鼠标双击问题
  19. 【论文随笔2】COALA: Co-Aligned Autoencoders for Learning Semantically Enriched Audio Representations
  20. 模板引擎不关心内容之——art-template,碰见的同步与fs.readFile异步以及函数回调问题的描述,针对fs的readfille读取文件时,返回不了异步函数返回值的解决方法

热门文章

  1. WebSocket(伍) 断开连接
  2. MicroPython支持SPI驱动外部Flash了
  3. Python——7列表生成式
  4. CentOS 安装Sqlite3
  5. 关于SAP性能优化的讨论
  6. 红帽企业存储管理之iscsi简单应用
  7. 谷歌发布GPhone 创始人亲自上阵
  8. android adb 进程端口号被占解决方法
  9. 客户端和服务器各种报错解释
  10. spring security reactive获取security context