js实现翻牌小游戏


Posted in Javascript onJuly 31, 2020

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

效果图

js实现翻牌小游戏

需求分析

1、生成两组顺序随机的1-8数据
2、卡片需要有翻转效果
3、两次翻转数据不相等,回复原状
4、两次翻转数据相等,卡片相等,不能再被点击
5、当所有卡片不能被点击游戏结束
6、限制最大点击次数50次

HTML结构

<div class="wrap">
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
 <div>
  <p class="top"></p>
  <p class="bottom"></p>
 </div>
</div>

css布局

实现卡片翻转效果需要3个关键属性

1.perspective: 1000px; 透视深度,形成3d视角
2.transform: rotateY(180deg);旋转
3.backface-visibility: hidden; 元素背面不可见

* {
  margin: 0;
  padding: 0;
 }

 body,
 html {
  height: 100%;
 }

 .wrap {
  perspective: 1000px;
  width: 320px;
  height: 320px;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  margin: auto;
  display: flex;
  justify-content: center;
  text-align: center;
  flex-wrap: wrap;
 }

 .wrap div {
  /* box-shadow: 5px 5px 10px #000; */
  transition: 1s;
  position: relative;
  text-align: center;
  line-height: 60px;
  height: 60px;
  width: 60px;
  border-radius: 10px;

  margin: 10px 10px;
 }

 .wrap div .active1 {
  transform: rotateY(180deg);
 }

 .wrap div .active2 {
  transform: rotateY(360deg);
 }

 .wrap p {
  border-radius: 10px;
  background-color: blueviolet;
  transition: 1s;
  backface-visibility: hidden;
  display: block;
  height: 60px;
  width: 60px;
  position: absolute;
  /* transform: rotateY(180deg); */
 }

 .wrap .bottom {
  transform: rotateY(180deg);
 }
 h3{
  text-align: center;
  width: 200px;
  height: 30px;
  margin: 150px auto;
 }

js

class Game {
  constructor(selector) {
  this.init(selector);
  }
  init(selector) {
  let arr = this.randomArr();
  this.nodes = [...document.querySelectorAll(selector)];//获取每一个卡片
  this.step = 50;//定义可以被点击的次数
  this.tit = document.querySelector("h3");
  this.nodes.forEach((item,index) => {//初始化卡片的值,并保存在num属性中
   item.children[1].innerHTML = arr[index];
   item.num = arr[index];
   var that = this
   item.onclick = function () {//给每一个卡片绑定事件
   that.handle(this);
   }
  })
  }
  handle(ele) {
  if(this.step === 0){
   alert('游戏结束')
   return
  }
  if(ele.active !== true){
   this.step--;
   this.tit.innerText = `剩余步数:${this.step}`
  }
  ele.children[0].classList.add('active1');//卡片翻转
  ele.children[1].classList.add('active2'); 
  let res = this.nodes.filter(item => item.children[0].classList.contains('active1')&& item.active !== true); //获取翻过来的且没有配对成功的卡片
  if(res.length === 2 && res[0].num !== res[1].num){//如果有两张并且数值不相等,恢复原状 
   setTimeout(()=>{
   res[0].children[0].classList.remove('active1');
   res[0].children[1].classList.remove('active2');
   res[1].children[0].classList.remove('active1');
   res[1].children[1].classList.remove('active2'); 
   },1000)//延迟一秒形成动画 
  }else if(res.length === 2 && res[0].num === res[1].num){//如果数值相等则配对成功
   res[0].active = true;//锁定卡片
   res[1].active = true;
  }
  }
  randomArr() {
  let arr = [];
  for (let i = 0, n = 8; i < n; i++) {
   do {
   var item = randomInt(1, 8);
   } while (arr.indexOf(item) !== -1)
   arr.push(item);
  }
  arr.push(...arr);
  return arr;
  }
 }
 new Game('.wrap div')
 function randomInt(min, max) {//产生[min,max]范围内的整数
 return Math.round(Math.random() * (max - min)) + min
}

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

Javascript 相关文章推荐
JavaScript高级程序设计 错误处理与调试学习笔记
Sep 10 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
Aug 18 Javascript
Underscore源码分析
Dec 30 Javascript
Bootstrap前端开发案例一
Jun 17 Javascript
JavaScript导航脚本判断当前导航
Jul 12 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
使用 Node.js 对文本内容分词和关键词抽取
May 27 Javascript
JavaScript数组去重算法实例小结
May 07 Javascript
在vue中使用vue-echarts-v3的实例代码
Sep 13 Javascript
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
javascript中this的用法实践分析
Jul 29 Javascript
Vue 请求传公共参数的操作
Jul 31 #Javascript
vue2.0 解决抽取公用js的问题
Jul 31 #Javascript
vue实现公共方法抽离
Jul 31 #Javascript
js实现无缝轮播图插件封装
Jul 31 #Javascript
原生js滑动轮播封装
Jul 31 #Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
Jul 31 #Javascript
jquery轮播图插件使用方法详解
Jul 31 #jQuery
You might like
如何限制访问者的ip(PHPBB的代码)
2006/10/09 PHP
PHP操作Redis数据库常用方法示例
2018/08/25 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
javaScript知识点总结(必看篇)
2016/06/10 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
localStorage的黑科技-js和css缓存机制
2017/02/06 Javascript
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
[00:59]DOTA2荣耀之路1:Doom is back!weapon X!
2018/05/22 DOTA
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
flask中使用蓝图将路由分开写在不同文件实例解析
2018/01/19 Python
pycharm设置注释颜色的方法
2018/05/23 Python
python实现Flappy Bird源码
2018/12/24 Python
python opencv将图片转为灰度图的方法示例
2019/07/31 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
python生成并处理uuid的实现方式
2020/03/03 Python
python实现图片素描效果
2020/09/26 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
美国在线印刷公司:PsPrint
2017/10/12 全球购物
学校周年庆活动方案
2014/08/22 职场文书
乡镇创先争优活动总结
2014/08/28 职场文书
防灾减灾宣传标语
2014/10/07 职场文书
人口与计划生育责任书
2015/05/09 职场文书
七年级作文之《我和我的祖国》观后感作文
2019/10/18 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL