本文主要介绍了用原生js编写2048小游戏的示例代码,具有很好的参考价值,下面跟着小编一起来看下吧

效果图:

代码如下:

2048-game

#game {

display: none;

position: absolute;

left: 0px;

top: 0px;

right: 0px;

bottom: 0px;

background-color: #9DA5C3;

opacity: 0.5;

z-index: 1;

}

.clear:after {

content: "";

display: table;

clear: both;

}

.left {

float: left;

}

.right {

float: right;

}

.scoreShow {

height: 50px;

text-align: center;

line-height: 50px;

}

.model {

text-decoration: none;

color: white;

background-color: #bbada0;

font-size: 36px;

border-radius: 10px;

}

.head {

width: 480px;

height: 50px;

margin: 0 auto;

font-size: 25px;

}

#gridPanel {

width: 480px;

height: 480px;

margin: 0 auto;

background-color: #bbada0;

border-radius: 10px;

position: relative;

z-index: 1;

}

.grid,

.cell {

width: 100px;

height: 100px;

border-radius: 6px;

}

.grid {

background-color: #ccc0b3;

float: left;

margin: 16px 0 0 16px;

}

.cell {

position: absolute;

font-size: 60px;

text-align: center;

line-height: 100px;

color: #fff;

}

.n2 {

background-color: #eee3da

}

.n4 {

background-color: #ede0c8

}

.n8 {

background-color: #f2b179

}

.n16 {

background-color: #f59563

}

.n32 {

background-color: #f67c5f

}

.n64 {

background-color: #f65e3b

}

.n128 {

background-color: #edcf72

}

.n256 {

background-color: #edcc61

}

.n512 {

background-color: #9c0

}

.n1024 {

background-color: #33b5e5

}

.n2048 {

background-color: #09c

}

.n4096 {

background-color: #a6c

}

.n8192 {

background-color: #93c

}

.n2,

.n4 {

color: #776e65

}

#gameover {

width: 100%;

display: none;

position: fixed;

left: 50%;

right: 50%;

top: 148px;

width: 220px;

height: 200px;

border-radius: 10px;

background-color: white;

margin-left: -110px;

text-align: center;

z-index: 5;

}

#gameover>a {

display: inline-block;

width: 170px;

height: 50px;

border-radius: 10px;

text-decoration: none;

background-color: #9F8D77;

color: white;

font-size: 36px;

}

Score:

3X3

4X4

5X5

6X6

Try again

var arr = [];

function $(id) {

return document.getElementById(id);

}

function C(cls) {

return document.getElementsByClassName(cls);

}

