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 相关文章推荐
使用JQUERY Tabs插件宿主IFRAMES
Jan 01 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 Javascript
JQuery实现动态适时改变字体颜色的方法
Mar 10 Javascript
浅谈Javascript线程及定时机制
Jul 02 Javascript
JS验证 只能输入小数点,数字,负数的实现方法
Oct 07 Javascript
微信小程序 for 循环详解
Oct 09 Javascript
bootstrap组件之按钮式下拉菜单小结
Jan 19 Javascript
vue 设置路由的登录权限的方法
Jul 03 Javascript
vue将毫秒数转化为正常日期格式的实例
Sep 16 Javascript
js实现一个简易计算器
Mar 30 Javascript
使用node.JS中的url模块解析URL信息
Feb 06 Javascript
vue中v-model对select的绑定操作
Aug 31 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的基本常识小结
2013/07/05 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP实现从远程下载文件的方法
2015/03/12 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
很可爱的输入框
2008/08/03 Javascript
图片连续滚动代码[兼容IE/firefox]
2009/06/11 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
使用Jquery实现点击文字后变成文本框且可修改
2013/09/21 Javascript
基于jquery扩展漂亮的CheckBox(自己编写)
2013/11/19 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
Vue.js每天必学之过渡与动画
2016/09/06 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
纯JS打造网页中checkbox和radio的美化效果
2016/10/13 Javascript
Vue.JS入门教程之自定义指令
2016/12/08 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
关于echarts在节点显示动态数据及添加提示文本所遇到的问题
2018/04/20 Javascript
JavaScript代码实现简单计算器
2020/12/27 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
Django如何开发简单的查询接口详解
2019/05/17 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
线程同步的方法
2016/11/23 面试题
办公文员的工作岗位职责
2013/11/12 职场文书
汽车专业人才自我鉴定范文
2013/12/29 职场文书
研修第一天随笔感言
2014/02/15 职场文书
校园安全演讲稿
2014/05/09 职场文书
同学聚会感言一句话
2015/07/30 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
Nginx已编译的nginx-添加新模块
2021/04/01 Servers
MySQL的全局锁和表级锁的具体使用
2021/08/23 MySQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python