引言

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

游戏界面的呈现

斗地主游戏的玩家分成三个,而且在未叫牌与叫牌后玩家的角色会发生变化,因此要用不同的图片加以呈现。本项目没有使用cocos2d之类的游戏框架,而是使用基本的javascrpt+jquery实现游戏界面。

具体对这个项目来说,主要的游戏界面分为几大类:
1.背景类
这个项目中背景基本上保持不变,所以只要在网页上显示一副较大的背景图片就可以了,如下图所示

在背景图上的一些位置预留了空白,用于显示相应的文本。

  1. 人物图像类
    这里主要显示两类角色,“地主”与“农民”,随着游戏状态的变化,人物的形象也有可能发生变化。但基本的人物形象如下图所示:


    与背景图片不同之处在于,人物图像需要显示在某个合适的位置,所以要有办法移动图片显示的位置。这一点可以通在将图片用DIV标签包裹起来,然后动态地设置DIV的位置来实现。
    由于原生的javascript不直接支持class的定义,所以用function的方式包装了图片的显示功能
    相应的代码如下:
    ImageDiv.js

//图象DIV
function ImageDiv(imgFileName,tagValue)
{    this.Name="ImageDiv";this.value=tagValue;this.imgFileName=imgFileName;this.x=0;this.y=0;this.z=0;  this.visib=falsethis.Div=document.createElement("div");this.Div.style.position='absolute';   this.Div.name=this.Name;this.Div.style.width='74px';this.Div.style.height='98px';//this.Div.style.backgroundColor='#ffffff';this.Div.style.visibility='hidden';if(imgFileName!="")this.Div.innerHTML="<img src='"+imgFileName+"'>";document.body.appendChild(this.Div);this.GetDiv=function(){return this.Div;}this.GetValue=function(){return this.value;}this.GetX=function(){return this.x;}this.GetY=function(){return this.y;}this.GetZ=function(){return this.z;}this.SetClass=function(Classf){this.Div.style.width=null;this.Div.style.height=null;this.Div.className=Classf;}this.SetId=function(Id){this.Div.id=Id;}this.SetW=function(value){this.Div.style.width=value+'px';}this.SetH=function(value){this.Div.style.height=value+'px';}this.SetX=function(value){this.Div.style.left=value+'px';this.x=value;}this.SetY=function(value){this.Div.style.top=value+'px';this.y=value;Y=value;}this.SetZ=function(zValue){this.Div.style.zIndex=zValue;this.z=zValue;}this.SetXY=function(nx,ny){this.Div.style.left=nx+'px';this.x=nx;this.Div.style.top=ny+'px';this.y=ny; }this.SetV=function(bVisible){if(bVisible){this.Div.style.visibility='visible';}else{this.Div.style.visibility='hidden';}}this.SetImg=function(imgurl){        this.Div.innerHTML="<img src='"+imgurl+"'>";this.imgFileName=imgurl;}this.SetHtml=function(Html){this.Div.innerHTML=Html;}this.remove=function(){document.body.removeChild(this.Div);}}

其中的imgFileName指明要显示的图片文件,而SetX,SetY方法设置了图片显示的位置,SetZ方法设置叠放次序。

3.扑克牌图像类
由于扑克牌图像有时需要显示一张,有时需要显示一组,所以用CardDiv.js与CardGroupDiv.js进行包装。而且扑克牌又分为水平显示与重直显示两种情形,所以又分别用CardHorizonGrpDiv.js与CardVerticalGrpDiv.js进行包装。相应的源码可以将完整的项目下载后进行查看。

4.文字类
需要在指定的位置动态显示文本块,用TextDiv.js与TextGroupDiv.js进行包装。与显示图像类似的是要可以动态地设置文本块的位置。

游戏状态的刷新

为了能够及时地刷新游戏的状态,需求前端与后台服务器进行通信。由于浏览器与服务器间的通信过程是请求、应答式的。一旦服务上的状态发生了变化,该如何及时地通知前端呢?理论是有两种解决方案
1,由服务器推送消息给客户端
2,由客户端连续不断地向服务器进行查询,也就是轮询。
本项目采用轮询的方式,客户端每秒向服务器发起一次请求,检查是否有新的状态需要更新。与此同时,每秒发出一次请求,也做为心跳请求,如果服务器发现客户端长期没有心跳,就会判断客户端已经离线。

由存储过程实现后台业务逻辑

数据库表只能保存静态数据,如果要想实现后台的业务逻辑,必须安排在某处执行相关的代码。一般来说这种后台业务逻辑缓组成一个业务逻辑层。这层代码可以由jsp,serverlet,php,asp等等服务器脚本技术来实现。

本项目将业务逻辑交由数据库的存储过程来实现。为此设计了一个调用其它存储过程的入口存储过程。

CREATE      PROCEDURE dbo.callProc@procName varchar(100) ,@inStr varchar(200) ,@outStr varchar(4000) output
as
set nocount on
begindeclare @SQLString nvarchar(500)declare @ParmDefinition nvarchar(500)declare @outPara varchar(4000)if rtrim(ltrim(@inStr)) <>''beginset @inStr = @inStr + ','endset @SQLString = N'exec '+ @procName + ' '+@inStr+ '@outPara out'set @ParmDefinition = N'@outPara varchar(4000) OUTPUT'  EXECUTE sp_executesql @SQLString, @ParmDefinition, @outPara=@outStr outputreturn 0
end

这样一来,就可以极大地简化后台脚本代码。下面是调用这个入口存储过程的php代码
proc.php

<?php  // 测试用url http://localhost:8080/poker/proc.php?proc=addPlayer&inParas=t1,t1require_once 'conf/db.config.php';handleRequest();function handleRequest(){//接收网页参数$procName=trim($_REQUEST["proc"]);$inStr=trim($_REQUEST["inParas"]);if ($procName==""){echo "<script>alert('no procdure name or parameters');</script>";return;}try{$db = new PDO( "sqlsrv:Server=".DATABASE_SERVER.";Database=".DATABASE_NAME, DATABASE_USER, DATABASE_PWD);   }catch (Exception $e) {$json = ['msg'=>$e->getMessage(),'error'=>-1];echo json_encode($json);return;}try{$res = execStoreProc($db,$procName,$inStr);}catch (Exception $e) {$json = ['msg'=>$e->getMessage(),'error'=>-1];echo json_encode($json);return;} echo $res;}     //执行存储过程,返回输出参数function execStoreProc($db,$procName,$inStr){$sql="exec callproc ?,?,?";$stmt = $db->prepare($sql, array($db::ATTR_CURSOR=>$db::CURSOR_SCROLL)); // 绑定入参$stmt->bindParam(1, $procName, $db::PARAM_STR);$stmt->bindParam(2, $inStr, $db::PARAM_STR);// 绑定出参$result ='';        $stmt->bindParam(3, $result, $db::PARAM_STR | $db::PARAM_INPUT_OUTPUT, 4000);$stmt->execute();return $result;}

为了在javascript代码中调用存储过程,再用js函数包装一下:
proc.js

//调用存储过程
function callProc(procName,inputStr,callBackFunc)
{    $.post("proc.php","proc="+procName+"&inParas=" + inputStr ,callBackFunc);
}

这样一来,在javascript中就通过调用函数callProc,实现了调用数据库的存储过程。

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

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

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

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

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

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

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

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

    在扑克牌游戏中,生成一幅随机打乱的牌型,然后分发给玩家,是必须要实现的基本功能. 基本原理肯定是使用随机数,但是只有随机数达不到效果,因为是要随机地打乱顺序,而不是仅仅生成54个随机数.因为随机数有可 ...

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

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

  6. 卡牌游戏战斗系统的设计和实现二

    卡牌游戏战斗系统的设计和实现二 http://www.lxway.com/4418844614.htm 在一篇文章中,我更多的是从游戏理论的角度,讨论了战斗的系统的设计.这篇文章中,我将从程序的角度, ...

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

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

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

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

  9. 多人在线斗地主游戏开发——自定义TCP网络通信协议包格式

    什么叫做通信协议?为什么制定通信协议? 怎么制定通信协议? 不知道大家有没有迷茫过这个问题,反正我是有的,,, 想我在刚接触网络编程的时候,是linux下用socket懵懵懂懂地按照pdf书籍上的代码 ...

最新文章

  1. 生鲜电商APP开发,有哪五大商机?
  2. Android 10.0系统启动之init进程-[Android取经之路]
  3. 十分钟就能回顾Spring常问的知识点,带你突击面试没问题!
  4. sklearn快速入门教程 -- 机器学习工具的快速入门指引
  5. python获取文件夹下所有文件的两种方式
  6. 数论三之排列组合Ⅱ——Virus Tree 2,RGB Coloring,123 Triangle,排列计数,排队,卡农
  7. python坐标轴刻度设置对数_用对数刻度设置刻度
  8. 【待完善】【表达学习】稀疏表达SRC方法研究
  9. android 8.0 iso6,微信8.0.6更新了什么?IOS系统微信8.0.6版本更新详情一览[多图]
  10. sql 差值_sql面试题重点(持续更新中。。。)
  11. hadoop2.2.0 MapReduce求和并排序
  12. 从零开始学 Web 之 CSS(三)链接伪类、背景、行高、盒子模型、浮动
  13. html生成图片有色差,引起打印的产品和电脑图片有色差的原因有哪些?
  14. TOUCH  PANEL
  15. Unity 移动的几种方法(从某一点移动到另外一点)
  16. 苹果手机怎么查看已连接的wifi密码_如何查看已连接的WiFi密码,可以这样做!...
  17. 机器学习:anconda安装 scikit-learn ,lazypredict成功
  18. 计算机专业编程很厉害是怎样的一种体验?
  19. 自制拖把机器人_懒出新境界:可以自己洗拖布的机器人
  20. Android 高德地图so包太大,高德地图sdk配置心得(jar文件与so文件导入)

热门文章

  1. 2021年高压电工找解析及高压电工作业模拟考试
  2. nbu15_德国克鲁勃KLUBER ISOFLEX NBU 15高速润滑脂
  3. Android Studio 汉化包
  4. 全网最全正则表达式总结(全新升级版),让你的工作效率事半功倍,赶快收藏,让代码写起来快的嗖嗖的~~
  5. 欢迎使用CSDN-markdown编辑器发顺丰 第三个是德国
  6. vscode左下角git分支不见了(已解决)
  7. 昨天发现了浏览器显示文字不全的一个奇怪的问题
  8. ADRC控制算法在多旋翼飞行器上的应用
  9. setStyleSheet 设置背景图片
  10. Python实现标准的Kmeans算法