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 必知必会之closure
Sep 21 Javascript
jquery 图片截取工具jquery.imagecropper.js
Apr 09 Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 Javascript
解析javascript 浏览器关闭事件
Jul 08 Javascript
Bootstrap入门书籍之(三)栅格系统
Feb 17 Javascript
JS实现的仿QQ空间图片弹出效果代码
Feb 23 Javascript
Vue.extend构造器的详解
Jul 17 Javascript
jquery点击回车键实现登录效果并默认焦点的方法
Mar 09 jQuery
详解基于iview-ui的导航栏路径(面包屑)配置
Feb 22 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
May 07 Javascript
js利用递归与promise 按顺序请求数据的方法
Aug 30 Javascript
layui lay-verify form表单自定义验证规则详解
Sep 18 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
PHP 飞信好友免费短信API接口开源版
2010/07/22 PHP
php发送post请求的三种方法
2014/02/11 PHP
Yii结合CKEditor实现图片上传功能
2014/06/13 PHP
php对关联数组循环遍历的实现方法
2015/03/13 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
Netbeans 8.2与PHP相关的新特性介绍
2016/10/08 PHP
javascript知识点收藏
2007/02/22 Javascript
javascript 得到文件后缀名的思路及实现
2020/05/09 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
js封装可使用的构造函数继承用法分析
2015/01/28 Javascript
jquery中封装函数传递当前元素的方法示例
2017/05/05 jQuery
微信小程序 支付功能实现PHP实例详解
2017/05/12 Javascript
使用jQuery实现鼠标点击左右按钮滑动切换
2017/08/04 jQuery
使用Dropzone.js上传的示例代码
2017/10/10 Javascript
浅谈Vue 函数式组件的使用技巧
2020/06/16 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
如何用Python合并lmdb文件
2018/07/02 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
python3实现飞机大战
2020/11/29 Python
详解BeautifulSoup获取特定标签下内容的方法
2020/12/07 Python
python excel多行合并的方法
2020/12/09 Python
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
农民致富事迹材料
2014/01/23 职场文书
会计自我鉴定
2014/02/04 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
北京颐和园导游词
2015/01/30 职场文书
单独二胎证明
2015/06/24 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
浅谈python中的多态
2021/06/15 Python
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS