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 播放器 控制
Jan 22 Javascript
JavaScript EasyPager 分页函数
May 25 Javascript
理解JSON:3分钟课程
Oct 28 Javascript
js面向对象编程之如何实现方法重载
Jul 02 Javascript
seajs模块之间依赖的加载以及模块的执行
Oct 21 Javascript
老生常谈js-react组件生命周期
May 02 Javascript
深入理解Angular中的依赖注入
Jun 26 Javascript
10个经典的网页鼠标特效代码
Jan 09 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
JavaScript设计模式之建造者模式实例教程
Jul 02 Javascript
使用Vant完成通知栏Notify的提示操作
Nov 11 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
js的2种继承方式详解
2014/03/04 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
jQuery中offset()方法用法实例
2015/01/16 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
bootstrap组件之按钮式下拉菜单小结
2017/01/19 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
JQuery 获取多个select标签option的text内容(实例)
2017/09/07 jQuery
最实用的JS数组函数整理
2017/12/05 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
基于aotu.js实现微信自动添加通讯录中的联系人功能
2020/05/28 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[46:40]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python的Django框架中的Context使用
2015/07/15 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
tensorflow中next_batch的具体使用
2018/02/02 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
利用ctypes获取numpy数组的指针方法
2019/02/12 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
django修改models重建数据库的操作
2020/03/31 Python
预订旅游活动、景点和旅游:GetYourGuide
2019/09/29 全球购物
STP协议的主要用途是什么?为什么要用STP
2012/12/20 面试题
参观监狱心得体会
2014/01/02 职场文书
自我评价是什么
2014/01/04 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
十佳家长事迹材料
2014/08/26 职场文书
2014年法院工作总结
2014/11/24 职场文书
建筑安全员岗位职责
2015/02/15 职场文书
张思德观后感
2015/06/09 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书