在扑克牌游戏中,生成一幅随机打乱的牌型,然后分发给玩家,是必须要实现的基本功能。

基本原理肯定是使用随机数,但是只有随机数达不到效果,因为是要随机地打乱顺序,而不是仅仅生成54个随机数。因为随机数有可能是重复的。

下面是用sql-server 的存储过程实现的随机发牌功能:

CREATE                      procedure dealCards
(
@deskID int,
@outMsg varchar(500) out
)
as
begindeclare @lbound int, @ubound intselect  @lbound=1,@ubound =54declare @t table (idx int identity(1,1),r int )declare @x table (idx int,r int)--1~54不重复的随机数while (select count(*) from @t ) < @ubound-@lbound +1begininsert into @x (idx,r) select i,abs(checksum(newid()))%(@ubound-@lbound +1) + 1 r  from nums where i < =3*(@ubound-@lbound +1)insert into @t(r)select r from(select min(idx) idx ,r from @x group by r             ) t  where r not in (select r from @t) order by idx    enddeclare @p1Cards varchar(100),@p2Cards varchar(100),@p3Cards varchar(100),@xCards varchar(100)set @p1Cards =''   select @p1Cards =@p1Cards + cast(r as varchar)  +',' from @t where idx <= 17 set @p1Cards=left(@p1Cards,len(@p1Cards)-1) set @p2Cards =''   select @p2Cards =@p2Cards + cast(r as varchar)  +',' from @t where idx > 17 and idx <= 34 set @p2Cards=left(@p2Cards,len(@p2Cards)-1) set @p3Cards =''   select @p3Cards =@p3Cards + cast(r as varchar)  +',' from @t where idx > 34 and idx <= 51set @p3Cards=left(@p3Cards,len(@p3Cards)-1) set @xCards ='' select @xCards =@xCards + cast(r as varchar)  +',' from @t where idx > 51 and idx <= 54set @xCards=left(@xCards,len(@xCards)-1) declare @p1ID int,@p2ID int,@p3ID intselect @p1ID = p1ID,@p2ID = p2ID ,@p3ID = p3ID from v_playerIDInRoom where deskID = @deskIDdeclare @gameID intinsert into game(deskId,p1cards,p2cards,p3cards,extraCards,stateNo,lordNo,p1ID,p2ID,p3ID)values(@deskID,@p1cards,@p2cards,@p3cards,@xCards,1,0,@p1ID,@p2Id,@p3ID)set @gameID =@@identityupdate desk set curGameID = @gameIDwhere deskID =@deskID--随机产生第一个叫牌者,并在叫牌记录表中预放两条记录declare @rndPlayer intset @rndPlayer = abs(checksum(newid()))%3+1insert into bidRecord(deskID,gameID,playerNo,recIdx,bidSize)values(@deskID,@gameId,dbo.prevPlayer(@rndPlayer),0,-1)insert into bidRecord(deskID,gameID,playerNo,recIdx,bidSize)values(@deskID,@gameId,dbo.prevPlayer(@rndPlayer),-1,-1)--设置游戏状态为叫牌update game set stateNo = 1where deskId = @deskID and gameID = @gameID    set @outMsg='{desk:'+cast(@deskID as varchar) +',game:'+cast(@gameID as varchar) +',leader:'+cast(@rndPlayer as varchar)+'}'--发通告    declare @note varchar(500)set @note = cast(@rndPlayer as varchar) +'#'+cast(@gameID as varchar)        exec writeNote @deskID,@rndPlayer,3,'y',@noteif dbo.debugMode() = 1update debugValue set gameID = @gameID ,rndPlayer=@rndPlayerreturn 0
end

其中最核心的功能如下,用到了T-SQL中的表变量

declare @lbound int, @ubound intselect  @lbound=1,@ubound =54declare @t table (idx int identity(1,1),r int )declare @x table (idx int,r int)--1~54不重复的随机数while (select count(*) from @t ) < @ubound-@lbound +1begininsert into @x (idx,r) select i,abs(checksum(newid()))%(@ubound-@lbound +1) + 1 r  from nums where i < =3*(@ubound-@lbound +1)insert into @t(r)select r from(select min(idx) idx ,r from @x group by r               ) t  where r not in (select r from @t) order by idx    end

特别注意这里随机函数要使用 newid() ,而不能用rand(),因为要一次返回多行,每行都是一个随机数,newid才能做到。ran()只能保证一次查询一个随机数,如果一次查询中返回多行,则这些行都是相同的。

从以上的代码可以看出算法工作的基本原理,就是每次产生1-54的随机数,如果有重复的话,就去掉,检查剩下的总数是否为54,如果不是则继续产生新的随机数,直到产生的随机数的总数达到54。

由于是用T-SQL编程,与C语言的思路不一样的地方在于用数据表变量代替了一般的变量做操作,显得更加简洁。对不熟悉sql语法的人来说,也可能是更加难以理解。

网络斗地主游戏的完整设计与实现(五)随机发牌功能的实现相关推荐

  1. 网络斗地主游戏的完整设计与实现(二)系统的核心技术路线

    引言 在前面的文章<网络斗地主游戏的完整设计与实现(一)项目的基本结构>介绍了项目的整体结构.接下来说明一下系统中用到的核心技术路线 项目的源码可在CSDN资源中下载 游戏界面的呈现 斗地 ...

  2. 网络斗地主游戏的完整设计与实现(一)项目的基本结构

    引言 开发一个完整的游戏程序需要做的工作不少,本系列介绍一个较为完整的网络斗地主游戏的设计与实现过程. 项目的源码可在CSDN资源中下载 游戏基本界面 项目基本结构 项目分成两个主要部分,前台浏览器应 ...

  3. 网络斗地主游戏的完整设计与实现(三)入口存储过程详解,理解动态调用存储过程的原理

    引言 在前一篇文章中说到了一个核心技术路线,就是在js代码中通过ajax请求调用sqlserver中的存储过程. 下面对这一个调用过程在数据库端的工作过程做一个较为详细的说明.因为这里用到了在存储过程 ...

  4. 网络斗地主游戏的完整设计与实现(四)游戏状态更新机制与心跳机制

    引言 在前一篇文章中讲解了通过入口存储过程动态调用业务过程的原理.下面来说明如何实现游戏状态的更新. 项目的源码可在CSDN资源中下载 实现原理 由于http协议是无状态的请求响应式协议,用户可以主动 ...

  5. VC++ 网络台球游戏源代码完整

    游戏的画面采用了十分精致的3D画面风格,玩家在游戏中能够体验到十分逼真的游戏体验 VC++6.0 网络台球游戏源代码完整.编译Billiards.dsw文件,在Debug目录下会生成Billiards ...

  6. 游戏平台SDK设计和开发之旅——XSDK功能点梳理

    做游戏开发或者相关工作的同学,可能都知道,在游戏上线之前,需要将游戏分发到各大渠道平台,比如九游,百度,360,华为等等.其中和技术相关的事情,就是要在游戏中接入这些渠道平台的平台SDK,平台SDK中 ...

  7. Unity3D手机斗地主游戏开发实战(02)_叫地主功能实现

    大体思路 前面我们实现了点击开始游戏按钮,系统依次给玩家发牌的逻辑和动画,并展示当前的手牌.这期我们继续实现接下来的功能--叫地主. 1.首先这两天,学习了DOTween,这是一个强大的Unity动画 ...

  8. java斗地主 服务器_JAVA网络版斗地主游戏

    大家好,欢迎各位前辈看小弟写的一个网络版的斗地主程序,下面是小弟用了两个多星期的心血写成的,请各位前辈多指教!使小弟我能够得到前辈的指点,更上一层楼,谢谢支持! 下面是我写的项目分析和讲解: 由于我装 ...

  9. 发些今年的作品:网络斗地主

    最近工作都比较忙,尤其是这个月,都没更新blog,就发些今年的一些作品图片,记录下,呵呵 这是一个flash网络斗地主游戏,顺便当宣传,呵呵,前台是用as3开发的,后台是C++服务器,当时自己开发了一 ...

最新文章

  1. 【基础巩固篇】Java中的Buffer缓冲区探究
  2. mysql 数据字典 php_php生成mysql数据库数据字典的程序代码
  3. 重磅!这个 GitHub 汇总了 300 道 Python 面试题!
  4. PaddlePaddle训练营——公开课——AI核心技术掌握——第2章机器能“看”的现代技术——源自视觉神经原理的卷积网络简介及深入理解
  5. 部署nodejs项目到服务器的一些总结
  6. 设计一个程序实现两个任意长的整数的求和运算_深入 Python (7) Karatsuba 实现长整数乘法...
  7. 官宣!张小龙史上最长演讲 4小时3万字完整版回应微信的一切
  8. python scikit_Python SciKit学习教程
  9. lintcode :reverse integer 颠倒整数
  10. Windows中的用户和组以及用户密码破解
  11. 基于Opencv实现车牌图片识别系统
  12. Arduino教程 RFID-RC522读IC卡门禁原理及破解防御
  13. 色谱计算机常用英文,【分享】色谱常用中英文单词
  14. 如果你想学好Py thon,我这里有几本电子书想送你
  15. 利用C51单片机内部函数_corl_函数实现LED流水灯。
  16. QQ微信可以上网,但是google浏览器上不了网怎么办?
  17. java 15k,广州-Java高级-15k-22k(月薪)
  18. mysql sql查询昨天的数据_sql语句,查询昨天的数据
  19. 软件测试工程师涨薪攻略!3年如何达到30K!
  20. 线性代数学习笔记——第七十六讲——矩阵的合同

热门文章

  1. 现在是不是投资指数基金的好时候?
  2. liunx服务器关于php-fpm重启的方式
  3. 淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima
  4. unity 为何会穿模,碰撞无显示
  5. Win11查看设备驱动程序版本的方法
  6. SEO工具箱:网址采集百度指数、权重下拉框收录查询文章伪原创工具一体...
  7. Java File中renameTo的介绍和使用说明
  8. 博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)
  9. 909422229_服务器攻防之安全狗安装时出现相关问题解决方法
  10. 从PowerBuilder连接到微软SQL 服务器(翻译)