var obj = {

ROW: 4,

CELL: 4,

r: 0,

c: 0,

f: 0, //r行 c列 f查找的下一位置

keyCd: 0,

score: 0,

createEle: 0, //是否需要创建元素

eleFragment: "", //文档片段变量

//游戏开始

gameStart: function() {

obj.init();

document.onkeydown = function(e) { //自动获得事件对象

switch (e.keyCode) { //判断按键号

case 37:

obj.keyCd = 1;

obj.moveLeft();

break;

case 38:

obj.keyCd = 2;

obj.moveUp();

break;

case 39:

obj.keyCd = 1;

obj.moveRight();

break;

case 40:

obj.keyCd = 2;

obj.moveDown();

break;

}

$("score").innerHTML = obj.score; //更新分数

}

},

//初始化

init: function() {

obj.eleFragment = document.createDocumentFragment();

for (r = 0; r < obj.ROW; r++) {

arr.push([]);

for (c = 0; c < obj.CELL; c++) {

arr[r][c] = 0;

if (obj.createEle == 1) {

obj.create(r, c);

}

}

}

if (obj.createEle == 1) {

obj.createEle = 0;

$("gridPanel").innerHTML = ""; //清空原有的元素

$("gridPanel").appendChild(obj.eleFragment); //添加元素

}

obj.score = 0;

$("score").innerHTML = obj.score;

$("game").style.display = "none";

$("gameover").style.display = "none";

obj.random(); //开始游戏随机生成两个数

obj.random();

obj.updateView();

},

//创建p元素,添加到gridPanel中

create: function(r, c) {

var grid, cell;

var increment = 14,

grWidth, grHeight, grMarginTop, grMarginLeft, ceWidth, ceHight;

grid = document.createElement("p");

cell = document.createElement("p");

grid.id = "g" + r + c;

grid.className = "grid";

cell.id = "c" + r + c;

cell.className = "cell";

if (obj.ROW == 3) {

increment = 24;

} else if (obj.ROW == 4) {

increment = 18;

}

grWidth = grHeight = ceWidth = ceHight = 66 + (6 - obj.ROW) * increment; //优化后

grMarginTop = grMarginLeft = (480 - grWidth * obj.ROW) / (obj.ROW + 1);

grid.style.width = grWidth + "px";

grid.style.height = grHeight + "px";

grid.style.marginTop = grMarginTop + "px";

grid.style.marginLeft = grMarginLeft + "px";

cell.style.width = ceWidth + "px";

cell.style.height = ceHight + "px";

cell.style.top = grMarginTop + r * (grMarginTop + ceWidth) + "px";

cell.style.left = grMarginLeft + c * (grMarginLeft + ceHight) + "px";

cell.style.lineHeight = ceHight + "px";

cell.style.fontSize = 30 + (6 - obj.ROW) * 10 + "px";

//优化前

/*if (obj.ROW == 3) {

grid.style.width = "140px";

grid.style.height = "140px";

grid.style.margin = "15px 0 0 15px";

cell.style.width = "140px";

cell.style.height = "140px";

cell.style.top = 15 + r * 155 + "px"; //设置距离上一位置的高度

cell.style.left = 15 + c * 155 + "px"; //设置离左一位置的距离

cell.style.lineHeight = "140px";

} else if (obj.ROW == 4) {

grid.style.width = "100px";

grid.style.height = "100px";

grid.style.margin = "16px 0 0 16px";

cell.style.width = "100px";

cell.style.height = "100px";

cell.style.top = 16 + r * 116 + "px";

cell.style.left = 16 + c * 116 + "px";

cell.style.lineHeight = "100px";

} else if (obj.ROW == 5) {

grid.style.width = "75px";

grid.style.height = "75px";

grid.style.margin = "17.5px 0 0 17.5px";

cell.style.width = "75px";

cell.style.height = "75px";

cell.style.top = 17.5 + r * 92.5 + "px";

cell.style.left = 17.5 + c * 92.5 + "px";

cell.style.fontSize = "40px";

cell.style.lineHeight = "75px";

} else if (obj.ROW == 6) {

grid.style.width = "66px";

grid.style.height = "66px";

grid.style.margin = "12px 0 0 12px";

cell.style.width = "66px";

cell.style.height = "66px";

cell.style.top = 12 + r * 78 + "px";

cell.style.left = 12 + c * 78 + "px";

cell.style.fontSize = "30px";

cell.style.lineHeight = "66px";

}*/

obj.eleFragment.appendChild(grid);

obj.eleFragment.appendChild(cell);

},

//随机产生一个新的数

random: function() {

while (1) {

var row = Math.floor(Math.random() * obj.ROW);

var cell = Math.floor(Math.random() * obj.CELL);

if (arr[row][cell] == 0) { //判断生成的随机数位置为0才随机生成2或4

arr[row][cell] = (Math.random() > 0.5) ? 4 : 2;

break;

}

}

// var row = Math.floor(Math.random() * 4);

// var cell = Math.floor(Math.random() * 4);

// if (arr[row][cell] == 0) { //判断生成的随机数位置为0才随机生成2或4

// arr[row][cell] = (Math.random() > 0.5) ? 4 : 2;

// return;

// }

// obj.random();//递归影响执行效率

},

//更新页面

updateView: function() {

var win = 0;

for (r = 0; r < obj.ROW; r++) {

for (c = 0; c < obj.CELL; c++) {

if (arr[r][c] == 0) { //值为0的不显示

$("c" + r + c).innerHTML = ""; //0不显示

$("c" + r + c).className = "cell" //清除样式

} else {

$("c" + r + c).innerHTML = arr[r][c];

$("c" + r + c).className = "cell n" + arr[r][c]; //添加不同数字的颜色

if (obj.ROW == 3 && arr[r][c] == 1024) {

win = 1;

} else if (obj.ROW == 4 && arr[r][c] == 2048) {

win = 1;

} else if (obj.ROW == 5 && arr[r][c] == 4096) {

win = 1;

} else if (obj.ROW == 6 && arr[r][c] == 8192) {

win = 1;

}

}

}

}

if (win == 1) { //通关

$("game").style.display = "block";

$("gameover").style.display = "block";

$("Score").innerHTML = "You win!
Score:" + obj.score;

}

if (obj.isGameOver()) { //游戏失败

$("game").style.display = "block";

$("gameover").style.display = "block";

$("Score").innerHTML = "GAME OVER!
Score:" + obj.score;

console.log("gameover");

}

},

//游戏失败

isGameOver: function() {

for (r = 0; r < obj.ROW; r++) {

for (c = 0; c < obj.CELL; c++) {

if (arr[r][c] == 0) { //有0还不是gameover

return false;

} else if (c != obj.CELL - 1 && arr[r][c] == arr[r][c + 1]) { //左往右 前一个和下一个不相等

return false;

} else if (r != obj.ROW - 1 && arr[r][c] == arr[r + 1][c]) { //上往下 上一个和下一个不相等

return false;

}

}

}

return true;

},

//查找下一个不为0的数值的位置

find: function(r, c, start, condition, direction) {

if (obj.keyCd == 2) { //上下按键

if (direction == 1) { //向上按键 f++

for (var f = start; f < condition; f += direction) {

if (arr[f][c] != 0) {

return f;

}

}

} else { //向下按键 f--

for (var f = start; f >= condition; f += direction) {

if (arr[f][c] != 0) {

return f;

}

}

}

} else { //左右按键

if (direction == 1) { //左按键 f++

for (var f = start; f < condition; f += direction) {

if (arr[r][f] != 0) {

return f;

}

}

} else { //右按键 f--

for (var f = start; f >= condition; f += direction) {

if (arr[r][f] != 0) {

return f;

}

}

}

}

return null; //循环结束仍然没有找到!=0的数值,返回null

},

//左按键的处理

dealToLeft: function(r) {

var next;

for (c = 0; c < obj.ROW; c++) {

next = obj.find(r, c, c + 1, obj.CELL, 1); //找出第一个不为0的位置

if (next == null) break; //没有找到就返回

//如果当前位置为0

if (arr[r][c] == 0) {

arr[r][c] = arr[r][next]; //把找到的不为0的数值替换为当前位置的值

arr[r][next] = 0; //找到的位置清0

c--; //再次循环多一次,查看后面否有值与替换后的值相同,

} else if (arr[r][c] == arr[r][next]) { //如果当前位置与找到的位置数值相等,则相加

arr[r][c] *= 2;

arr[r][next] = 0;

obj.score += arr[r][c];

}

}

},

move: function(itertor) {

var before, //没处理前

after; //after处理后

before = arr.toString();

itertor(); //执行for函数

after = arr.toString();

if (before != after) { //前后对比,如果不同就update

obj.random();

obj.updateView();

}

},

moveLeft: function() {

obj.move(function() {

for (r = 0; r < obj.ROW; r++) {

obj.dealToLeft(r);

}

})

// if 当前位置 不为零

// 从当前位置,下一个成员开始,遍历,

// 如果找到,与当前位置相等的数,

// 两者相加,并把不为零的成员,设置为零

// 如果 当前位置是 零

// 从当前位置下一个成员开始遍历

// 如果找到 第一个不为零的成员

// 当前位置数值设置为这个不为零的成员的值 ,并且把那个不为零的成员设置为 0

},

//右按键处理

dealToRight: function(r) {

var next;

for (c = obj.CELL - 1; c >= 0; c--) {

next = obj.find(r, c, c - 1, 0, -1); //找出第一个不为0的位置

if (next == null) break; //没有找到就返回

//如果当前位置为0

if (arr[r][c] == 0) {

arr[r][c] = arr[r][next]; //把找到的不为0的数值替换为当前位置的值

arr[r][next] = 0; //找到的位置清0

c++; //再次循环多一次,查看后面否有值与替换后的值相同,

} else if (arr[r][c] == arr[r][next]) { //如果当前位置与找到的位置数值相等,则相加

arr[r][c] *= 2;

arr[r][next] = 0;

obj.score += arr[r][c];

}

}

},

moveRight: function() {

obj.move(function() {

for (r = 0; r < obj.ROW; r++) {

obj.dealToRight(r);

}

})

},

//上按键处理

dealToUp: function(c) {

var next;

for (r = 0; r < obj.ROW; r++) {

next = obj.find(r, c, r + 1, obj.ROW, 1); //找出第一个不为0的位置

if (next == null) break;

//如果当前位置为0

if (arr[r][c] == 0) {

arr[r][c] = arr[next][c]; //把找到的不为0的数值替换为当前位置的值

arr[next][c] = 0; //找到的位置清0

r--; //再次循环多一次,查看后面否有值与替换后的值相同

} else if (arr[r][c] == arr[next][c]) { //如果当前位置与找到的位置数值相等,则相加

arr[r][c] *= 2;

arr[next][c] = 0;

obj.score += arr[r][c];

}

}

},

moveUp: function() {

obj.move(function() {

for (c = 0; c < obj.CELL; c++) {

obj.dealToUp(c);

}

})

},

//下按键处理

dealToDown: function(c) {

var next;

for (r = obj.ROW - 1; r >= 0; r--) {

next = obj.find(r, c, r - 1, 0, -1); //找出第一个不为0的位置

if (next == null) {

break;

}

//如果当前位置为0

if (arr[r][c] == 0) {

arr[r][c] = arr[next][c]; //把找到的不为0的数值替换为当前位置的值

arr[next][c] = 0; //找到的位置清0

r++; //再次循环多一次,查看后面否有值与替换后的值相同

} else if (arr[r][c] == arr[next][c]) { //如果当前位置与找到的位置数值相等,则相加

arr[r][c] *= 2;

arr[next][c] = 0;

obj.score += arr[r][c];

}

}

},

moveDown: function() {

obj.move(function() {

for (c = 0; c < obj.CELL; c++) {

obj.dealToDown(c);

}

})

}

}

