原生JS记忆翻牌小游戏

  • 游戏截图
  • 游戏逻辑
  • 代码详解
    • html页面结构
    • css外部样式
    • javascript页面行为

游戏截图

游戏逻辑

游戏规则:在被分成16个方格的小方块下面有被随机打乱分配的8对图片,使用鼠标点击方格将图片翻转,若连续两次翻转的图片相同,则该组图片翻转成功,若连续两次翻转的图片不一样,则两张图片会在0.3秒后自动翻转回方格,当8对图片全部被翻转成功则游戏胜利。
主要逻辑:

  1. 定义一个数组,将其用Array.sort()方法进行乱序处理
  2. 根据得到的乱序数组将图片进行洗牌,分配到不同的方块下隐藏
  3. 根据以上得到的图片排列逻辑,将图片元素渲染进页面
  4. 监听鼠标点击事件,并通过事件委托判断鼠标点击的单位是否为已经反转过得单位
  5. 根据两张连续被翻转牌的id判断是否相同,从而判断是否反转成功,若id相同则成功,若id不相同则不成功
  6. 当被成功反转牌的个数等于方块的总个数时,游戏成功

自定义更改:想要更改游戏规格时,可以在对象初始化时将level参数调大,我准备的最大规格为level=3,想要更大规格同时也要准备同样多的图片,否则游戏中会出现多组相同的图片

代码详解

html页面结构

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>原生JS翻牌小游戏复刻1</title><link rel="stylesheet" href="style.css">
</head>
<body><div id="game"></div><script src="index.js"></script>
</body>
</html>

css外部样式

* {margin: 0;padding: 0;
}#game {width: 600px;height: 600px;margin: 60px auto;
}.block {float: left;box-sizing: border-box;width: 25%;height: 25%;border: 2px solid #ddd;background-color: #f0f0f0;
}.block:hover {background-color: #2b84d0;
}.pic {width: 100%;height: 100%;background-repeat: no-repeat;background-position: center center;transform: scaleX(0);transition: transform .2s;
}.block.on .pic {transform: scaleX(1);
}

javascript页面行为

var game = {el: '',//父元素level: 0,//当前游戏级别blocks: 0,//“牌”的总数gameWidth: 600,//游戏区域宽度,单位pxgameHeight: 600,//游戏区域的高度,单位pxdataArr: [],//数据数组,存放牌的信息judgeArr: [],//判断数组,存放被翻转牌的信息turnNum: 0,//翻转牌的总数picNum: 20,//牌的总数maxLevel: 3,//最高游戏级别init: function(options) {this.initData(options);this.render();this.handle();},initData: function(options) {this.options = options;this.el = options.el;this.level = options.level > this.maxLevel ? this.maxLevel : options.level;this.blocks = (this.level * 2) * (this.level * 2);this.getdataArr();},getdataArr: function() {/*** 获取数据数组*///1,利用Array.sort乱序var randomArr = this.randomArr();//得到随机数组var halfBlocks = this.blocks / 2;//得到排数的一半var dataArr = [];for(var i = 0; i < halfBlocks; i ++) {var num = randomArr[i];var info = {url: './images/' + num + '.png',id: num}dataArr.push(info,info);}this.dataArr = this.shuffle(dataArr);},randomArr: function() {/*** 回去数字数组* 数组中的每一项为0到count数字*/var picNum = this.picNum;var arr = [];for(var i = 0; i < picNum; i ++) {arr.push(i + 1);}return this.shuffle(arr);},shuffle: function(arr) {/*** 洗牌,数组乱序方法*///1,利用Array.sort方法进行数组乱序return arr.sort(function() {return 0.5 - Math.random();})},render: function() {/*** 渲染元素*///var template = '';var blocks = this.blocks;var gameWidth = this.gameWidth;var gameHeight = this.gameHeight;var level = this.level;var blockWidth = gameWidth / (level * 2);var blockHeight = gameHeight / (level * 2);var dataArr = this.dataArr;for(var i = 0; i < blocks; i ++) {var info = dataArr[i];var oBlock = document.createElement('div');var oPic = document.createElement('div');oPic.style.backgroundImage = 'url(' + info.url + ')';oBlock.style.width = blockWidth + 'px';oBlock.style.height = blockHeight + 'px';oBlock.picid = info.id;oPic.setAttribute('class','pic');oBlock.setAttribute('class','block');oBlock.appendChild(oPic);this.el.appendChild(oBlock);}},handle: function() {/*** 监听父元素的点击事件* 通过事件委托判断点击的元素是否为未翻转的牌*/var self = this;this.el.onclick = function(e) {var dom = e.target;var isBlock = dom.classList.contains('block');if(isBlock) {self.handleBlock(dom);}}},handleBlock: function(dom) {/*** 点击未翻转成功的牌时* 如果点击了两张牌,咋判断是否为同一张牌*/var picId = dom.picid;var judgeArr = this.judgeArr;var judgeLength = judgeArr.push({id: picId,dom: dom});dom.classList.add('on');if(judgeLength === 2) {this.judgePic();}this.judgeWin();},judgePic: function() {/*** 判断被翻转牌的图片是否相同* 若两个元素的id相同,则翻转成功* 若不同,则不成功,将牌再次翻转*/var judgeArr = this.judgeArr;var isSamePic = judgeArr[0].id === judgeArr[1].id;if(isSamePic) {this.turnNum += 2;} else {var picDom1 = judgeArr[0].dom;var picDom2 = judgeArr[1].dom;setTimeout(function() {picDom1.classList.remove('on');picDom2.classList.remove('on');},800)}judgeArr.length = 0;},judgeWin: function() {/*** 判断游戏是否胜利* 如果翻转成功牌的个数等于牌的总个数,则胜利*/if(this.turnNum === this.blocks) {setTimeout(function() {alert('胜利');},300)}}
}game.init({el: document.getElementById('game'),level: 2
})

