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视图里通过设置属性而改变游戏场景中游戏对象的状态,太过抽象,毕竟数字并不够直观.其实,改变游戏对象的状态,完全有最最直 ...
随机推荐
- awk如何替换一个字符串的第n个字符?
方法一: echo "abcdefg" | awk 'BEGIN{FS=OFS=""}$4="h"' // ""可 ...
- sb追加网页(在追加中添加C#代码)
“+代码+”
- 使用connect-multiparty限制nodejs图片上传
connect-multiparty中间件,可用于获取文件上传时各种参数,比如文件大小.格式等,具体使用: var multipart = require('connect-multiparty'); ...
- 通过mysql自动同步redis
在服务端开发过程中,一般会使用MySQL等关系型数据库作为最终的存储引擎,Redis其实也可以作为一种键值对型的数据库,但在一些实际场景中,特别是关系型结构并不适合使用Redis直接作为数据库.这俩家 ...
- 子级用css float浮动 而父级不能自适应高度解决方法
解决子级对象使用css float浮动 而父级div不能自适应高度,不能被父级内容撑开解决方法,父级div没有高度解决方法. 当在对象内的盒子使用了float后,导致对象本身不能被撑开自适应高度,这个 ...
- js获取当前日期和时间的代码
最佳答案 var myDate = new Date(); myDate.toLocaleDateString(): //获取当前日期myDate.toLocaleTimeString(); //获取 ...
- 解决MFC对话框类不能建立成功的方法(出现unable to open the files XX for class XX)
原文:http://blog.163.com/wangqi1973_off/blog/static/131034571201011885546230 为新加的对话框资源添加新类,类名取做CColorV ...
- 64位Navicat Premium-11.2.7(64bit)访问64位Oracle服务器
1 在windows 10 64位操作系统安装Navicat Premium-11.2.7(64bit). 2 在服务器安装64位的Oracle(win64_11gR2_database). 3 在h ...
- JavaWeb笔记——MVC设计模式和JavaWeb经典三层架
1 MVC设计模式 MVC设计模式 MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(C ...
- js中公有方法、特权方法、静态方法
1.公有属性和公有方法 1 2 3 4 5 6 7 8 9 function User(name,age){ this.name = name;//公有属性 this.age = age; } ...