引言:做2048小游戏会将横纵方向的数字内容,存储在一个二维数组中,要将这个二维数组中的内容显示在页面上,就一定要用遍历算法来实现了。


一、二维数组存储

 

  •  首先考虑用二维数组存储所有行数,列数  →  var  RN=4,CN=4;
  • 然后再定义一个变量data 来保存这个二维数组  →  var  data;
  • 游戏的所有主要执行程序都保存在start()函数下 → 启动游戏
  • 保存存有行数,列数的二维数组到data中    关键代码 ↓
function  start(){
data=[]; //创建空数组保存在data中
for(var r=0;r<RN;r++){ //r从0到<RN
data.push([]); //向data中压入一个空的子数组
for(var c=0;c<CN;c++){} //c从0到<CN结束
data[r][c]=0; //为data中r行c位置保存一个0
……
}
}
}
start(); //调用start函数,游戏启动
二、在二维数组中随机选一个位置生成2或4
  • 关键函数创建 →  function  randomNum(){ }
  • 生成横行和纵行的位置的随机数保存在r和c  →  0~RN-1之间,0~CN-1之间
  • 2048的游戏有一个重要特点,每移动一次数字会增加两个新的数字,并且这个数字不会覆盖掉原来的数字
  • 坑:只有在随机生成的位置处无数字,即data中r行c列的值为0时,才可以给data中r行c列随机保存一个2或4
  • 解决:反复执行上面的算法,直到条件满足,才保存这个随机的2或4
  • 坑:需要随机,且只能在2或4这两种情况中选择
  • 解决:因为Math.random()生成的随机数在0~1之间,且游戏要求又只有2种,可以依据判断生成的随机数是否<0.5来决定保存2或者是4,如果游戏要增加难度,希望其中一个数字的概率生成要大一点,那么这个0.5的数字即为出现概率控制的关键
  • 坑:2048的游戏每次增加的是两个新的数字
  • 解决:在调用随机生成函数randomNum()的时候,一定要调用两次,这样才可以生成两个数
  • 坑:这个时候页面上没有任何效果
  • 解决:因为现在还只是把数字保存在了内存中的二维数组里,还没有往页面上写,所以还需要再往页面上写,查的时候只能在控制台上查
//在data中一个随机位置生成2或4
function randomNum(){
while(true){
var r = parseInt(Math.random()*RN);
var c = parseInt(Math.random()*CN);
if(data[r][c]==0){
data[r][c]=Math.random()<0.5?2:4;//0.5控制2和4的出现几率
break;
}
}
}
三、遍历算法将数组元素填写到页面对应div
  • 关键函数创建 → function updateView(){ }
  • 遍历到二维数组的元素之后,要和页面的div对应上,关键 ↓
  1. 页面div起名的时候,c01即表示第0行第1列的div
  2. 在拿到二维数组的元素后,“c”+行号+列号,就组成了对应div的id
  3. 拼好id之后,按id找到对应的div元素
  • 遍历data的二维数组  两个for循环 → 外层循环控制行,内层循环控制列
  • 将遍历到的r行c列的值保存到div的内容  →  div.innerHTML = data[r][c];
  • 坑:二维数组中r行c列的值可能是还未获得随机数时的  0 ,依据2048游戏的规则,这个时候是不能保存到div中的
  • 解决:加判断,如果r行c列的值不为0,才将值保存到div中;否则,把r行c列的值为0的对应div中的内容清除掉,因为二维数组里的元素为0,实际上有两种情况,一种是还从未有过值,但这种情况会随着游戏的行移动次数增加,逐渐减少,更多的是,这个位置里面曾经有过一个值,并且div上也有过数字,但是经过行的移动移走了,这个时候,就要立即把对应的r行c列的div的内容也清除掉,这样才能保证页面数字的变化显示与二维数字中的变化相同。
  • 给内容数值为  * 的div的class添加一个  n*,同时清除div本身的class属性  →  n*为css中对应数字的特定背景颜色class
//将data中的每个元素填写到页面的对应div中
updateView(); function updataView(){
//遍历data
for(var r=0;r<this.RN;r++){
for(var c=0;c<this.CN;c++){
var id = "c"+r+c;
var div = document.getElementById(id);
if(this.data[r][c]!=0){
div.innerHTML = data[r][c];
div.className = "n"+data[r][c];
}else{
div.innerHTML = "";
div.className = "";
}
}
}
var span = document.getElementById("score");
span.innerHTML=score;
}  

注:转载请注明出处

