JavaScript小游戏--翻牌记忆游戏
1.有8张图片,每张图片要放两次,生成如下数组,长为16,[0,1,2,3,4,5,6,7,0,1,2,3,4,5,6,7] 其中两两相同的代表两张相同的图片,0对应文件夹image下的0.jpg,其余类似。
var randArr = [];
for(var j = 0; j < 2;j++){
for (var i = 0; i < m; i++) {
randArr.push(i);
}
}
2.将上面的数组传入random(),将数组内容打乱,即将图片打乱(随机交换位置)。
function random(data){
//随机打乱数组
for(var i = data.length-1; i >=0; i--){
var randomIndex = Math.floor(Math.random()*(i+1));
var itemAtIndex = data[randomIndex];
data[randomIndex] = data[i];
data[i] = itemAtIndex;
}
}
16个位置,概率问题,第一个位置,16选1,第二个位置15选1...最后一个1选1.所以i值要由大变小
3.为了将图片在屏幕上显示,应创建一个二维数组,然后将打乱后的图片数组传入。
注意:JS是不允许多维数组的,所谓的二维数组是数组嵌套。如var test = [["0","0"],["1","1"],["2","2"]],对于理解程序中的map()嵌套比较重要。
function arrs(n,data){
//生成坐标“二维”数组
var arr = [];
for (var i = 0; i < n; i++){
arr[i] = [];
for(var j = 0; j < n; j++){
arr[i].push(j);
}
}
//把打乱的数组放入“二维”数组里
var i = 0;
var res = arr.map(function(ba){
return ba.map(function(bb){
i++
return data[i-1]
});
});
img(res)
}
3.1 对其中map()遍历的说明
其有返回值,可以return
arr[].map(function(value,index,array){
//do something
return XXX
})
参数:value数组中的当前项,必须;index当前项的索引,array原始数组,后两个可选;
map的回调函数中支持return返回值,return的是XXX,相当于把数组中的这一项变为XXX(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了)
var ary = [12,23,24,42,1];
var res = ary.map(function (item,index,input) {
return item*10;
})
console.log(res);//-->[120,230,240,420,10]; 原数组拷贝了一份,并进行了修改
console.log(ary);//-->[12,23,24,42,1]; 原数组并未发生变化
3.2 map()的在该游戏中的应用
var res = arr.map(function(ba){
return ba.map(function(bb){
i++;
return data[i-1];
});
});
arr()是“二维”数组,这就是map()嵌套的原因,若为4X4的数组[[xx,xx,xx,xx],[xx,xx,xx,xx],[xx,xx,xx,xx],[xx,xx,xx,xx]]黄色阴影部分执行第二个map(),返回后产生一个新的数组[YY,YY,YY,YY],依次执行,4个嵌套的数组执行完后,又产生一个新的数组[[YY,YY,YY,YY],[YY,YY,YY,YY],[YY,YY,YY,YY],[YY,YY,YY,YY]],赋给res。
至此,每张图片都有了自己的坐标。
4.将图片显示
function img(resdata){
//根据坐标显示图片
var newImg = [];
for(var i = 0; i < resdata.length; i++){
for(var j = 0; j < resdata[i].length;j++){
newImg.push( resdata[i][j]);
}
}
for (var i = 0; i < newImg.length; i++) {
var str = "<li value="+newImg[i]+">"+ i +"</li>";
$("#grid").append(str);
$('li:eq('+ i +')').html("<div class='pai'><div class='back' ><img src='./image/" + newImg[i] + ".jpg' width='100%'></div><div class='front'><img src='./image/all.jpg' width='100%'></div></div>");
};
}
理解了数组嵌套,resdata.length才不会理解出错。
:eq() 选择器选取带有指定 index 值的元素。
给pai(牌)的背面和正面加上图片,数组中的0,1,2,3,4,5,6,7对应文件夹下的0.jpg,1.jpg等.
最开始的randArr[](代表文件夹下图片的数组) -> data[](随机打乱后的数组)-> res[给每个图片一个坐标]-> newImg[](显示图片)
把“二维”数组变为一维数组newImg[],所以newImg.length为16.而newImg[i]是0-7中的一个。
5、添加点击事件
需要几个变量:
index获得正点击的图片的索引(.index()方法),beforeIndex = index; beforeIndex代表之前点过的图片的索引。
backIndex获得正点击的图片的值(.attr()方法),如0,1,2... before = backIndex; before代表之前点过的图片的值。
5.1 before === null && beforeIndex === null说明之前没有点过图片
显示点击的图片,把当前点的图片的索引和图片值,存储到before,beforeIndex中,以便与之后的点击进行对比(确定是否连续点击了两张相同的图片)。
5.2 之前已经点击过图片了before,beforeIndex中有值,不为空
又点击了一张图片,显示这张图片
5.2.1 index == beforeIndex 连续点击的图片对应同一个索引,说明两次点击了同一个坐标位置,不做任何反应,return false;
5.2.2 前后两次点的不是同一个位置,但连续点击的图片值相同(before == backIndex),说明点击的两张图片内容相同,都是0.jpg或者...
则把这两张图片都显示一定的时间(setTimeout)后将整个牌(包括正面和反面)一起隐藏[隐藏后背景变白](.hide()方法),count++直到凑够8次。
before = null; beforeIndex = null; 成功找到两张相同的图片后,将这两个变量清空,重新寻找其它相同图片;
5.2.3 前后两次点的不是同一个位置,图片的内容也不相同,则将两张图片显示,再置于底层[不同于隐藏](.css("z-index","-1")),最后显示的是位于上层的图片;
function dian(){
var count = 0;
var before = null;
var beforeIndex = null;
$('body').on('click','li',function(){ //规定只能添加到li子元素上的事件
var index = $(this).index(); //相对于同胞元素的索引。对应的是哪个li var backIndex = $(this).attr("value"); //value存的是图片,图片是随机的,用于后面判断是否连续点击了位置不同的两张相同的图片。
if(before === null && beforeIndex === null){ //before代表前面点得那一个,都为空,说明之前没点过
before = backIndex; //开始点得是第一个
beforeIndex = index;
$('li:eq('+ index +') .back').css('z-index','2') //把那个li上的图片显示
}else{//否则,之前已经点过图片了
$('li:eq('+ index +') .back').css('z-index','2')//把点得那张显示
if(index == beforeIndex){ //如果点还是之前那个li是之前点过的,返回false
return false;
}
if(before == backIndex){ //
$('li:eq('+ beforeIndex +') .back').css('z-index','2')
setTimeout("$('li:eq("+ index +") .back').css('z-index','2')",1000)
$('li:eq('+ beforeIndex +') .pai').hide()
$('li:eq('+ index +') .pai').hide() //前后点的不是同一张,但图片[即value值]一样,则隐藏,会变白
count++
before = null; //置空,确定其它图片是否连续点的两张都一样。
beforeIndex = null;
}else{//两次点的图片不是同一张,value值也不同,则之前点的和现在点的都放在后面 $('li:eq('+ index+') .back').css('z-index','2');
setTimeout('$("li:eq('+ beforeIndex +') .back").css("z-index","-1"); $("li:eq('+ index+') .back").css("z-index","-1")',500);//把图片置于后面,前面的显示
before = null;
beforeIndex = null;
} }
if(count == 8){
alert('success!');
}
});
} // 刷新页面
function refresh(){
window.location.reload();
}
reload 方法,该方法强迫浏览器刷新当前页面。
语法:location.reload([bForceGet])参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当前页。 true, 则以GET 方式,从服务端取最新的页面, 相当于客户端点击 F5("刷新")
JavaScript小游戏--翻牌记忆游戏的更多相关文章
- 制作一个 JavaScript 小游戏
简评: 作者学习了编程两个月,边学边做了一个 JavaScript 小游戏,在文中总结了自己在这个过程中的一些体会,希望能给其他初学者一些帮助. 对于很多想学编程但一直没下定决心的同学来说,最大的问题 ...
- javascript小游戏--生命游戏
昨天参加Code Retreat的活动,"Code Retreat是一个一天的集中练习的活动,专注于软件开发和设计的基础". 要了解更多信息可前往 CodeRetreat官网 通过 ...
- 最少javascript代码完成一个2048游戏
原生javascript代码写的2048游戏.建议在谷歌浏览器下跑.'WASD'控制方向.演示地址请移步:http://runjs.cn/detail/bp8baf8b 直接贴代码~ html: &l ...
- JavaScript案例开发之扑克游戏
随着时代的发展,知识也在日益更新,但是基础知识永远不会过时,它是新时代的基石,更是我们进一步学习的保障,下面带着大家用JavaScript开发一款真正的扑克游戏,和大家一起分享,希望你们能够喜欢:闲话 ...
- 微信小程序开发的游戏《拼图游戏》
微信小程序开发的游戏<拼图游戏> 代码直接考进去就能用 pintu.js // pintu.js Page({ /** * 页面的初始数据 */ data: { }, initGame: ...
- 差分数组|小a的轰炸游戏-牛客317E
小a的轰炸游戏 题目链接:https://ac.nowcoder.com/acm/contest/317/E 思路 这题考查的是对差分数组原理和前缀和的理解. 四个数组分别记录朝着四个方向下放的个数 ...
- [ZJOI2007] 小Q的矩阵游戏 (模板—Dinic)
B. 矩阵游戏 题目描述 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行 ...
- NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结
NIM游戏,NIM游戏变形,威佐夫博弈以及巴什博奕总结 经典NIM游戏: 一共有N堆石子,编号1..n,第i堆中有个a[i]个石子. 每一次操作Alice和Bob可以从任意一堆石子中取出任意数量的石子 ...
- 直接操作游戏对象C#游戏开发
直接操作游戏对象C#游戏开发 2.2.3 直接操作游戏对象 在Inspector视图里通过设置属性而改变游戏场景中游戏对象的状态,太过抽象,毕竟数字并不够直观.其实,改变游戏对象的状态,完全有最最直 ...
随机推荐
- Ms SQL Server 游标嵌套 初始化数据
--TRUNCATE TABLE TAB_ROLE_FUNC; --SELECT * FROM TAB_ROLE_FUNC; ), ; --外层游标 DECLARE CURSOR_ROLE CURSO ...
- css内容简介(层叠样式表)
css是对网页编辑的加色,是对其功能的渲染. 根据规范每个元素都有一个display属性,每个元素都有一个------------如div元素他的默认为block. 行内元素和块级元素 块级元素会占据 ...
- PHP学习2——基本语法
主要内容: 二进制 数据类型 变量 常量 赋值 语句结构 函数 网站的核心功能是展现信息,文字,图片,视频,音频,对于计算机来说都是数据,这些数据按照二进制进行存储. 二进制 就是1100,0100, ...
- C# wx获取token基本方法
#region 请求Url,不发送数据 /// <summary> /// 请求Url,不发送数据 /// </summary> public static string Re ...
- Vue(五)--组件
1.组件也需要进行注册才可以使用:分为局部注册和全局注册 <body> <div id="app" > <my-component></m ...
- [android] 天气app布局练习
主要练习一下RelativeLayout和LinearLayout <RelativeLayout xmlns:android="http://schemas.android.com/ ...
- redis(8)集群简介
一.集群 互联网每天都会产生大量的数据,单实例已经不能满足需求.但是如果依赖于硬件成本的提升,那就不是所有人能够负担的起的. 集群这个时候出现,一定程度上解决了这个问题.它通过互联网,将多个单实例连接 ...
- PHP+Xdebug实现远程调试
以前以为php调试时服务器端和IDE必须在同一台机子上,无意发现xdebug其实是支持远程调试的. 尝试之后发现可以配置成功,还是可以调试代码的感觉爽啊! php所在Ubuntu服务器 ...
- K2P断流问题
本帖最后由 yufei8051 于 2019-3-15 15:29 编辑 感谢 “zhc887”的指点,把这3个文件删除后(后面大神说不是删除是清除,我直接删掉貌似也正常,建议听大神的)从这两天的使用 ...
- stylish——一键为网页换肤,改变字体大小,去除广告
今天给大家介绍的是一款非常好用的插件stylishstylish是一款可以为网站自定义主题的插件 可以在chrome的应用商店找到也可以通过网址访问https://userstyles.org/ 应用 ...