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中的window.event.keyCode使用介绍
Apr 26 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
Aug 02 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
JS实现FLASH幻灯片图片切换效果的方法
Mar 04 Javascript
jquery实现多屏多图焦点图切换特效的方法
May 04 Javascript
JavaScript仿静态分页实现方法
Aug 04 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
基于jquery实现最简单的选项卡切换效果
May 08 Javascript
AngularJS的脏检查深入分析
Apr 22 Javascript
jQuery extend()详解及简单实例
May 06 jQuery
基于vue2.0实现仿百度前端分页效果附实现代码
Oct 30 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 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简单实现数字分页功能示例
2016/08/24 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
详解如何实现Laravel的服务容器的方法示例
2019/04/15 PHP
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
jquery实现类似淘宝星星评分功能有截图
2014/09/15 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
带有定位当前位置的百度地图前端web api实例代码
2016/06/21 Javascript
Bootstrap CSS组件之导航条(navbar)
2016/12/17 Javascript
Angular.js指令学习中一些重要属性的用法教程
2017/05/24 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
JQuery事件委托原理与用法实例分析
2019/05/13 jQuery
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
Echarts实现单条折线可拖拽效果
2019/12/19 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
antd Select下拉菜单动态添加option里的内容操作
2020/11/02 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python程序员面试题 你必须提前准备!
2018/01/16 Python
简单实现python聊天程序
2018/04/01 Python
python utc datetime转换为时间戳的方法
2019/01/15 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
德国家具、照明、家居用品网上商店:Wayfair.de
2020/02/13 全球购物
Java程序员常见面试题
2015/07/16 面试题
岗位职责风险防控
2014/02/18 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
关于颐和园的导游词
2015/01/30 职场文书
微信告警的zabbix监控系统 监控整个NGINX集群
2022/04/18 Servers