【2048小游戏】——原生js爬坑之遍历算法显示二维数组内容的更多相关文章

  1. 【2048小游戏】——CSS/原生js爬坑之纯CSS模态对话框&游戏结束

    引言:2048小游戏的结束界面,使用纯CSS制作模态对话框,一般做模态对话框都会使用BootStrap自带的模态对话框组件方便使用,但在制作要运行在移动端的小项目时,就不能使用BootStrap,因为 ...

  2. 【2048小游戏】——原生js爬坑之封装行的移动算法&事件

    引言:2048小游戏的核心玩法是移动行,包括横行和纵行,玩家可以选择4个方向,然后所有行内的数字就会随着行的移动而向特定的方向移动.这个行的移动是一个需要重复调用的算法,所以这里就要将一行的移动算法封 ...

  3. 2048小游戏(Java)(swing实现)(二)

    这里是上一次的成果,只能用鼠标点,没法用键盘 最近扩充了一下知识面,实现了用键盘操控2048小游戏 但是还是不支持同时使用键盘和鼠标同时操作 import javax.swing.*; //impor ...

  4. 什么是二维数组?二维遍历?Java二维数组制作图片迷宫 使用如鹏游戏引擎制作窗口界面 附带压缩包下载,解压后双击start.bat启动

    什么是二维数组? 数组当中放的还是数组 int [][] arr=new int[3][2]; 有3个小箱子,每个箱子2个格子. 看结果? int [][] arr=new int[3][2]; Sy ...

  5. 【京东详情页】——原生js爬坑之二级菜单

    一.引言 做京东详情页仿写的时候,要用原生js实现顶部菜单的二级菜单显示与隐藏事件的触发. 过程中遇到了一个坑,在这里与大家分享.要实现的效果如下: 二.坑 谁触发事件?显示.隐藏二级菜单       ...

  6. 【京东详情页】——原生js爬坑之放大镜

    一.引言 在商城的详情页中,放大镜的功能是很常见的.这里京东详情页就要做一个仿放大镜的效果,预览如下: 二.实现原理 实际上,放大镜的实现是单纯用几个div,鼠标移入其中一个小图div,触发事件显示另 ...

  7. 【京东详情页】——原生js爬坑之标签页

    一.引言 要做详情页的商品评价等5个li的标签页转换,效果如下: 二.实现原理 有一个特别的地方:上面五个li,但下面只有四个容器(table/div). 设计的目的:无论点哪个li,只有前四个div ...

  8. 【Game】2048小游戏

    每个男孩都有一个游戏梦吧,本例简单讲述一款很火的游戏<2048>的制作. 本例参考地址:https://www.imooc.com/learn/76 游戏准备 1.游戏的逻辑(2048大家 ...

  9. js、jQuery实现2048小游戏

    2048小游戏 一.游戏简介:  2048是一款休闲益智类的数字叠加小游戏 二. 游戏玩法: 在4*4的16宫格中,您可以选择上.下.左.右四个方向进行操作,数字会按方向移动,相邻的两个数字相同就会合 ...

随机推荐

  1. 处理python字符串中的中文字符

    # -*- coding:utf-8 -*- import sys,os txta = open('a.txt','r') str = '' for line in txta: str += line ...

  2. apple键盘中的Tilde / back-tick key can't work

    使用波浪键的时候会输出>或<. 解决办法:http://atodorov.org/blog/2015/04/30/fixing-tilde-and-function-keys-mappin ...

  3. Junit单元测试--01

    如何编写单元测试 燕双龙 一 单元测试简介 单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节.也是唯一需要编写代码才能进行测试的一种测试方法.在标准的开发过程中,单元测试的代码与实 ...

  4. Corrupt block relative dba: 0x04c20df1

    alert日志报以下提示: Corrupt block relative dba: , block ) Fractured block found during backing up datafile ...

  5. Python之文件操作:经验总结

    1.怎么判断读出来的文件是gbk还是utf-8编码 if content == u'中国'.encode('gbk'):     return 'gbk' elif content == u'中国'. ...

  6. 基于webpack搭建vue-cli以及webstorm的设置

    N1.检查本地电脑是否安装node和npm 安装vue-cli的前提是已经安装了npm 是否安装npm检查命令 npm -v 如果出现版本号,说明已经安装了npm 查看node版本号 node -v ...

  7. 开发人员为组件添加自定义的className

    在开发过程当中需要给组件写上自己的样式,这个时候怎么办呢? 直接给组件添加className这样是无效的 当给组件添加className之后 在写组件的时候需要对使用你的组件的开发人员提供自定义cla ...

  8. .NET and php

    原文发布时间为:2011-12-29 -- 来源于本人的百度文章 [由搬家工具导入] http://www.php-compiler.net/blog/2011/phalanger-3-0

  9. .bat 处理错误码

    某些命令只会返回error level,而要添加互操作性,.bat文件的返回值,exit code应该最后指定,那么需要,在这个单行的命令后面单个添加处理error level 的语句,最后再做统一的 ...

  10. [LeetCode] Reorder List 反向插入链表

    Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...