Web APP-20xx游戏

时间:2024.5.4

实 习 设 计(论文)

题目名称 Web APP-2048游戏 学生学部(系) 机电与信息工程学部 专业班级 学 号

学生姓名 指导老师

2015 年 01 月 25 日

1

目 录

1概念

1.1游戏背景-----------------------------------------------------1

1.2游戏开发-----------------------------------------------------1

1.3论文内容安排-------------------------------------------------1

2 功能设计

2.1界面设计-----------------------------------------------------2

2.2游戏架构-----------------------------------------------------4

2.3游戏设计-----------------------------------------------------4

3 结果展示

3.1游戏开始界面------------------------------------------------11

3.2游戏结束界面------------------------------------------------13

4 结论

4.1结论心得----------------------------------------------------14

5 参考文献

5参考文献------------------------------------------------------14

1 概述

2

1.1 游戏背景

《2048》的祖先是一款名为《Threes》(中文名为《小3传奇》)的手游。《小3传奇》的两位开发者花了近一年半时间才开发出这个游戏的核心玩法,却在其上架App store后仅21天就被《1024》抄了过去。最让人意想不到的是,《2048》则更为迅速,19岁的Gabriele Cirulli只用了一个星期改编前两者游戏,却获得最大的成功,《Threes》却不被人知。 而到了现在,这类游戏从发布到现在,不管是App Store还是Android市场,下载量已经远远超越了千万,网上各种版本的都有,比如朝代版,后宫版,甲乙丙版,生肖版等。

1.2 游戏开发

由于本人十分喜欢《2048》这款手游,所以我就想在电脑的浏览器也能玩这款游戏,在此次课程论文的制作过程中,我将运用我学习到的知识以及javascript和jQuery知识通过网上现有的资料尝试完成此次课程的开发,让这款游戏同时支持电脑浏览器和手机浏览器。

1.3论文内容安排

要开发这一款游戏,要根据以下几步来完成:

1)首先是要对这款游戏的代码分析。对整一个游戏,要将各个部位分割成其对应部位的功能代码,并且逐一去分析实现其中不同的功能。

2)其次是游戏的流程。在做好每一个部分的代码之后,就需要把所创造的各个关键部分拼接起来,因此,就需要先把该游戏的流程一步一步的弄清楚。

3)再者是对《2048》这一款游戏的算法分析。对于整个游戏而言,最主要的心脏就是这一款游戏的算法。《2048》这一款游戏的算法分为上下左右自个方向的。

4)《2048》中每个格子的数据和颜色的刷新。在每一次移动之后,几乎在这4*4的每一个方格上的数据都会变化,因此在每一次移动之后,每一个方格上的数据都要刷新一次。相对的,每一个数的背景颜色是不同的,也就是说,在每一次数据刷新的时候,每一个方格上的颜色也要同样的刷新一次。

5)最后是可不可以继续游戏的检测。当屏幕上没有没有写有数据的方格并且屏幕上的数据没有哪两个相邻的数据是一样的两个数,那么就判定为游戏结束。

3

2 功能设计

2.1 设计界面

在设计整个2048游戏之前先得设计一个2048的游戏界面,有了游戏界面,才能够进行2048这一款游戏的下一步设计,这是创建2048小游戏的最基础的步骤。

2048这一款游戏的界面是4*4方格的,于是就需要在界面上设置4*4的方格,有了这些方格之后才能在方格上面装数字,然后才能继续游戏。

main.js部分代码:

function newGame(){

}

function init(){

for (var i = 0; i < 4; i++) { } for (var j = 0; j < 4;j++) { } var gridCell=$("#grid_cell_"+i+"_"+j); gridCell.css('top',getTop(i,j)); gridCell.css('left',getLeft(i,j)); init();//初始化棋盘

support.js部分代码:

function getTop(i, j) {

var top = cellSpace + i *( cellSpace + cellSideLength );

return top;

}

function getLeft(i, j) {

return cellSpace + j *( cellSpace + cellSideLength );

}

2.2 游戏架构

4

2.3 游戏设计

游戏逻辑

定义board数组,调用updateBoardView();函数根据变量board的值对NumberCell元素进行操作,动态的把NumberCell元素添加到index.html中。

function updateBoardView(){$(".number_cell").remove();

for (var i = 0; i < 4; i++) {

for (var j = 0; j <4; j++){$("#grid_Container").append('<div class="number_cell" id="number_cell_'+i+'_'+j+'"></div>');

var theNumberCell=$('#number_cell_'+i+'_'+j+'');

if (board[i][j]==0) {

theNumberCell.css('width', '0px');

theNumberCell.css('height', '0px');

theNumberCell.css('left',

getLeft(i,j)+cellSideLength/2);

theNumberCell.css('top', getTop(i,j)+cellSideLength/2); }else{

theNumberCell.css('width', cellSideLength);

theNumberCell.css('height', cellSideLength);

theNumberCell.css('top',getTop(i,j));

theNumberCell.css('left',getLeft(i,j));

theNumberCell.css('color',getNumberColol(board[i][j]));

theNumberCell.css('background-color',getBackgroundColor

(board[i][j])); theNumberCell.text(board[i][j])

}

hasConflicted[i][j]=false;

};

5

WebAPP20xx游戏

};

$('.number_cell').css('line-height',cellSideLength+'px') $('.number_cell').css('font-size',0.6*cellSideLength+'px') $('.number_cell').css('border-radius',0.1*cellSideLength); }

//获取数字的背景颜色

function getBackgroundColor(number) {

switch (number) {

case 2:

return "#eee4da";break;

case 4:

return "#ede0c8";break;

case 8:

return "#f2b179";break;

case 16:

return "#f59563";break;

case 32:

return "#f67c5f";break;

case 64:

return "#f65e3b";break;

case 128:

return "#edcf72";break;

case 256:

return "#edcc61";break;

case 512:

return "#9c0";break;

case 1024:

return "#33b5e5";break;

case 2048:

return "#09c";break;

case 4096:

return "#a6c";break;

case 8192:

return "#93c";break;

}

return "black";

}

function getNumberColol(number) {

if (number <= 4) {

return "#776e65";

};

return "white";}

页面初始化

6

定义函数generateOneNumber();在16个格子中随机找一个格子生成一个数字 function generateOneNumber() {

if (nospace(board)) {

return false;

}

//取随机位置

var randx=parseInt(Math.floor(Math.random()*4));

var randy=parseInt(Math.floor(Math.random()*4));

var times=0;

while(times<50){

if(board[randx][randy]==0){

break;

}

var randx=parseInt(Math.floor(Math.random()*4));

var randy=parseInt(Math.floor(Math.random()*4));

times++;

}

if (times==50) {

for(var i=0;i<4;i++){

for(var j=0;j<4;j++){

if (board[i][j]==0) {

randx=i;

randy=j;

};

}

}

};

var randomNum= parseInt(Math.floor(Math.random()*4)) +1; if (randomNum==3) {

randomNum=4

}

else if (randomNum==1) {

randomNum=2;

};

//在随机位置显示随机数字

board[randx][randy]=randomNum;

showNumberAnimate(randx,randy,randomNum);

return true;

}

生成随机数的动画

7

动画效果利用jQuery的animate函数完成

function showNumberAnimate(i,j,randomNum){

var numberCell=$('#number_cell_'+i+'_'+j+'');

numberCell.css('color', getNumberColol(randomNum));

numberCell.css('background-color',getBackgroundColor(randomNum)); numberCell.text(randomNum);

numberCell.animate({

width:cellSideLength,

height:cellSideLength,

top:getTop(i,j),

left:getLeft(i,j)

},122)

}

游戏的循环

WebAPP20xx游戏

8

//玩家按下按键之后的操作

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

switch(event.keyCode)

{

case (37):if(moveLeft()){

setTimeout('generateOneNumber()',130); }

else{

setTimeout('isGameOver()',170); };//left

break;

case 38:if(moveUp()){

setTimeout('generateOneNumber()',130); // generateOneNumber();

event.preventDefault();

}

else{

setTimeout('isGameOver()',170); }; //up

break;

case 39:if(moveRight()){

setTimeout('generateOneNumber()',130); }

else{

setTimeout('isGameOver()',170); }; //right

break;

case 40:if(moveDown()){

setTimeout('generateOneNumber()',130); event.preventDefault();

}

else{

setTimeout('isGameOver()',170); }; //down

break;

default:

break;

}

})

交互细节

9

//判断向左右移动时是否有阻挡

function noBlockHorizontal(row,col1,col2,board){

for(var i=col1+1;i<col2;i++){

if (board[row][i]!=0) {

return false;

};

}

return true

}

//判断向上向下移动时是否有阻挡

