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 相关文章推荐
js实现的网页颜色代码表全集
Jul 17 Javascript
LBS blog sql注射漏洞[All version]-官方已有补丁
Aug 26 Javascript
javascript 打开页面window.location和window.open的区别
Mar 17 Javascript
匹配任意字符的正则表达式写法
Apr 29 Javascript
用JS做的简单的可折叠的两级树形菜单
Sep 21 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
Aug 25 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
layui结合form,table的全选、反选v1.0示例讲解
Aug 15 Javascript
在小程序开发中使用npm的方法
Oct 17 Javascript
vue.js层叠轮播效果的实例代码
Nov 08 Javascript
webpack HappyPack实战详解
Oct 08 Javascript
vue中封装axios并实现api接口的统一管理
Dec 25 Vue.js
微信小程序利用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
java微信开发之上传下载多媒体文件
2016/06/24 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
可兼容IE的获取及设置cookie的jquery.cookie函数方法
2013/09/02 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
javascript判断chrome浏览器的方法
2014/03/26 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
2017/01/18 Javascript
如何在AngularJs中调用第三方插件库
2017/05/21 Javascript
Vue实现virtual-dom的原理简析
2017/07/10 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
vue中对象数组去重的实现
2020/02/06 Javascript
ant-design-vue中tree增删改的操作方法
2020/11/03 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
详解Python中的相对导入和绝对导入
2017/01/06 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
Python定义一个函数的方法
2020/06/15 Python
PyTorch安装与基本使用详解
2020/08/31 Python
CSS3 特效范例整理
2011/08/22 HTML / CSS
国际鲜花速递专家:Floraqueen
2016/11/24 全球购物
世界上最大的专业美容用品零售商:Sally Beauty
2017/07/02 全球购物
俄罗斯花园种植材料批发和零售网上商店:Беккер
2019/07/22 全球购物
高级Java程序员面试题
2016/06/23 面试题
清明节扫墓活动方案
2014/03/02 职场文书
人身损害赔偿协议书范本
2014/09/27 职场文书
国防教育标语
2014/10/08 职场文书
实习协议书
2015/01/27 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
入党后的感想
2015/08/10 职场文书
PHP实现两种排课方式
2021/06/26 PHP
Winsows11性能如何? win11性能测评多核竟比Win10差了10%
2021/11/21 数码科技