js+canvas实现纸牌游戏


Posted in Javascript onMarch 16, 2020

本文实例为大家分享了js+canvas实现纸牌游戏的具体代码,供大家参考,具体内容如下

废话不多说,先上地址

运行截图

js+canvas实现纸牌游戏

js+canvas实现纸牌游戏

最后如果完成了会有结束动画,我技术比较渣,难以玩到结束,就不上完成动画截图了。

游戏介绍

好吧,可能有些好学生在做上机实验时没有玩纸牌游戏,所以容我介绍一下这个游戏,这个游戏是win7自带的一个纸牌类游戏,游戏规则是:将牌按一定的规则码放,最终将所有的牌牌面朝上胜利。有两个地方可以用来码牌,上:以A开头,即将码放的牌的花色相同,且牌面值比原来的牌面大1,则可以码放成功;下:以K开头,即将码放的牌的颜色不同,且牌面值比原来的牌面小1,则可以成功码放。

支持的操作

点击、拖拽相比微软纸牌,增加了点击牌自动找到合适的位置的码放方式,所以整个游戏大部分操作只需要点击就可以了。

设计思路

1. 游戏运行驱动

游戏以玩家操作(鼠标点击与移动)为驱动。
点击与移动鼠标时,通过记录鼠标的位置与状态,可以得到以下四个事件(按下、移动、弹起、单击)。
首先,需要注册鼠标点击、移动和弹起事件

function BindEvent()
  {
   $(window).bind("mousedown touchstart", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchstart")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionDown(x, y - 50);
   });

   $(window).bind("mousemove touchmove", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchmove")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionMove(x, y - 50);
   });

   $(window).bind("mouseup touchend", function (e)
   {
    e.preventDefault();
    var x;
    var y;
    if (e.type == "touchend")
    {
     x = e.originalEvent.changedTouches[0].clientX;
     y = e.originalEvent.changedTouches[0].clientY;
    }
    else
    {
     x = e.clientX;
     y = e.clientY;
    }
    if (isPlayingAnimation)
    {
     return;
    }
    ActionUp(x, y - 50);
   });
  }

然后在弹起事件里面检测鼠标在弹起之前移动了多少距离,如果移动的距离很小,可以忽略不计,则认为这是一次点击操作。

注意:这里事件注册不是在每张牌上,因为52张牌实际上都画在canvas上,然而52张牌的坐标都是知道的,所以通过计算就可以知道用选择了哪些牌,正在将牌移到哪里。等玩家松手后就可以实现码放操作。

2. 界面设计

顶栏用于显示积分、时间

<div id="titleContainer">
  <div>Score:<span id="score">0</span></div>
  <div>Timer:<span id="timer">00:00:00</span></div>
</div>

接下来就是桌面

<div id="deskTop">
  <canvas id="canvasBack"></canvas>
  <canvas id="canvasFont"></canvas>
</div>

可以看到,桌面有两个canvas,一前一后,这实际上是将游戏画面分为了两层,玩家看到的画面是两个画面叠加在一起的。

之所以用两个层,主要是为了避免实时绘制整个界面,鼠标选中一些牌后将要实施移动操作,这时实际上只有被鼠标选中的那些牌的位置在变化,而桌上剩余的牌实际上没有任何变化,这时如果还实时绘制后面的没有变化的牌有些浪费。所以把鼠标选中的那些牌拿出来,放到canvasFont层里面,这样,两个层都不用实时绘制,被鼠标选中的牌在移动的时候只需要移动他们被绘制在的canvasFont就可以了。

3. 流程

js+canvas实现纸牌游戏

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 事件的一些重要说明
Oct 25 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
JavaScript实现跨浏览器的添加及删除事件绑定函数实例
Aug 04 Javascript
jquery专业的导航菜单特效代码分享
Aug 29 Javascript
详解Bootstrap glyphicons字体图标
Jan 04 Javascript
深入剖析JavaScript中的函数currying柯里化
Apr 29 Javascript
jQuery的$.extend 浅拷贝与深拷贝
Mar 08 Javascript
原生JS实现N级菜单的代码
May 21 Javascript
Angular.js中$resource高大上的数据交互详解
Jul 30 Javascript
JavaScript中的一些隐式转换和总结(推荐)
Dec 22 Javascript
详解Vue打包优化之code spliting
Apr 09 Javascript
Vue的全局过滤器和私有过滤器的实现
Apr 20 Javascript
微信小程序利用button控制条件标签的变量问题
Mar 15 #Javascript
JS apply用法总结和使用场景实例分析
Mar 14 #Javascript
javascript事件循环event loop的简单模型解释与应用分析
Mar 14 #Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 #Javascript
js实现的订阅发布者模式简单示例
Mar 14 #Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 #Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 #Javascript
You might like
php时区转换转换函数
2014/01/07 PHP
php数据库备份还原类分享
2014/03/20 PHP
PHP概率计算函数汇总
2015/09/13 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
jquery 屏蔽一个区域内的所有元素,禁止输入
2009/10/22 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
python django 访问静态文件出现404或500错误
2017/01/20 Python
使用python的pexpect模块,实现远程免密登录的示例
2019/02/14 Python
Django Serializer HiddenField隐藏字段实例
2020/03/31 Python
python 读取yaml文件的两种方法(在unittest中使用)
2020/12/01 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
美国百年历史早餐食品供应商:Wolferman’s
2017/01/18 全球购物
校园创业策划书
2014/01/14 职场文书
结婚周年感言
2014/02/24 职场文书
社区交通安全实施方案
2014/03/22 职场文书
活动总结模板
2014/05/09 职场文书
机关干部四风问题自我剖析及整改措施
2014/10/26 职场文书
党建工作目标管理责任书
2015/01/29 职场文书
出纳岗位职责范本
2015/03/31 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
使用python创建股票的时间序列可视化分析
2022/03/03 Python