javascript 2048 无动画效果

0928
昨日写该JavaScript时,发现 用 “document.getElementById("")”取table的值 失败, 取到的结果一直为null。
上网百度了一会儿,发现是由于在HTML加载之前,先加载了JS文件造成的。
解决方案往往有两种,一种是使用window.onload;
另外一种是将<script></script>放在HTML页面底端

0930:

发现bug:
此时往右边移动应该不能产生随机数,但是由于 array[3][3] == array[3][1]导致出现bug,
依然产生了随机数。

解决方法:再设置一个while循环 用来找到下一个非零元素,做好标记 并判断是否 与当前元素相等;

game.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/TZFE/game.css" >

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>2048</title>
</head>
<body>
<div class="main">
<h1>2048</h1>
<div ><input type="button" id="start" value="NewGame" οnclick="game.start()"></div>
<div align="center" class="">Score:<span id="score">0</span> </div>
<table id="panel"><!-- style="height: 660px;width: 660px;background-color: #bba2a0" -->
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr >
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr >
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr >
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</div>
</body>
<script type="text/javascript" src="game.js"></script>
</html>


game.js
/**
* 思路:
* 用户 点击 开始按钮
* 随机产生1到2个 2或4
* 用户 使用 键盘或鼠标 控制 移动方向
* 数组 移动或相加
* 出口条件:无空格且不能移动
*/



/*
* 0929 关于Array设置为全局变量或私有变量
*/
/*
* 0929 关于游戏总是能产生随机数, 应当对调用Action方法添加 if条件 以及关于 游戏结束的出口条件
*/
/*
* 0929 加分功能
*/
/*
* 0930
*/


var game = {
//this 指的是 类 game
initArray: function(){
var arrayGame = new Array();
for(var i=0 ; i<4 ; i++){
arrayGame[i] = new Array();
}
for(var i=0 ; i<4 ;i++){
for(var j=0 ; j<4 ;j++){
arrayGame[i][j] = 0;
}
}
return arrayGame;
},
init: function(){
var t=this;
t.startTag = true ;
t.array = t.initArray();//将数组 声明 为全局变量
var pos ;
pos = t.makeNullPosititon();//获取 随机产生的位置
t.setPosition(pos);
pos = t.makeNullPosititon();//获取 随机产生的位置
t.setPosition(pos);
},
//开始
start: function(){
var t = this;
var table = document.getElementById("panel");
if(t.startTag = true){
t.printTable(table);
startTag = false;
}
t.moveDirection();
},
makeRandom: function(){
var r=Math.round(Math.random()*2)+2;
if(r == 3){
r = 2;
}
return r;
},
//随机空白位置的产生:遍历数据数组array,取得所有位置为空的集合pos,array中数据为0的即对应位置为空,可产生随机数;在pos中产生随机位置。
makeNullPosititon: function(){
var array=this.array;
var pos;
var count=0;
for(var i=0; i<4 ; i++){
for(var j=0; j<4 ;j++){
if(array[i][j] == 0){
count++;
}
}
}
pos = Math.floor(Math.random()*count);//于空位置数组中产生随机数
return pos;
},
setPosition: function(pos){
var t = this;
var array = t.array;
var random = t.makeRandom(); //所产生的随机数
var count = 0;
for(var i=0;i<4;i++){
for(var j=0 ; j<4 ;j++){
if(array[i][j] == 0){
if(count == pos){
array[i][j]=random;
}
count++;
}
}
}
},
checkSameNum: function(){
var array = this.array;
for(var i=0; i<4 ;i++){
for(var j=0 ; j<3 ;j++){
if(array[i][j] == array[i][j+1]){
return true;
}
}
}
for(var j=0;j<4;j++){
for(var i=0 ; i<3 ; i++){
if(array[i][j] == array[i+1][j]){
return true;
}
}
}
return false;
},
//检测空位置
checkNullPosition: function(){
var array = this.array;
for(var i=0; i<4 ; i++){
for(var j=0; j<4 ; j++){
if(array[i][j]==0 )
return true;
}
}
return false;
},
printTable: function(table){
var array = this.array;
for(var i=0 ;i<4;i++){
for(var j=0;j<4;j++){
if(array[i][j] != 0){
switch(array[i][j]){
case 2:
table . rows[i].cells[j].setAttribute('style',
'background-color:#e6e4cd !important;color: #776e65 !important');
break;
case 4:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f0e4cd !important;color:#776e65 !important');
break;
case 8:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f2b179 !important;color:#FFFFFF !important');
break;
case 16:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f99464 !important;color:#FFFFFF !important');
break;
case 32:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f67c5f !important;color:#FFFFFF !important');
break;
case 64:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f65e3b !important;color:#FFFFFF !important');
break;
case 128:
table . rows[i].cells[j].setAttribute('style',
'background-color:#F7FE2E !important;color:#FFFFFF !important');
break;
case 256:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f1c232 !important;color:#FFFFFF !important');
break;
case 512:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f1c232 !important;color:#FFFFFF !important');
break;
case 1024:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f1c232 !important;color:#FFFFFF !important');
break;
default:
table . rows[i].cells[j].setAttribute('style',
'background-color:#f1c232 !important;color:#FFFFFF !important');
break;
}
//table . rows[x].cells[y].setAttribute('style','background-color: #ece0c9 !important');
table.rows[i].cells[j].innerHTML = array[i][j];
}else{
table . rows[i].cells[j].setAttribute('style',
'background-color:#ccc0b4 !impotant');
table.rows[i].cells[j].innerHTML = " ";
}
/*table.rows[i].cells[j].innerHTML = array[i][j];*/
}
}
},
moveDirection: function(){
/* 为什么调用这个操作还调用 它所在的方法*/
/* 而且重新调用这个方法返回的居然还是原来的变量*/
/* 该方法并没有修改参数本身而是因为原来table上的值没有清空*/
var t=this;
var table = document.getElementById("panel");
document.onkeydown = function(event){
var e = event || window.event || arguments.callee.caller.arguments[0];
switch(e && e.keyCode){
case 87:
if(t.checkTop()){
t.topAction();
var pos = t.makeNullPosititon();
t.setPosition(pos);
t.printTable(table);
}else{
alert("不能移动");
}
break;//w
case 83:
if(t.checkBottom()){
t.bottomAction();
var pos = t.makeNullPosititon();
t.setPosition(pos);
t.printTable(table);
}else{
alert("不能移动");
}
break;
case 65:
if(t.checkLeft()){
t.leftAction();
var pos = t.makeNullPosititon();
t.setPosition(pos);
t.printTable(table);
}else{
alert("不能移动");
}
break;//a
case 68:
if(t.checkRight()){
t.rightAction();
var pos = t.makeNullPosititon();
t.setPosition(pos);
t.printTable(table);
}else{
alert("不能移动");
}
break;//d
}
t.calculateScore();
if( !t.checkNullPosition() && !t.checkSameNum()){
alert("you lost");
}
};
},
topAction: function(){
var array = this.array;
for(var j=0 ; j <4 ;j++){//列循环
for(var i=0 ; i<3 ;i++){
if(array[i][j] != 0){
var tag = i+1;
while(array[tag++][j]==0 && tag<4) {};//往下排除 0 元素
if(array[tag-1][j] == array[i][j]){
/*alert("tag:"+tag+" i:"+i);*/
array[i][j] = 2*array[i][j];
array[tag-1][j] = 0;
}
}
}
}
for(var j=0; j<4 ;j++){
for(var i=0 ; i<4 ;i++){
var tag = i+1;
while(array[i][j] == 0 && tag<4){
array[i][j] = array[tag][j];
array[tag][j] = 0;
//alert("array["+tag+"]"+"["+j+"]"+"="+array[tag][j]);
tag++;
}
}
}
},
bottomAction: function(){
var array = this.array;
for(var j=0 ; j <4 ;j++){//列循环
for(var i=3 ; i>0 ;i--){
if(array[i][j] != 0){
var tag = i-1;
while(array[tag--][j]==0 && tag>=0) {};//往下排除 0 元素
if(array[tag+1][j] == array[i][j]){
array[i][j] = 2*array[i][j];
array[tag+1][j] = 0;
}
}
}
}
for(var j=0; j<4 ;j++){
for(var i=3 ; i>=0 ;i--){
var tag = i-1;
while(array[i][j] == 0 && tag>=0){
array[i][j] = array[tag][j];
array[tag][j] = 0;
//alert("array["+tag+"]"+"["+j+"]"+"="+array[tag][j]);
tag--;
}
}
}
},
leftAction : function(){
var array = this.array;
for(var i=0 ; i <4 ;i++){//列循环
for(var j=0 ; j<3 ;j++){
if(array[i][j] != 0){
var tag = j+1;
while(array[i][tag++]==0 && tag<4) {};//往下排除 0 元素
if(array[i][tag-1] == array[i][j]){
/*alert("tag:"+tag+" i:"+i);*/
array[i][j] = 2*array[i][j];
array[i][tag-1] = 0;
}
}
}
}
for(var i=0; i<4 ;i++){
for(var j=0 ; j<4 ;j++){
var tag = j+1;
while(array[i][j] == 0 && tag<4){
array[i][j] = array[i][tag];
array[i][tag] = 0;
//alert("array["+tag+"]"+"["+j+"]"+"="+array[tag][j]);
tag++;
}
}
}
},
rightAction: function(){

var array = this.array;
for(var i=0 ; i <4 ;i++){//列循环
for(var j=3 ; j>0 ;j--){
if(array[i][j] != 0){
var tag = j-1;
while(array[i][tag--]==0 && tag>=0) {};//往下排除 0 元素
if(array[i][tag+1] == array[i][j]){
array[i][j] = 2*array[i][j];
array[i][tag+1] = 0;
}
}
}
}
for(var i=0; i<4 ;i++){
for(var j=3 ; j>=0 ;j--){
var tag = j-1;
while(array[i][j] == 0 && tag>=0){
array[i][j] = array[i][tag];
array[i][tag] = 0;
//alert("array["+tag+"]"+"["+j+"]"+"="+array[tag][j]);
tag--;
}
}
}
},

checkTop: function(){
var array = this .array;
for(var j=0; j<4 ;j++){
for(var i=3 ; i>0 ; i--){
if(array[i][j] != 0){
tag = i-1;
while(tag >= 0){
if(array[tag][j] == 0 ){
return true;
}
/*if(array[tag][j] == array[i][j]){
return true;
}*/
tag--;
}
tag= i-1;
while(tag >=0 && array[tag][j] == 0){
//用于寻找下一个非0数字
tag--;
}
if(array[tag][j] == array[i][j]){
return true;
}
}
}
}
return false;
},
checkBottom : function(){
var array = this .array;
for(var j=0; j<4 ;j++){
for(var i=0 ; i<3 ; i++){
if(array[i][j] != 0){
tag = i+1;
while(tag < 4){
if(array[tag][j] == 0){
return true;
}
/* if(array[tag][j] == array[i][j]){
return true;
}*/
tag++;
}
//由于 相加判断只允许判断 一次 所以 必须写两个循环检查
/**
* 原本这个方法应当会出现数组越界的情况,当时由于出现数组越界的情况时,在移动检查中
* 返回了true,所以 可以 不需要考虑这种情况;
*/
tag=i+1;
while(tag <4 && array[tag][j] == 0){
//用于寻找下一个非0数字
tag++;
}
if(array[tag][j] == array[i][j]){
//alert("竟然可以?"+"i:"+i+" j:"+j+" tag-1:"+(tag-1));
return true;
}
}
}
}
return false;
},

checkLeft: function(){
var array = this.array;
for(var i=0 ; i<4 ;i++){
for(var j=3 ; j>0 ; j--){
if(array[i][j] != 0){
var tag = j-1;
while(tag >= 0){
if(array[i][tag] == 0 || array[i][tag] == array[i][j]){
return true;
}
tag--;
}
tag= j-1;
while(tag >=0 && array[i][tag] == 0){
//用于寻找下一个非0数字
tag--;
}
if(array[i][tag] == array[i][j]){
return true;
}
}
}
}
return false;
},
checkRight : function(){
var array = this.array;
for(var i=0 ; i<4 ;i++){
for(var j=0 ; j<3 ; j++){
if(array[i][j] != 0){
var tag = j+1;
while(tag < 4){
if(array[i][tag] == 0 || array[i][tag] == array[i][j]){
return true;
}
tag++;
}
tag= j+1;
while(tag <4 && array[i][tag] == 0){
//用于寻找下一个非0数字
tag++;
}
if(array[i][tag] == array[i][j]){
return true;
}
}
}
}
return false;
},

calculateScore: function(){
var scoreSum = 0;
var score = document.getElementById("score");
var array = this.array;
for(var i=0 ; i<4 ;i++){
for(var j=0 ; j<4 ;j++){
scoreSum=scoreSum + array[i][j];
}
}
score.innerHTML = scoreSum;
}
}

game.init();

game.css
@CHARSET "UTF-8";

.main {
margin:0 auto;
}

.main div{
margin:5px auto;
width:160px;
font-weight:400;
font-size: 20px;
}

.main table{
margin:0 auto;
width: 800px;
height: 800px;
background-color: #bbada0;
border-radius:5px;
}

.main tr{
text-align: center;
}

.main td{
font-size:60px;
width: 150px;
height: 150px;
background-color: #ccc0b4;
border: 5px solid #bbada0;
border-radius:10px;
}

#start {
margin:5px auto;
width: 160px;
height: 55px;
font-size: 20px;
color: #ffffff;
background-color: #917a66;
border: 0;
border-radius:10px;
}

.main h1{
text-align: center;
font-weight:900;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值