我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Delphi编写×××类游戏 – 设

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Delphi编写×××类游戏 – 设

最近几天正在找工作,所以更新BLOG晚了一些。今天在老婆的催促下终于要更新了。
通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解。但是中心服务器和登录服务器毕竟是游戏外围的部分,也就是说设计好了它们也还是无法实现编写一款游戏的目的啊。今天我们就来探讨一下如何设计游戏服务器。

 

通过对QQ游戏、远航、联众等游戏的分析。我们可以发现一些规律:
1:每个已经登录到大厅的玩家需要在树形列表中选择需要进入的游戏房间。
2:在游戏房间中我们可以进行坐下、更换座位、离开房间等操作。
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的方式来动态加载。这样我们就可以实现游戏服务器的可扩展性。

 

下一篇我们就来探讨如何让游戏服务器动态的加载一个未知的游戏逻辑信息。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Delphi编写×××类游戏 – 设

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Delphi编写×××类游戏 – 设

最近几天正在找工作,所以更新BLOG晚了一些。今天在老婆的催促下终于要更新了。通过以上两篇关于对中心服务器和登录服务器设计的阐述,大家应该对设计它们有了一定的了解。但是中心服务器和登录服务器毕竟是游戏外围的部分,也就是说设计好了它们也还是无
2023-01-31

使用Java编写一个2048小游戏

本文章向大家介绍使用Java编写一个2048小游戏的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页
2023-06-06

使用JavaScript编写一个2048小游戏

今天就跟大家聊聊有关使用JavaScript编写一个2048小游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点
2023-06-07

使用Java编写石头剪刀布游戏

使用Java编写石头剪刀布游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码package Ring1270.pra.java01;import java.util.Sca
2023-06-06

使用java编写一个猜字母游戏

使用java编写一个猜字母游戏?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和
2023-06-06

怎么使用js编写实现拼图游戏

这篇文章主要讲解了“怎么使用js编写实现拼图游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用js编写实现拼图游戏”吧!目标使用原生js编写一个拼图游戏,我这里写了两种拼图的方法。一
2023-07-02

如何使用Direct3D设计体育类游戏

编程学习网:Direct3D是基于微软的通用对象模式COM(CommonObjectMode)的3D图形API。 下面我们就通过展示一个小游戏的编写程序,教会大家如何使用Direct3D。
如何使用Direct3D设计体育类游戏
2024-04-23

怎么使用c语言编写简单小游戏

编写一个简单的猜数字小游戏的例子:```#include #include #include int main() {int randomNumber, guess, attempts = 0;// 生成随机数srand(time(0));
2023-08-31

怎么用Lua编写猜数字游戏

本篇内容主要讲解“怎么用Lua编写猜数字游戏 ”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Lua编写猜数字游戏 ”吧!Lua 代码首先,你必须设置一个伪随机数生成器,这样你的玩家就有一些
2023-06-15

利用Python编写数字战舰游戏

本篇内容主要讲解“利用Python编写数字战舰游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“利用Python编写数字战舰游戏”吧!前言制造多艘战舰:你需要小心,因为你需要确保你不要在战斗板上
2023-06-02

利用Python编写游戏程序,打造自己的游戏作品

利用Python编写游戏程序,打造自己的游戏作品,需要具体代码示例Python是一种高级、通用、解释型程序设计语言。它具有简洁明了的语法、易于学习的特点,并且具有广泛的应用,可以用于网络应用、图形界面编程和游戏开发等多种领域。本文将介绍
利用Python编写游戏程序,打造自己的游戏作品
2024-01-19

如何使用shell脚本编写俄罗斯方块游戏

这篇文章主要介绍如何使用shell脚本编写俄罗斯方块游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!粘贴以下代码到一个空的Shell脚本文件中,并在Bash 中运行即可!代码如下:#!/bin/bash# Tetr
2023-06-09

怎么用C++编写一个井字游戏

这篇文章主要介绍“怎么用C++编写一个井字游戏”,在日常操作中,相信很多人在怎么用C++编写一个井字游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C++编写一个井字游戏”的疑惑有所帮助!接下来,请跟
2023-06-17

利用java编写一个弹球小游戏

本篇文章给大家分享的是有关利用java编写一个弹球小游戏,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。弹球游戏实现原理:  隔一定时间(小于1秒)重新绘制图像,因为Graphi
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录