window.onload = function() {

obj.createEle = 1;

obj.gameStart();

}

//切换模式

function getModel(e) { //事件冒泡获取a元素

var a = e.target,

modelValue = 4;

if (a.nodeName == "A") {

if (a.innerHTML == "3X3") {

modelValue = 3;

} else if (a.innerHTML == "4X4") {

modelValue = 4;

} else if (a.innerHTML == "5X5") {

modelValue = 5;

} else if (a.innerHTML == "6X6") {

modelValue = 6;

}

obj.ROW = obj.CELL = modelValue;

obj.createEle = 1; //需要创建格子p元素的标志

obj.gameStart();

}

}

// var modelValue = parseInt($("model").value);

// if (isNaN(modelValue)) {

// modelValue = 4; //默认是4*4

// }

// if (modelValue <= 2 || modelValue > 6) return; //2格或者大于6格无效

// obj.ROW = modelValue;

// obj.CELL = modelValue;

// obj.createEle = 1;

// obj.gameStart();

// console.log(modelValue);

// }

php写2048,原生js编写2048小游戏实例代码相关推荐

  1. python十点半游戏代码_Python实现Pig Latin小游戏实例代码

    前言: 本文研究的主要是Python实现pig Latin小游戏的简单代码,具体介绍如下. Pig Latin是一个语言游戏. 步骤: 1.让用户输入一个英文单词 2.确保用户输入一个有效单词 3.将 ...

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

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

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

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

  4. 图片五子棋PHP接口,原生JS+Canvas实现五子棋游戏实例

    一.功能模块 先看下现在做完的效果: 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15*15, ...

  5. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  6. 多关卡连连看php源码_前端实现连连看小游戏实例代码

    博主玩了这么久的连连看,居然是第一次发现,连连看最多只能有2个转弯.orz- 在网上搜索连连看的连线算法判断,并没有找到很全面的,经过自己摸索之后,画了下面的图(图有点丑--) 一. 2个物体在同一直 ...

  7. 数字华容道java的代码_jQuery实现数字华容道小游戏(实例代码)

    数字华容道 *{ padding: 0px; margin: 0px; } #btns>button{ width: 100px; height: 30px; border: none; bac ...

  8. C语言开发数字华容道实现,jQuery实现数字华容道小游戏(实例代码)

    数字华容道 *{ padding: 0px; margin: 0px; } #btns>button{ width: 100px; height: 30px; border: none; bac ...

  9. Auto js编写微信小游戏 《一笔画完》 辅助工具--开发篇

    前言: 1.开发工具:Auto js 2.平台:安卓6.0以上 3.开发语言 :javascript 效果演示: 这里附上效果展示视频: 开发步骤: 1.建模,将游戏环境转化为数据 2.使用算法,寻找 ...

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

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

