javascript实现2048游戏示例


Posted in Javascript onMay 04, 2014

原生javascript代码写的2048游戏。建议在谷歌浏览器下跑。

2048.html

<!DOCTYPE>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>2048</title>
<link rel="stylesheet" type="text/css" href="css/2048.css" />
<!-- <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script> -->
<script type="text/javascript" src="js/2048.js"></script>
</head>
<body>
 <div id="div2048">
        <a id="start">tap to start :-)</a>
    </div>
</body>
</html>

2048.css

@charset "utf-8";
#div2048
{
    width: 500px;
    height: 500px;
    background-color: #b8af9e;
    margin: 0 auto;
    position: relative;
}
#start
{
    width: 500px;
    height: 500px;
    line-height: 500px;
    display: block;
    text-align: center;
    font-size: 30px;
    background: #f2b179;
    color: #FFFFFF;
}
#div2048 div.tile
{
    margin: 20px 0px 0px 20px;
    width: 100px;
    height: 40px;
    padding: 30px 0;
    font-size: 40px;
    line-height: 40px;
    text-align: center;
    float: left;
}
#div2048 div.tile0{
 background: #ccc0b2;
}
#div2048 div.tile2
{
    color: #7c736a;
    background: #eee4da;
}
#div2048 div.tile4
{
    color: #7c736a;
    background: #ece0c8;
}
#div2048 div.tile8
{
    color: #fff7eb;
    background: #f2b179;
}
#div2048 div.tile16
{
    color:#fff7eb;
    background:#f59563;
}
#div2048 div.tile32
{
    color:#fff7eb;
    background:#f57c5f;
}
#div2048 div.tile64
{
    color:#fff7eb;
    background:#f65d3b;
}
#div2048 div.tile128
{
    color:#fff7eb;
    background:#edce71;
}
#div2048 div.tile256
{
    color:#fff7eb;
    background:#edcc61;
}
#div2048 div.tile512
{
    color:#fff7eb;
    background:#ecc850;
}
#div2048 div.tile1024
{
    color:#fff7eb;
    background:#edc53f;
}
#div2048 div.tile2048
{
    color:#fff7eb;
    background:#eec22e;
}

2048.js

