Web 版2048

最近在园子里看到 javascript 面向对象制作坦克大战 这么一篇博客,看完后深受启发,刚好那时热衷于2048游戏,所以就将坦克大战游戏改版成了Web版的2048游戏

效果图

1.2048Game.hml

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title>2048Game</title>
 5     <script src="JS/Common.js" type="text/javascript"></script>
 6     <script src="JS/Play.js" type="text/javascript"></script>
 7     <style type="text/css">
 8         .div0 {
 9             background-color: #C6BEAD;
10         }
11
12         .div2, .div4 {
13             background-color: #FFFFFF;
14             font-size: 30px;
15         }
16
17         .div8, .div16 {
18             background-color: #EFB27B;
19             font-size: 30px;
20             color:white;
21         }
22
23         .div32, .div64 {
24             background-color: #F77D63;
25             font-size: 30px;
26             color:white;
27         }
28
29         .div128, .div256 {
30             background-color: #E8F951;
31             font-size: 25px;
32             color:white;
33         }
34
35         .div512, .div1024 {
36             background-color: #EFC652;
37             font-size: 25px;
38             color:white;
39         }
40
41         .div2048, .div4096,.div8192,.div16384 {
42             background-color: #FF3D3A;
43             font-size: 25px;
44             color:white;
45         }
46
47         #divMap
48             {
49                 position:absolute;background:#000;
50                 border:10px outset #C65D05;
51                 width:540px;height:540px;
52             }
53         /*.mapBorder{position:absolute;left:0;top:0;z-index:9999;width:520px;height:520px;}*/
54         .mapBorder{
55             width: 450px;
56                     height: 450px;
57                     border-radius: 10px 10px;
58                     background-color: #B5AA9C;
59                     margin-left:auto;
60                     margin-right:auto;}
61         .mapBorder span{
62             width:100px;
63             height:100px;
64             overflow:hidden;
65             /*display:block;*/
66             float:left;
67             border-radius: 10px 10px;
68             text-align:center;
69             line-height:100px;
70             font-family:Arial;
71             font-weight:900;
72         }
73     </style>
74     <script type="text/javascript">
75         window.onload = function () {
76             // 调用游戏装载对象
77             var loader = new GameLoader();
78             loader.Begin();
79         }
80
81         function ReStartClick() {
82             document.location.reload();
83         }
84     </script>
85 </head>
86 <body>
87     <div style="width: 450px; height:30px; margin-left: auto; margin-right: auto; ">
88         <input type="button" id="btnReStart" name="1111" value="ReStart" onclick="ReStartClick()" />
89         <span>  Score:</span><span id="Score" style="color:red; font-size:24px; font-weight:bolder">0</span>
90     </div>
91     <div id="main">
92
93     </div>
94 </body>
95 </html>

2048Game.htm

2.Common.js

 1 var UtilityClass = {
 2     // 创建dom元素到parentNode中,可指定id,className
 3     CreateE: function (type, id, className, parentNode) {
 4         var J = document.createElement(type);
 5         if (id) { J.id = id };
 6         if (className) { J.className = className };
 7         return parentNode.appendChild(J);
 8     },  // 移除元素
 9     RemoveE: function (obj, parentNode) {
10         parentNode.removeChild(obj);
11     },
12     GetFunctionName: function (context, argumentCallee) {
13         for (var i in context) {
14             if (context[i] == argumentCallee) { return i };
15         }
16         return "";
17     },  // 绑定事件,返回func方法,this为传入的obj
18     BindFunction: function (obj, func) {
19         return function () {
20             func.apply(obj, arguments);
21         };
22     }
23 };

Common.js