原生JS记忆翻牌小游戏相关推荐

  1. 【unity3D】unity记忆翻牌小游戏教程(简单详细)

    游戏开发的学习记录⑨ 项目:记忆翻牌小游戏 unity版本:unity2020.3.30f1c1 目录 项目:记忆翻牌小游戏 unity版本:unity2020.3.30f1c1 一.游戏内容说明 二 ...

  2. 如何用html5制作抽奖游戏,原生js实现抽奖小游戏

    这个小游戏可以设置为抽奖小游戏,也可以设置为随机点名器,这个软件实现可以多次获取同一个元素的 1.HTML结构代码如下: 开始点名 停止 幸运的的你 2.css样式设置页面代码如下: css代码不仅仅 ...

  3. 原生js 实现2048小游戏

    2048小游戏 首先2048小游戏离不开16个格子,我们通过html和css创建好对应的标签和样式, 然后开始js逻辑 <div id="box">//一个盒子里面16 ...

  4. 原生js做h5小游戏之打砖块

    前言 首先,先说明一下做这个系列的目的:其实主要源于博主希望熟练使用 canvas 的相关 api ,同时对小游戏的实现逻辑比较感兴趣,所以希望通过这一系列的小游戏来提升自身编程能力:关于 es6 语 ...

  5. 原生JS实现2048小游戏

    前几天玩了一款2048微信小程序,结果脑子一抽,想到了为什么不能自己用JS写一个 于是,下面这个玩意儿就诞生了... 实现思路大概是这样的,首先使用table表格完成页面布局,其次使用JS实现数字动态 ...

  6. 原生js完成拼图小游戏

    废话不说,看代码,图片可以自己找,我这直接引用了百度的了 1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/x ...

  7. python小游戏 记忆翻牌小游戏设计与实现

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 居中显示 5 最后 0 项目简介

  8. 原生JS制作抽奖小游戏

    <div class="box"><div id="grid1" class="grid">电信优惠卷</di ...

  9. python小游戏毕设 记忆翻牌小游戏设计与实现 (源码)

    文章目录 0 项目简介 1 游戏介绍 2 实现效果 3 开发工具 3.1 环境配置 3.2 Pygame介绍 4 具体实现 居中显示 5 最后 0 项目简介

  10. html5猜数字游戏代码,js猜数字小游戏的简单实现代码

    复制代码 代码如下: 简易计算机 //获取随机数 function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.ran ...

最新文章

  1. 文件 在线压缩 技术
  2. 4 Git 分支 - 分支开发工作流
  3. 管家婆SQL SERVER数据库“可能发生了架构损坏。请运行DBCC CHECKCATALOG”修复
  4. 深度学习多模态融合_3D目标检测多模态融合综述
  5. 输入一个三位整数,求出该数字各个位的数字之和
  6. su如何变成实体_紫天学习星球教学:如何在SU里把JPG图片变成三维模型
  7. 动手动脑的问题以及课后实验性的问题
  8. 7. Nginx 预定义变量
  9. c语言word类型的题库,C语言编程题库
  10. 360加速球效果实现
  11. 法国警告Nobelium网络间谍攻击法国组织
  12. 一、Filter的配置项dispatcher
  13. 利用python+zabbix查询服务器利用率
  14. linux段错误core dumped,Linux下Segmentation fault(core dumped)简单调试方法
  15. 本次给大家来个简单的一元二次方程求解的编程
  16. ue4网格转地形_不用建模就能生成地形,SU怎么办到的?!
  17. 线程同步,为什么要引入线程同步?
  18. 软件测试之BUG描述
  19. 【人机对话】对话机器人技术简介:问答系统、对话系统与聊天机器人
  20. xtuoj1404菱形 II

热门文章

  1. JDK1.8帮助文档 chm格式中英文
  2. GCTF 2017 Web 补题 By Assassin [持续更新--抄大佬wp]
  3. Java 8?还记得那年大明湖畔的Java 7吗?
  4. JZOJ5444. 【NOIP2017提高A组冲刺11.2】救赎
  5. php日期函数实际应用,日期函数如何在PHP中使用
  6. ubuntu 20.10 下载安装教程
  7. cocoStudio工具的使用-----场景编辑器
  8. pe克隆linux系统下载,【完美成功】合并ntdetect.com的PE用的SETUPLDR.BIN(增加ISO/SYSLINUX专用版)...
  9. Windows​服务器添加单IP不同段IP和整段IP
  10. 高等代数 具有度量的线性空间(第10章)5 正交空间与辛空间