function game2048(container)
{
 this.container = container;
 this.tiles = new Array(16);
}
game2048.prototype = {
 init: function(){
  for(var i = 0, len = this.tiles.length; i < len; i++){
   var tile = this.newTile(0);
   tile.setAttribute('index', i);
   this.container.appendChild(tile);
   this.tiles[i] = tile;
  }
  this.randomTile();
  this.randomTile();
 },
 newTile: function(val){
  var tile = document.createElement('div');
  this.setTileVal(tile, val)
  return tile;
 },
 setTileVal: function(tile, val){
  tile.className = 'tile tile' + val;
  tile.setAttribute('val', val);
  tile.innerHTML = val > 0 ? val : '';
 },
 randomTile: function(){
  var zeroTiles = [];
  for(var i = 0, len = this.tiles.length; i < len; i++){
   if(this.tiles[i].getAttribute('val') == 0){
    zeroTiles.push(this.tiles[i]);
   }
  }
  var rTile = zeroTiles[Math.floor(Math.random() * zeroTiles.length)];
  this.setTileVal(rTile, Math.random() < 0.8 ? 2 : 4);
 },
 move:function(direction){
  var j;
  switch(direction){
   case 'W':
    for(var i = 4, len = this.tiles.length; i < len; i++){
     j = i;
     while(j >= 4){
      this.merge(this.tiles[j - 4], this.tiles[j]);
      j -= 4;
     }
    }
    break;
   case 'S':
    for(var i = 11; i >= 0; i--){
     j = i;
     while(j <= 11){
      this.merge(this.tiles[j + 4], this.tiles[j]);
      j += 4;
     }
    }
    break;
   case 'A':
    for(var i = 1, len = this.tiles.length; i < len; i++){
     j = i;
     while(j % 4 != 0){
      this.merge(this.tiles[j - 1], this.tiles[j]);
      j -= 1;
     }
    }
    break;
   case 'D':
    for(var i = 14; i >= 0; i--){
     j = i;
     while(j % 4 != 3){
      this.merge(this.tiles[j + 1], this.tiles[j]);
      j += 1;
     }
    }
    break;
  }
  this.randomTile();
 },
 merge: function(prevTile, currTile){
  var prevVal = prevTile.getAttribute('val');
  var currVal = currTile.getAttribute('val');
  if(currVal != 0){
   if(prevVal == 0){
    this.setTileVal(prevTile, currVal);
    this.setTileVal(currTile, 0);
   }
   else if(prevVal == currVal){
    this.setTileVal(prevTile, prevVal * 2);
    this.setTileVal(currTile, 0);
   }
  }
 },
 equal: function(tile1, tile2){
  return tile1.getAttribute('val') == tile2.getAttribute('val');
 },
 max: function(){
  for(var i = 0, len = this.tiles.length; i < len; i++){
   if(this.tiles[i].getAttribute('val') == 2048){
    return true;
   }
  }
 },
 over: function(){
  for(var i = 0, len = this.tiles.length; i < len; i++){
   if(this.tiles[i].getAttribute('val') == 0){
    return false;
   }
   if(i % 4 != 3){
    if(this.equal(this.tiles[i], this.tiles[i + 1])){
     return false;
    }
   }
   if(i < 12){
    if(this.equal(this.tiles[i], this.tiles[i + 4])){
     return false;
    }
   }
  }
  return true;
 },
 clean: function(){
  for(var i = 0, len = this.tiles.length; i < len; i++){
   this.container.removeChild(this.tiles[i]);
  }
  this.tiles = new Array(16);
 }
}
var game, startBtn;
window.onload = function(){
 var container = document.getElementById('div2048');
 startBtn = document.getElementById('start');
 startBtn.onclick = function(){
  this.style.display = 'none';
  game = game || new game2048(container);
  game.init();
 }
}
window.onkeydown = function(e){
 var keynum, keychar;
 if(window.event){  // IE
  keynum = e.keyCode;
 }
 else if(e.which){  // Netscape/Firefox/Opera
  keynum = e.which;
 }
 keychar = String.fromCharCode(keynum);
 if(['W', 'S', 'A', 'D'].indexOf(keychar) > -1){
  if(game.over()){
   game.clean();
   startBtn.style.display = 'block';
   startBtn.innerHTML = 'game over, replay?';
   return;
  }
  game.move(keychar);
 }
}
Javascript 相关文章推荐
js 操作select和option常用代码整理
Dec 13 Javascript
jQuery中通过ajax的get()函数读取页面的方法
Feb 29 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
简单实现js选项卡切换效果
Feb 09 Javascript
Vue.js在使用中的一些注意知识点
Apr 29 Javascript
如何用input标签和jquery实现多图片的上传和回显功能
May 16 jQuery
puppeteer实现html截图的示例代码
Jan 10 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
vue实现二级导航栏效果
Oct 19 Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 Javascript
解决vue-cli输入命令vue ui没效果的问题
Nov 17 Javascript
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
Extjs 4.x 得到form CheckBox 复选框的值
May 04 #Javascript
jquery中的ajax方法怎样通过JSONP进行远程调用
May 04 #Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
May 04 #Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
May 04 #Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 #Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
May 04 #Javascript
JavaScript获取图片的原始尺寸以宽度为例
May 04 #Javascript
You might like
php AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
THINKPHP项目开发中的日志记录实例分析
2014/12/01 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
php导出生成word的方法
2015/12/25 PHP
PHP简单处理表单输入的特殊字符的方法
2016/02/03 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
PHP attributes()函数讲解
2019/02/03 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
纯js实现html转pdf的简单实例(推荐)
2017/02/16 Javascript
整理关于Bootstrap警示框的慕课笔记
2017/03/29 Javascript
JavaScript实现的冒泡排序法及统计相邻数交换次数示例
2017/04/26 Javascript
JavaScript运动框架 多值运动(四)
2017/05/18 Javascript
详解在React中跨组件分发状态的三种方法
2018/08/09 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
VUE+node(express)实现前后端分离
2019/10/13 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
Vue两种组件类型:递归组件和动态组件的用法
2020/08/06 Javascript
vue2.0 watch里面的 deep和immediate用法说明
2020/10/30 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
在Python中使用pngquant压缩png图片的教程
2015/04/09 Python
Python编程中的文件操作攻略
2015/10/16 Python
Python中pygame安装方法图文详解
2015/11/11 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
在python3中实现更新界面
2020/02/21 Python
django使用多个数据库的方法实例
2021/03/04 Python
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
小学教师的个人自我鉴定
2013/10/26 职场文书
护理专业学生职业生涯规划范文
2014/03/11 职场文书
校园文明倡议书
2014/05/16 职场文书
老公保证书怎么写
2015/02/26 职场文书
指导老师鉴定意见
2015/06/05 职场文书
白银帝国观后感
2015/06/17 职场文书
人工智能深度学习OpenAI baselines的使用方法
2022/05/20 Python