四、扑克牌的生成
游戏中需要为用户生成随机的扑克牌,首先我们需要初始化一副牌,放到一个Hashmap中,每张牌以一个字节表示,高为代表花色,的为代表数字,生成整副牌:
private static HashMap cards = new HashMap();
int tmp=0;
for (int i = 0; i <4; i++) {
for (int m = 0; m < 13; m++) {
tmp=((byte)(i)<<4)|((byte)m); //使用位操作构造一张牌
cards.put(new Integer(i * 13 + m),new Byte((byte)tmp));
}
}
cards.put(new Integer(53), new Byte((byte)0x4d)); //大王
cards.put(new Integer(54), new Byte((byte)0x4e)); //小王
如何随机地得到其中的N张牌呢?我们的做法是生成一个0-55的随机数,用这个随机数作主键从Hashmap中获得对象,取得之后,把该对象从队列中删除,以免重复取得。由于java中的随机数是根据时间生成的,所以有可能导致用户得到的牌不够散,每个用户都摸到一条龙岂不是笑话?所以在生成随机数的时候我们加入了一个大素数来作运算:
long cardId=new Long((Math.round(Math.random() * 87) % 55)).intvalue();
通过修改这个大素数,可以控制某个用户的牌比较好。
五、线程
实际上本系统并没有复杂的线程管理,但是我想提供一个控制台让管理员可以管理游戏主线程,可以让它停止、中段、恢复、重启动,本来的设计是管理员通过与线程A打交道,通过A去管理主线程B,但是熟悉java线程的朋友都知道,线程互相管理基本上就是不实际的,举个最简单的例子,A如何销毁B?也许你会说调用B的destroy()方法就好了,网上很多讲解java线程的资料也确实是这么说的,但是他们都是鬼扯的,自己去看看java源代码吧,Thread.destroy()方法的实际代码如下:
public void destroy()
{
throw new NoSuchMethodError();
}
事实真相是,Thread.destroy()方法自始至终就没有被实现过。所有写文章,教别人用这个方法销毁线程的人,都去撞墙吧,丢人丢大了。
最好的办法是A负责生成一个B并且启动它,然后B自己管理生存周期,A和B通过使用可共享的方法来通信,这是sun推荐的做法。
六、异步消息
用户玩牌的过程中,有很多东西需要记录下来,比如记录用户的积分、等级变化,记录玩牌日志供数据统计等,当用户数量很多的时候,在数据库中记录这些信息会很耗费资源,用户玩了一局之后会可能会等待很长时间。解决这个问题的方法是利用J2EE的消息bean来提供异步通信的机制,需要记录数据的时候,系统会封装一个值对象,发送给J2EE容器,这个操作是很快的,完成之后就返回,用户可以继续操作,不用关心消息何时被处理。
J2EE的消息框架具备如下特征:
◇ 消息一定会被阅读,而且只阅读一次。JMS框架有自己的算法,把消息缓冲到硬盘,就算J2EE服务器死掉,消息也不会丢失。
◇ 系统采用点对点的Queue消息队列,可以保证同等优先级的消息先进先出。
在Jboss 4.0中,部署消息Bean和Queue队列,都比weblogic 8.1来的容易,只需要在jboss.xml中声明消息目的地,如果jboss发现该目的地不存在的话,会自动建立一个,实在很简单。关于消息bean的开发与部署,我有专门的文章描述(参见我的blog:http://blog.csdn.net/bromon )。
七、启动与退出
为了让系统具备让人满意的性能,应该尽量多的重用对象,减少创建新对象。比如上面提到的消息发送,我们的操作是提供一个静态类,在系统启动的时候就初始化,保持与JMS服务器的连接,系统发送消息的时候,不用再去查询JNDI和生成QueueConnectionFactory,这样可以提高系统响应速度。
在数据库连接池的问题上,我们也采用同样的操作,启动的时候初始化N个连接。但是如果在关闭进程的时候不做任何操作,会导致JMS抛出socket异常,虽然没什么大的影响,但总显得不专业,而且池中的连接不被释放的话,也可能导致问题。最好能够让系统像jboss等控制台程序一样,ctrl+c之后能够执行操作,释放资源再退出。我们可以通过给进程/线程加上一个Hook来实现,windows程序员应该对这个非常熟悉。
Hook应该是一个线程方法,如下:
public class Hook extends Thread
{
public void run()
{
//释放数据库连接,销毁连接池
//关闭与JMS的连接
}
}
在主线程中加入:
Runtime.getRuntime().addShutdownHook(new Hook()) ;
那么进程/线程会在退出的时候执行Hook的run方法,清理资源
- 浏览: 32326 次
- 性别:
- 来自: 西安
最新评论
-
Sassoon:
很细心,
android开发经验(转载)
相关推荐
Java 棋牌游戏框架 WG棋牌包网项目, java服务器.支持单台游戏服务器一到两千人同时在线. 包含: 1.游戏基础框架 2.网关,路由通信模块 3.游戏机器人框架 4.大厅,房间,桌子流程 5.完善的统一棋牌控制库存框架,支持游戏...
Unity和C#-游戏开发-21点棋牌游戏+源代码工程
PushBobbi:推筒子游戏服务 Robot:机器人服务 环境搭建 架构使用go mod构建环境 基础安装 将工程代码克隆在GOPATH/src目录下 确保GOPATH和GOROOT的系统环境变量已经正确配置 配置go mod的环境变量 Mac或Linux export...
该客户端架构的主要功能是实现一个游戏大厅。该架构负责和服务端通信,利用通用的第三方接口运行具体的第三方游戏逻辑实现游戏大厅。在架构设计中,采用了多视图设计、大客户端量的仿真、快速访问树形结点和第三方接口...
网络游戏目前在国内相当热门,棋牌类游戏在网络游戏中占有比较...该文总结了一款通用的棋牌类网络游戏服务端的架构设计,介绍了基本架构、通信协议、多线程模型和第3方接I:1的相关内容,并对整个架构作了一定分析。
棋牌游戏服务端源代码,适合二次开发使用,在VC7下编译通过 请放心下载,还要我在说点什么呢?反正还不错,就是有点老
cocos2dx+JS写的 棋牌 麻将源代码。 客户端+服务器 框架完整,直接可以运行。支持htm5,安卓,IOS。 cocos2dx+JS写的 棋牌 麻将源代码。 客户端+服务器 框架完整,直接可以运行。支持htm5,安卓,IOS。
淘宝买的,unity源码,大富豪源码(完整棋牌服务端(c++)+客户端(unity)+各种编译),是能用的,自己打开编译过。适合二次开发
小红人棋牌游戏完整源码,包含服务端源码、客户端源码及各种组件源码,c++开发,解压后1.5G,非常齐全包含长沙麻将、斗地主、三打哈、同花顺、诈金花、小狗快跑、蛊惑骰、连连看、神秘拼图、国际象棋、四国军棋、中国...
使用责任链、反射、gin框架等技术实现的restful风格的Golang游戏服务端,里面包含了一系列功能。包括接收客户端的请求,并调用相关的业务代码。业务职责清晰,分层明显,是开发游戏服务端的不二选择。
微信小游戏斗地主小游戏源码,前端加nodejs-服务器nodejs-server-wechat-landLordGame-master.zip
cocosdx-js开发麻将源码,包括游戏的客服端和服务端源码。可以游戏运行
2,采用精妙的设计模式,基于插件化的游戏模块设计,二次开发仅需关注接口.指令集及游戏各对象都提供了基类和接口,基于本平台开发,很多类可以直接继承. 3,优秀的UI设计,不使用DirectX,但却能够将可视化效果发挥到极致,...
使用HTML5 Canvas和PHP Swoole构建的五子棋小游戏客户端和服务端
斗地主服务端源码(含客户端程序)lua c# python。 斗地主服务端源码(含客户端程序)仅供学习参考 lua c# python
一、申请短信通道,国内的短信通道很多,不同的通道速度不一样,我们在申请时要一个基本原则就是速度要快,基本上要发送即接收了,客户不可能等的。国内调查发现,客户等网页打开的时间是最长不超过5秒,短信接收的...
go-gbc是一个通用的游戏服务端架构,使用了游戏行业常用的Lua脚本语言: 利用golang带来的网络并发处理机制,充分发挥现代硬件和云环境的能力 配合golang的频道和Lua的协程,带来简单易学的网络编程体验 灵活的架构...
跟我一步一步用Docker搭建Beimi游戏服务端开发环境 Stone 摘要 本文为java 0基础的小伙伴介绍如何用Docker搭建开发环境。如果不关心过程直接可 跳到本文最后取代码。 关键步骤为: 构建Beimi服务端依赖的开发环境 ...