最新文章

  1. learn python app v3_‎App Store 上的“Learn Python and Scratch”
  2. matlab与ie交互
  3. 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击
  4. 反射机制——获取Class中的构造函数
  5. Linux下多线程编程
  6. MySQL数据库中,将一个字段的值分割成多条数据显示
  7. title或alt自动换行
  8. 18个黑科技网站,你想要的软件都能找到,请收藏!!!
  9. 使用MapReduce挖掘父子关系
  10. word 目录格式调整
  11. l麒麟安装oracle,中标麒麟linux安装Oracle客户端
  12. a1708硬盘转接口_macbook pro2017 a1708转接卡更换大容量硬盘,Apple/苹果笔记本电脑_好文分享_优购 - 荐优,购适...
  13. 西安三日游-梦回长安
  14. python通过关键字搜索淘宝商品详细信息
  15. 极光推送Cordova插件适配Capacitor
  16. 北大自考计算机及应用,北大自考计算机哪个专业好
  17. win10 ubuntu双系统进入系统的时候recovering journal的解决办法
  18. 3G提速了,你敢用吗?
  19. 评测:北京歌华数字电视升级后的使用体验
  20. 吴恩达机器学习新课程又来了!旁听免费,小白友好

热门文章

  1. 任意多边形的面积(转)
  2. iOS NSURLSession
  3. 关于Xcode的Other Linker Flags
  4. [解题报告]HDU 2019 数列有序!
  5. [转载]Windows Vista user profile service服务未能登录
  6. rust第三人称视角插件_第三人称视角ThirdPerson Everything Mod
  7. Win10显示文件扩展名
  8. 培训变成了闹剧,却不想怎么改进
  9. 热烈庆贺本博客9级及排名138
  10. LINUX下载编译sqlite3