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视图里通过设置属性而改变游戏场景中游戏对象的状态,太过抽象,毕竟数字并不够直观.其实,改变游戏对象的状态,完全有最最直 ...
随机推荐
- jsp继承rapid库
如果jsp不使用继承方式开发,而是用标准的指令或动作元素去include,实在是太多重复代码. rapid-framework是谷歌的一个项目,可以实现jsp网页的继承,也就是书写模板页. 但是在ma ...
- java泛型使用
泛型的解释 现在感觉泛型是一个值得学习的地方,就抽出时间来学习和总结一下泛型的使用. Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允 ...
- Linux中的叹号命令
在shell环境下操作,需要积累点快捷输入的小技巧: 最常用的技巧恐怕就是Tab自动补全以及上方向键来回退上几条历史命令了,这些对于csh,bash,ksh,zsh都适用. 最近还找到一种快速回退上一 ...
- spring_boot 配置
配置pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- Windows下etc文件夹
etc etcetera[ɛtsɛtərə]缩写 等等的意思 放置一些其他文件
- java 从Excel 输出和输入
本文实现了使用java 从数据库中获得对象,并存入集合中, 然后输出到Excel,并设置样式 package com.webwork; import java.io.File; import java ...
- 浮动的补充丶文本和字体属性丶background丶定位
一丶浮动的补充 浮动的特性: 1. 浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有"字围"效果 4.浮动的元素有收缩的效果 前提是标准文档流,margin的垂直方向会出现 ...
- ArcGIS中国工具(ArcGISCTools)2.0正式发布
ArcGIS中国工具,简称CTools,集成在ArcMap10.0, ArcMap10.1, ArcMap10.2,安装就可以直接使用.主要有以下功能 1.接合图表生成2.图框工具3.制图工具4.图形 ...
- 139.00.009提高Github Clone速度
@(139 - Environment Settings | 环境配置) Method 1 :SS+系统内置代理 用 git 内置代理,直接走系统中运行的代理工具中转,比如,你的 SS 本地端口是 1 ...
- Java基础之Map的遍历
遍历Map集合,有四种方法: public static void main(String[] args) { Map<String, String> map = new HashMa ...