3.Play.js

  1 GameLoader = function () {
  2     this._mapContainer = document.getElementById("mian");
  3     this._rowCount = 4;
  4     this._colCount = 4;
  5     this._battleField = [];
  6 }
  7
  8 GameLoader.prototype = {
  9     Begin: function () {
 10         // 加载地图
 11         this.Load();
 12         // 添加按键事件
 13         var warpper = UtilityClass.BindFunction(this, this.OnKeyDown);
 14         window.onkeydown = warpper;
 15     }
 16     , Load: function () {
 17         var ww = document.getElementById("main");
 18         var mapBorder = UtilityClass.CreateE("div", "", "mapBorder", ww);
 19         for (var i = 0; i < this._rowCount; i++) {
 20             for (var j = 0; j < this._colCount; j++) {
 21                 var kk = UtilityClass.CreateE("span", "", "div0", mapBorder);
 22                 kk.style.marginLeft = ‘10px‘;
 23                 kk.style.marginTop = ‘10px‘;
 24                 this._battleField[this._rowCount * i + j] = kk;
 25             }
 26         }
 27         this.NewNumber();
 28         this.NewNumber();
 29
 30     }
 31     , OnKeyDown: function (e) {
 32         var isNewNumber = false;
 33         switch ((window.event || e).keyCode) {
 34             case 37:
 35                 isNewNumber = this.MoverLeft(true);
 36                 break;     //左
 37             case 38:
 38                 isNewNumber = this.MoverUp(true);
 39                 break;     //上
 40             case 39:
 41                 isNewNumber = this.MoverRight(true);
 42                 break;     //右
 43             case 40:
 44                 isNewNumber = this.MoverDown(true);
 45                 break;     //下
 46         }
 47         if (isNewNumber) {
 48             this.NewNumber();
 49         } else {
 50             if (this.IsFailure()) {
 51                 alert("继续加油!");
 52             }
 53         }
 54     }
 55     , MoverUp: function (isMover) {
 56         var isNewNumber = false;
 57         for (var j = 0; j < this._colCount; j++) {
 58             var count = 0;
 59             for (var i = 1; i < this._rowCount; i++) {
 60                 if (this._battleField[i * this._rowCount + j].innerText) {
 61                     for (count; count < i; count++) {
 62                         if (this._battleField[count * this._rowCount + j].innerText) {
 63                             if (this._battleField[count * this._rowCount + j].innerText == this._battleField[i * this._rowCount + j].innerText) {
 64                                 isNewNumber = true;
 65                                 if (!isMover)
 66                                     return isNewNumber;
 67                                 var innerText = parseInt(this._battleField[count * this._rowCount + j].innerText) + parseInt(this._battleField[i * this._rowCount + j].innerText);
 68                                 this._battleField[count * this._rowCount + j].innerText = innerText;
 69                                 this._battleField[count * this._rowCount + j].className = ‘div‘ + this._battleField[count * this._rowCount + j].innerText;
 70                                 this._battleField[i * this._rowCount + j].innerText = "";
 71                                 this._battleField[i * this._rowCount + j].className = ‘div0‘;
 72                                 this.AddScore(innerText);
 73                                 count++;
 74                                 break;
 75                             }
 76                         } else {
 77                             isNewNumber = true;
 78                             if (!isMover)
 79                                 return isNewNumber;
 80                             this._battleField[count * this._rowCount + j].innerText = this._battleField[i * this._rowCount + j].innerText;
 81                             this._battleField[count * this._rowCount + j].className = ‘div‘ + this._battleField[count * this._rowCount + j].innerText;
 82                             this._battleField[i * this._rowCount + j].innerText = "";
 83                             this._battleField[i * this._rowCount + j].className = ‘div0‘;
 84                             break;
 85                         }
 86                     }
 87                 }
 88             }
 89         }
 90         return isNewNumber;
 91     }
 92     , MoverDown: function (isMover) {
 93         var isNewNumber = false;
 94         for (var j = 0; j < this._colCount; j++) {
 95             var count = this._rowCount - 1;
 96             for (var i = this._rowCount - 2; i >= 0; i--) {
 97                 if (this._battleField[i * this._rowCount + j].innerText) {
 98                     for (count; count > i; count--) {
 99                         if (this._battleField[count * this._rowCount + j].innerText) {
100                             if (this._battleField[count * this._rowCount + j].innerText == this._battleField[i * this._rowCount + j].innerText) {
101                                 isNewNumber = true;
102                                 if (!isMover)
103                                     return isNewNumber;
104                                 var innerText = parseInt(this._battleField[count * this._rowCount + j].innerText) + parseInt(this._battleField[i * this._rowCount + j].innerText);
105                                 this._battleField[count * this._rowCount + j].innerText = innerText;
106                                 this._battleField[count * this._rowCount + j].className = ‘div‘ + this._battleField[count * this._rowCount + j].innerText;
107                                 this._battleField[i * this._rowCount + j].innerText = "";
108                                 this._battleField[i * this._rowCount + j].className = ‘div0‘;
109                                 this.AddScore(innerText);
110                                 count--;
111                                 break;
112                             }
113                         } else {
114                             isNewNumber = true;
115                             if (!isMover)
116                                 return isNewNumber;
117                             this._battleField[count * this._rowCount + j].innerText = this._battleField[i * this._rowCount + j].innerText;
118                             this._battleField[count * this._rowCount + j].className = ‘div‘ + this._battleField[count * this._rowCount + j].innerText;
119                             this._battleField[i * this._rowCount + j].innerText = "";
120                             this._battleField[i * this._rowCount + j].className = ‘div0‘;
121                             break;
122                         }
123                     }
124                 }
125             }
126         }
127         return isNewNumber;
128     }
129     , MoverLeft: function (isMover) {
130         var isNewNumber = false;
131         for (var j = 0; j < this._rowCount; j++) {
132             var count = 0;
133             for (var i = 1; i < this._colCount; i++) {
134                 if (this._battleField[j * this._rowCount + i].innerText) {
135                     for (count; count < i; count++) {
136                         if (this._battleField[j * this._rowCount + count].innerText) {
137                             if (this._battleField[j * this._rowCount + count].innerText == this._battleField[j * this._rowCount + i].innerText) {
138                                 isNewNumber = true;
139                                 if (!isMover)
140                                     return isNewNumber;
141                                 var innerText = parseInt(this._battleField[j * this._rowCount + count].innerText) + parseInt(this._battleField[j * this._rowCount + i].innerText);
142                                 this._battleField[j * this._rowCount + count].innerText = innerText;
143                                 this._battleField[j * this._rowCount + count].className = ‘div‘ + this._battleField[j * this._rowCount + count].innerText;
144                                 this._battleField[j * this._rowCount + i].innerText = "";
145                                 this._battleField[j * this._rowCount + i].className = ‘div0‘;
146                                 this.AddScore(innerText);
147                                 count++;
148                                 break;
149                             }
150                         } else {
151                             isNewNumber = true;
152                             if (!isMover)
153                                 return isNewNumber;
154                             this._battleField[j * this._rowCount + count].innerText = this._battleField[j * this._rowCount + i].innerText;
155                             this._battleField[j * this._rowCount + count].className = ‘div‘ + this._battleField[j * this._rowCount + count].innerText;
156                             this._battleField[j * this._rowCount + i].innerText = "";
157                             this._battleField[j * this._rowCount + i].className = ‘div0‘;
158                             break;
159                         }
160                     }
161                 }
162             }
163         }
164         return isNewNumber;
165     }
166     , MoverRight: function (isMover) {
167         var isNewNumber = false;
168         for (var j = 0; j < this._rowCount; j++) {
169             var count = this._colCount - 1;
170             for (var i = this._colCount - 2; i >= 0; i--) {
171                 if (this._battleField[j * this._rowCount + i].innerText) {
172                     for (count; count > i; count--) {
173                         if (this._battleField[j * this._rowCount + count].innerText) {
174                             if (this._battleField[j * this._rowCount + count].innerText == this._battleField[j * this._rowCount + i].innerText) {
175                                 isNewNumber = true;
176                                 if (!isMover)
177                                     return isNewNumber;
178                                 var innerText = parseInt(this._battleField[j * this._rowCount + count].innerText) + parseInt(this._battleField[j * this._rowCount + i].innerText);
179                                 this._battleField[j * this._rowCount + count].innerText = innerText;
180                                 this._battleField[j * this._rowCount + count].className = ‘div‘ + this._battleField[j * this._rowCount + count].innerText;
181                                 this._battleField[j * this._rowCount + i].innerText = "";
182                                 this._battleField[j * this._rowCount + i].className = ‘div0‘;
183                                 this.AddScore(innerText);
184                                 count--;
185                                 break;
186                             }
187                         } else {
188                             isNewNumber = true;
189                             if (!isMover)
190                                 return isNewNumber;
191                             this._battleField[j * this._rowCount + count].innerText = this._battleField[j * this._rowCount + i].innerText;
192                             this._battleField[j * this._rowCount + count].className = ‘div‘ + this._battleField[j * this._rowCount + count].innerText;
193                             this._battleField[j * this._rowCount + i].innerText = "";
194                             this._battleField[j * this._rowCount + i].className = ‘div0‘;
195                             break;
196                         }
197                     }
198                 }
199             }
200         }
201         return isNewNumber;
202     }
203     , AddScore: function (score) {
204         var ww = document.getElementById("Score");
205         var oldScore = ww.innerText;
206         ww.innerText = parseInt(oldScore) + parseInt(score);
207     }
208     , NewNumber: function () {
209         var item = [];
210         var j = 0;
211         for (var i = 0; i < this._battleField.length; i++) {
212             if (this._battleField[i].innerText <= 0) {
213                 item[j] = i;
214                 j++;
215             }
216         }
217         var text = Math.random() * 100 > 60 ? 4 : 2;
218         var tt = item[Math.floor(Math.random() * (j - 1))];
219         this._battleField[tt].innerText = text;
220         this._battleField[tt].className = ‘div‘ + text;
221     }
222     , IsFailure: function () {
223         for (var i = 0; i < this._battleField.length; i++) {
224             if (this._battleField[i].innerText <= 0) {
225                 return false;
226             }
227         }
228         if (this.MoverUp(false)) {
229             return false;
230         }
231         else if (this.MoverDown(false)) {
232             return false;
233         }
234         else if (this.MoverLeft(false)) {
235             return false;
236         }
237         else if (this.MoverRight(false)) {
238             return false;
239         }
240         return true;
241     }
242 }