function noBlockVertical(col,row1,row2,board){

for(var i=row1+1;i<row2;i++){

if (board[i][col]!=0) {

return false;

};

}

return true

}

支持移动端

//前端支持:屏幕自适应

<meta name="viewport"

content="width=device-width, height =device-height,initial-scale = 1.0 , minimum-scale = 1.0 ,maximum-scale = 1.0 ,user-scalable = no" />

//支持移动端

$(document).ready(function(){

forMobile();

newGame();

})

function forMobile(){

if (documentWidth>500) {

grid_ContainerWidth=500;

cellSideLength=100;

cellSpace=20;

};

$("#grid_Container").css('width',grid_ContainerWidth-2*cellSpace);

$("#grid_Container").css('height',grid_ContainerWidth-2*cellSpace);

$('#grid_Container').css('padding',cellSpace);

10

$('#grid_Container').css('border-radius',0.02*grid_ContainerWidth);

$('.cell').css('width',cellSideLength);

$('.cell').css('height',cellSideLength);

$('.cell').css('border-radius',0.1*cellSideLength);

$('.top').css('width',grid_ContainerWidth);

$('#newGame_btn').css('padding',0.13*cellSideLength+'px'+' 0px') }

//触碰屏幕进行游戏

document.addEventListener('touchstart',function(event){

startX=event.touches[0].pageX;

startY=event.touches[0].pageY;

});

document.addEventListener('touchend',function(event){

endX=event.changedTouches[0].pageX;

endY=event.changedTouches[0].pageY;

var moveX=endX - startX;

var moveY=endY - startY;

if

(Math.abs(moveX)<0.13*documentWidth&&Math.abs(moveY)<0.13*documentWidth) {

return;

};

if(Math.abs(moveX)>=Math.abs(moveY)){

//x

if(moveX>0){

//move right

if(moveRight()){

setTimeout('generateOneNumber()',130);

}

else{

setTimeout('isGameOver()',170);

};

}

else{

//move left

if(moveLeft()){

setTimeout('generateOneNumber()',130);

}

else{

setTimeout('isGameOver()',170);

}

}

11

}

else{

//y

if(moveY>0){

//move down

event.preventDefault();

if(moveDown()){

setTimeout('generateOneNumber()',130); event.preventDefault();

}

else{

setTimeout('isGameOver()',170); };

}

else{

//move up

event.preventDefault();

if(moveUp()){

setTimeout('generateOneNumber()',130); // generateOneNumber();

event.preventDefault();

}

else{

setTimeout('isGameOver()',170); };

}

}

});

//判断游戏是否结束

function isGameOver(){

if (nospace(board)&&noMove(board)) {

gameOver();

};

};

3 结果展示

12

3.1 游戏开始界面

电脑端

WebAPP20xx游戏

利用谷歌浏览器的开发者工具模拟iPhone4进行游戏

13

3.2 游戏结束界面

14

WebAPP20xx游戏

游戏结束,提示是否再试一次,调用confirm,点击确定则进入新的游戏 function gameOver(){

var result = confirm('Try Again?');

if(result == true){

newGame();

}

}

WebAPP20xx游戏

15

4 结论

经过了几天的努力终于把2048这个游戏完成了,想当初看这个游戏玩法简单又内容简单,没想到制作起来是这样“浩大”的一个工程。在这短短的几天时间里,参考了许多的相关资料,有时候感觉很辛苦不想再做下去了,但是又想试试看挑战一下自己的能力能不能完成这样一个任务,于是又在网上找到了不少对我很有帮助的材料、视频,为了自己的目标就这样一点一点地去完成这个项目。

这几天里让我学习到了制作小游戏的基本步骤,首先要创建一个页面,然后再对页面进行相应的设置,再者要对对象进行设置,最后要使游戏能够听我们的指挥我们要插入一个事件监听,而且其中还需要结合各种算法才能实现这样的一个小小的小游戏,真是“麻雀虽小,五脏俱全”。

最终运行出来的结果因为本人能力实在有限,所以有很多东西还是有缺陷,这让我意识到自身能力的不足,还有许许多多的知识等待着我去了解、去学习。虽然如此,但是看着最终运行出来的结果,还是给了我很大的鼓舞和安慰,这一次制作2048小游戏的经验让我受益匪浅,感受到了这个项目是我要正真用心认认真真完成的一件事,这真是一个难得的学习的过程。

5 参考文献:

[1] 达内科技.JavaScript学员用书.达内集团教学研发部.2014.1

[2] 杨涛/王建桥/杨晓云. JavaScript DOM编程艺术. 人民邮电出版社. 2006.12

[3] (美国)BearBibeault (美国)YehudaKatz. jQuery实战.人民邮电出版社.2009.1

[4] 丁琛/赵泽欣. 高性能JavaScript. 电子工业出版社.2010.11

[5] (美)Eric A.Meyer. CSS权威指南. 东南大学出版社.2007.6

16

更多相关推荐:
游戏名言

游戏名言范晓君鲁迅先生有句名言游戏是儿童最正当的行为玩具是儿童的天使名言解析游戏是适合于幼儿特点的一种独特活动方法也是促进幼儿心理发展的一种最好活动方式首先游戏是幼儿对社会活动的一种初级模拟当幼儿在逐渐的发展中...

名人名言、游戏

比长短比长短适用活跃团队气氛简述每队派出一人比不同的单位人数不限需要一位主持人场地不限适合刚认识或不认识的人游戏方法1分组不限人数至少要二组每组五人以上2主持人宣布要比的单位然后每组派出一位他们认为会赢此单位的...

句子游戏总汇

句子游戏总汇GAME1Bombgame教师把板书在黑板上的句子每两个分开而后叫两个学生上台一个面朝黑板另一个背朝黑板面朝黑板的同学用手指两个句子中的任一个背朝黑板的同学猜对方指的是哪个句子猜中下面的同学跟读该句...

经典游戏句子

1我的剑将杀尽天下不义之人誓不枉负我英雄之名华英雄中华英雄2我是你的剑使我的使命就是立于你的身前将你的敌人尽数屠灭于此剑之下冰璃幽城幻剑3只要时轮还在运转只要七曜还在天顶分聚纵此一生我一定能找出让它偏离的办法用...

句子游戏

句子游戏神木县第四小学三年级3班冯佳欣指导老师常培玲哈哈哈哈哈哈教室里传出一阵阵笑声这是我们三年级文学社举行的一次句子游戏老师先中边星月和张欣悦去和老师玩结果拼成的句子是高飞在公园里写字同学们有的拍着桌子笑有的...

句子游戏总汇

句子游戏总汇1Readaftertheteacherwithgestures操练方式老师边读句子边做动作学生一边做动作一边跟读句子老师声音可时快时慢注意事项此为其他任何游戏和新课的基础也是不可跨越的阶段且带读次...

拼句游戏 好词好句

拼句游戏好词我的反应哈哈大笑笑得人仰马翻喜滋滋把手举得高高的笑得直不起腰笑得快要流口水描写老师故弄玄虚和颜悦色慢条斯理描写同学绞尽脑汁捧腹大笑挤眉弄眼花枝乱颤哄堂大笑前前俯后仰异口同声洋洋得意手舞足蹈描写句子稀...

传话游戏句子

如果你找不到一个坚持的理由你就必须找到一个重新开始的理由低调做人你会一次比一次稳健高调做事你会一次比一次优秀做人要像导弹那样时时修正做事要像子弹那样勇往直前别把我的个性和态度混为一谈我的个性是源于我是谁而我的态...

教学游戏 句子

1邮递员postman游戏说明准备两套可拼成句子的单词卡每组选派两名同学成为邮递员老师把两套卡打乱看哪组能最先拼出完整的句子就像邮递员要把每封信正确的送到每一家一样其余学生在下面说句子此游戏适合句子操练2小和尚...

英文游戏广告 推广通用句

英文游戏广告推广通用50句ByShane1ExploreahugenewworldNodownloadfreetoplay一起来探索新的世界吧免费免下载2Outhereonlythestrongsurvivep...

曹操 陆游 苏轼的激励名言

曹操曾说老骥伏枥志在千里烈士暮年壮心不已陆游曾说自许封候在万里有谁知鬓虽残心未死苏轼曾说会挽雕弓如满月西北望射天狼

陆游的诗词中的一些经典语句

陆游的诗词中的一些经典语句苦寒勿怨天雨雪雪来遗我明年麦三月翠浪舞东风四月黄云暗南陌坐看比屋腾欢声已觉有司宽吏责腰第33357条陆游本自无心落市朝不妨随处狎渔樵螺青点出暮山色石绿染成春浦潮县驿下时人语闹寺楼倚处客...

游戏名句(12篇)