游戏迷提供最新游戏下载和手游攻略!

揭秘:如何制作一款网页版2048小游戏

发布时间:2024-10-16浏览:19

其实揭秘:如何制作一款网页版2048小游戏的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享揭秘:如何制作一款网页版2048小游戏的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

网页版2048游戏

分数:0

重新开始

Game2048js文件:

(function(window, document, $) {

function Game2048(opt) {

var prefix = opt.prefix, len = opt.len, size = opt.size, margin = opt.margin;

var score = 0;

var winNum = 2048;

var isGameOver = true;

var board = new Board(len);

var view = new View(prefix, len, size, margin);

view.init();

board.onGenerate = function(e) {

view.addNum(e.x, e.y, e.num);

};

board.onMove = function(e) {

if (e.to.num >= winNum) {

isGameOver = true;

setTimeout(function() { view.win(); }, 300);

}

if (e.to.num >e.from.num) {

score += e.to.num;

view.updateScore(score);

}

view.move(e.from, e.to);

};

board.onMoveComplete = function(e) {

if (!board.canMove()) {

isGameOver = true;

setTimeout(function() { view.over(score); }, 300);

}

if (e.moved) {

setTimeout(function(){ board.generate(); }, 200);

}

};

$(document).keydown(function(e) {

if (isGameOver) {

return false;

}

switch (e.which) {

case 37: board.moveLeft(); break;

case 38: board.moveUp(); break;

case 39: board.moveRight(); break;

case 40: board.moveDown(); break;

}

});

function start() {

score = 0;

view.updateScore(0);

view.cleanNum();

board.init();

board.generate();

board.generate();

isGameOver = false;

}

$('#' + prefix + '_restart').click(start);

start();

};

// 数据处理

function Board(len) {

this.len = len;

this.arr = [];

}

Board.prototype = {

// 事件

onGenerate: function() {},

onMove: function() {},

onMoveComplete: function() {},

// 创建数组

init: function() {

for (var arr = [], x = 0, len = this.len; x< len; ++x) {

arr[x] = [];

for (var y = 0; y< len; ++y) {

arr[x][y] = 0;

}

}

this.arr = arr;

},

// 在随机位置增加一个随机数

generate: function() {

var empty = [];

for (var x = 0, arr = this.arr, len = arr.length; x< len; ++x) {

for (var y = 0; y< len; ++y) {

if (arr[x][y] === 0) {

empty.push({x: x, y: y});

}

}

}

if (empty.length< 1) {

return false;

}

var pos = empty[Math.floor((Math.random() * empty.length))];

this.arr[pos.x][pos.y] = Math.random()< 0.5 ? 2 : 4;

this.onGenerate({x: pos.x, y: pos.y, num: this.arr[pos.x][pos.y]});

},

// 左移

moveLeft: function() {

var canMove = false;

// 从上到下,从左到右

for (var x = 0, len = this.arr.length; x< len; ++x) {

for (var y = 0, arr = this.arr[x]; y< len; ++y) {

// 从 y + 1 位置开始,向右查找

for (var next = y + 1; next< len; ++next) {

// 如果 next 单元格是 0,找下一个不是吗 0 的单元格

if (arr[next] === 0) {

continue;

}

// 如果 y 数字是 0,则将 next 移动到 y 位置,然后将 y 减 1 重新查找

if (arr[y] === 0) {

arr[y] = arr[next];

this.onMove({from: {x: x, y: next, num: arr[next]}, to: {x: x, y: y, num: arr[y]}});

arr[next] = 0;

canMove = true;

--y;

// 如果 y 与 next 单元格数字相等,则将 next 移动并合并给 y

} else if (arr[y] === arr[next]) {

arr[y] += arr[next];

this.onMove({from: {x: x, y: next, num: arr[next]}, to: {x: x, y: y, num: arr[y]}});

arr[next] = 0;

canMove = true;

}

break;

}

}

}

this.onMoveComplete({moved: canMove});

},

moveRight: function() {

var moved = false;

for (var x = 0, len = this.arr.length; x< len; ++x) {

for (var y = len - 1, arr = this.arr[x]; y >= 0; --y) {

for (var prev = y - 1; prev >= 0; --prev) {

if (arr[prev] === 0) {

continue;

}

if (arr[y] === 0) {

arr[y] = arr[prev];

this.onMove({from: {x: x, y: prev, num: arr[prev]}, to: {x: x, y: y, num: arr[y]}});

arr[prev] = 0;

moved = true;

++y;

} else if (arr[y] === arr[prev]) {

arr[y] += arr[prev];

this.onMove({from: {x: x, y: prev, num: arr[prev]}, to: {x: x, y: y, num: arr[y]}});

arr[prev] = 0;

moved = true;

}

break;

}

}

}

this.onMoveComplete({moved: moved});

},

moveUp: function() {

var canMove = false;

for (var arr = this.arr, len = arr.length, y = 0; y< len; ++y) {

for (var x = 0; x< len; ++x) {

for (var next = x + 1; next< len; ++next) {

if (arr[next][y] === 0) {

continue;

}

if (arr[x][y] === 0) {

arr[x][y] = arr[next][y];

this.onMove({from: {x: next, y: y, num: arr[next][y]}, to: {x: x, y: y, num: arr[x][y]}});

arr[next][y] = 0;

canMove = true;

--x;

} else if (arr[x][y] === arr[next][y]) {

arr[x][y] += arr[next][y];

this.onMove({from: {x: next, y: y, num: arr[next][y]}, to: {x: x, y: y, num: arr[x][y]}});

arr[next][y] = 0;

canMove = true;

}

break;

}

}

}

this.onMoveComplete({moved: canMove});

},

moveDown: function() {

var canMove = false;

for (var arr = this.arr, len = arr.length, y = 0; y< len; ++y) {

for (var x = len - 1; x >= 0; --x) {

for (var prev = x - 1; prev >= 0; --prev) {

if (arr[prev][y] === 0) {

continue;

}

if (arr[x][y] === 0) {

arr[x][y] = arr[prev][y];

this.onMove({from: {x: prev, y: y, num: arr[prev][y]}, to: {x: x, y: y, num: arr[x][y]}});

arr[prev][y] = 0;

canMove = true;

++x;

} else if (arr[x][y] === arr[prev][y]) {

arr[x][y] += arr[prev][y];

this.onMove({from: {x: prev, y: y, num: arr[prev][y]}, to: {x: x, y: y, num: arr[x][y]}});

arr[prev][y] = 0;

canMove = true;

}

break;

}

}

}

this.onMoveComplete({moved: canMove});

},

canMove: function() {

for (var x = 0, arr = this.arr, len = arr.length; x< len; ++x) {

for (var y = 0; y< len; ++y) {

if (arr[x][y] === 0) {

return true;

}

var curr = arr[x][y], right = arr[x][y + 1];

var down = arr[x + 1] ? arr[x + 1][y] : null;

if (right === curr || down === curr) {

return true;

}

}

}

return false;

}

};

// 视图处理

function View(prefix, len, size, margin) {

this.prefix = prefix;

this.len = len; // 单元格单边的数量(实际数量 len * len)

this.size = size; // 每个单元格的边长

this.margin = margin; // 每个单元格的间距

this.score = $('#' + prefix + '_score');

this.container = $('#' + prefix + '_container');

var containerSize = len * size + margin * (len + 1);

this.container.css({width:containerSize , height: containerSize});

this.nums = {};

}

View.prototype = {

// 计算位置

getPos: function(n) {

return this.margin + n * (this.size + this.margin);

},

init: function() {

for (var x = 0, len = this.len; x< len; ++x) {

for (var y = 0; y< len; ++y) {

var $cell = $('

');

$cell.css({

width: this.size + 'px', height: this.size + 'px',

top: this.getPos(x), left: this.getPos(y)

}).appendTo(this.container);

}

}

},

addNum: function(x, y, num) {

var $num = $('

');

$num.text(num).css({

top: this.getPos(x) + parseInt(this.size / 2),

left: this.getPos(y) + parseInt(this.size / 2)

}).appendTo(this.container).animate({

width: this.size + 'px',

height: this.size + 'px',

lineHeight: this.size + 'px',

top: this.getPos(x),

left: this.getPos(y)

}, 100);

this.nums[x + '-' + y] = $num;

},

move: function(from, to) {

var fromIndex = from.x + '-' + from.y, toIndex = to.x + '-' + to.y;

var clean = this.nums[toIndex];

this.nums[toIndex] = this.nums[fromIndex];

delete this.nums[fromIndex];

var prefix = this.prefix + '-num-';

var pos = {top: this.getPos(to.x), left: this.getPos(to.y)};

this.nums[toIndex].finish().animate(pos, 200, function() {

if (to.num >from.num) {

clean.remove();

$(this).text(to.num).removeClass(prefix + from.num).addClass(prefix + to.num);

}

});

},

updateScore: function(score) {

this.score.text(score);

},

win: function() {

$('#' + this.prefix + '_over_info').html('

您获胜了

');

$('#' + this.prefix + '_over').removeClass(this.prefix + '-hide');

},

over: function(score) {

$('#' + this.prefix + '_over_info').html('

本次得分

' + score + '

');

$('#' + this.prefix + '_over').removeClass(this.prefix + '-hide');

},

cleanNum: function() {

this.nums = {};

$('#' + this.prefix + '_over').addClass(this.prefix + '-hide');

$('.' + this.prefix + '-num').remove();

}

};

window['Game2048'] = Game2048;

})(window, document, jQuery);

用户评论

敬情

终于找到这个!我之前一直在找网页版能玩的小游戏,这款2048做的还可以哦,画面简洁,操作顺畅。周末就专心试试这个了。

    有5位网友表示赞同!

话少情在

哇,太厉害了!学会这方法以后,就能随时随地玩2048了吗?以前总是手机上玩的,网页版真是更方便好多。

    有6位网友表示赞同!

不相忘

分享的网站页面看着复杂一点,我不会编程的话应该很难理解吧……

    有11位网友表示赞同!

安陌醉生

我也喜欢玩2048!这个网页版的玩法应该比手机版好很多啊,画面清晰度更高,更容易控制数字的移动。期待周末试试!

    有15位网友表示赞同!

凉凉凉”凉但是人心

这个做法看起来很厉害啊!我从小就爱玩数字游戏,这款2048也是我的心头好。可惜我没有编程基础,只能仰望大神们了。

    有8位网友表示赞同!

红玫瑰。

网页版的2048?真棒!我现在可以用手机玩吗?还是只有在电脑上才能体验这个网页版呢?

    有12位网友表示赞同!

◆乱世梦红颜

我一直想自己做一个简单的网页游戏,这篇文章很有启发意义!虽然我学编程时间不长,但现在可以开始尝试制作自己的2048了!

    有15位网友表示赞同!

愁杀

文章写得太详细了简直是教科书级别的讲解!佩服你的耐心和能力!

    有13位网友表示赞同!

烬陌袅

不过我觉得这个做法还是太复杂了呀。想要玩网页版的2048,我直接去浏览器上搜索结果不是更方便吗?

    有8位网友表示赞同!

孤独症

网页版2048游戏确实很不错,操作简单但也很考验策略思维。 期待能看到更多玩法的讲解!

    有18位网友表示赞同!

轨迹!

这个方法很有帮助!我一直想学习网页游戏开发, 这篇博文让我对这方面有了更多的了解,我会好好研究一下这篇分享内容。

    有15位网友表示赞同!

半梦半醒半疯癫

虽然我不会编程,但是还是可以理解其中的道理。网站页面设计确实很重要,会影响用户的体验感!

    有5位网友表示赞同!

如梦初醒

这个2048网页版本也太慢了吧?感觉比手机版卡很多倍,而且操作有点迟滞……太难受了

    有9位网友表示赞同!

苏樱凉

好厉害啊! 竟然可以自己制作一个网页版的2048游戏! 我以后有机会也试试做这种类型的游戏哦 ~

    有17位网友表示赞同!

日久见人心

这个博客写的确实不错,但是我更喜欢手机版的游戏体验,网页版有点麻烦。

    有11位网友表示赞同!

柠栀

其实我已经找到了很多网页版的2048,这个方法太复杂了,直接找网页链接玩不是更快吗?

    有14位网友表示赞同!

麝香味

分享这样的文章真的很有帮助!希望将来我能自己制作出来,体验自己写的网页代码运行的乐趣。

    有17位网友表示赞同!

╭摇划花蜜的午后

我尝试了一下,发现代码有一些错误,导致游戏无法正常运行。 不过还是感谢你的分享,我会继续努力学习!

    有5位网友表示赞同!

热点资讯