Play.js

代码下载地址  链接:http://pan.baidu.com/s/1jGmpqf0 密码:0p2s

时间: 2024-11-04 23:26:35

Web 版2048的相关文章

Web版2048游戏制作

写在前面 工作之余参与了<慕课网2048游戏制作>的学习视频,视频断断续续看完了,游戏也制作成功了.因为其他的事情也没来的及总结,一拖时间也就过去了,整理磁盘的时候发现了2048源码,思考一下还是将之push到github上了(后面贴出),也顺便写篇总结,回顾一下,同时也谢谢liuyubobobo老师的授课. 不过源码在手,不运行下玩玩,怎么说的过去呢,哈哈!下面是游戏截图. 大图是PC端运行的效果,小图则是在iphone5s上的运行效果(Chrome浏览器debug,具体如何做参考文章:ht

从零開始开发Android版2048 (一)初始化界面

自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学一点忘一点,效率太低.所以从今天開始.我打算实际做点小程序.在开发中不断地学习吧. 恰好近期Android上有个游戏2048比較火,所以就那这个练手吧. 由于对Android还没有太深入的了解,所以我写的东西都会比較基础,所以须要看一些高阶开发的朋友能够绕过了,也希望能够有高手们给我一些指导和建议,

java词频统计——web版支持

需求概要: 1.把程序迁移到web平台,通过用户上传TXT的方式接收文件. 2.用户直接输入要统计的文本,服务器返回结果 3.在页面上给出链接 (如果有封皮.作者.字数.页数等信息更佳)或表格,展示经典英文小说词频统计结果: 4.支持用户自定义单词分隔符: 5.词汇范围对比(额外项). 分析和设计: 1.创建web工程,利用servlet上传文件的技术实现用户向服务器上传文件.页面设置表单类型为enctype="multipart/form-data",创建文件上传文本框<inp

web版的tty

1.wetty Wetty是使用Node.js和websockets开发的一个开源`Web-based SSH` 2.环境配置 2.1.配置epel源 1 [epel] 2 name=epel 3 baseurl=https://mirrors.aliyun.com/epel/7Server/x86_64/ 4 gpgcheck=0 2.2.安装依赖关系 1 yum install git nodejs npm 2.3.克隆下载程序包 1 git clone https://github.com

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案

WEB版一次选择多个文件进行批量上传(Plupload)的解决方案 转载自http://www.cnblogs.com/chillsrc/archive/2013/01/30/2883648.html 说明:Plupload支持多种浏览器,多种上传方式! 一般的WEB方式文件上传只能使用FileUpload控件进行一个文件一个文件的进行上传,就算是批量上传,也要把文件一个一个的添加到页面,无法如 windows程序一样,一次选择多个文件进行批量上传.这样在某些应用上就显得很不人性化,有时候客户希

从零開始开发Android版2048 (二)获取手势信息

今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了GestureDetector.这个类能够帮助我们获取一些常见的用户对屏幕的操作.比如单击.双击.按压.拖动等.详细的使用说明.大家能够查API也能够去百度,或者看我之前有一篇使用GestureDetector实现的小样例(http://blog.csdn.net/xiapinnong/article/det

四则运算WEB版(改进版)

结对伙伴:陶雨洁,李慧(me) 由于在4月14号,即上周五进行了web版四则运算的评判,所以未及时更新旧版本. (旧版本网址链接:http://www.cnblogs.com/xiaxiaoshu/p/6672332.html) 此版本即为更新过后的,界面也有些许改进的. 一.设计思想 二.源程序代码 三.运行结果截图 四.总结

Web版的各种聊天工具

直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,非常方便.在此将时汇总 ?????? 便于大家查找 ?????? 节约大家一点时间 此都是官方站点 ?????? 请大家放心使用: 1.先说我们最经常使用的QQ 在线聊天Web版地址: http://webqq.qq.com/ (刚建的 ?????? 现正在測试 ?????? 须要申请 ?????? 日前还不太稳定 ?????? 有待完好) 2.msn在线聊天Web版地

从零开始开发Android版2048 (五) 撤销的实现

本篇的内容是,在前一篇的基础上加入了撤销的功能.撤销其实就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和对应的数字记录下来,当然还有分数,把这些数据写入一个栈中,然后点击撤销操作的时候,将栈顶pop掉,读取下一个栈中的对象,并根据对象中存储的数据重新绘制界面. 下面是我用于存储每次界面情况的类,在这个类中保存了界面中主要的三个数据,空白格.数字格和当前的分数. package com.example.t2048; import java.util.