样式部分
* {
margin: 0px;
padding: 0px;
}
.case {
width: 450px;
height: 600px;
margin: 20px auto;
/*overflow: hidden;*/
position: relative;
/*border: 1px solid red;*/
}
.above_box {
width: 450px;
height: 150px;
margin: 0px auto;
/*border: 1px solid red;*/
}
.logo {
width: 350px;
height: 150px;
float: left;
}
.logo_num {
color: #766f67;
font-size: 60px;
font-family: '微软雅黑';
font-weight: bold;
}
.logo_font {
color: #9B988F;
float: left;
font-size: 16px;
}
.above_box button {
width: 100px;
height: 50px;
color: white;
font-size: 15px;
background-color: #8b7c65;
/*border-radius: 10px: */
border: none;
margin-top: 10px;
float: right;
}
.countScore {
width: 100px;
height: 70px;
background-color: #8b7c65;
color: white;
float: right;
margin-top: 10px;
}
.countScore p {
/*float: right;
width: 100px;
height: 40px;
background-color: #8b7c65;
color: white;*/
/*text-align: center; */
line-height: 30px;
text-align: center;
}
.countScore span {
display: block;
line-height: 30px;
text-align: center;
font-weight: bold;
font-size: 20px;
}
.main_box {
width: 450px;
height: 450px;
margin: 0px auto;
/*border: 1px solid red;*/
background-color: #bbada0;
border-radius: 10px;
/* position: absolute; */
}
.main_box2 {
width: 450px;
height: 450px;
margin: 0px auto;
border-radius: 10px;
background-color: rgba(0, 0, 0, 0.4);
position: absolute;
font-size: 50px;
color: white;
text-align: center;
line-height: 450px;
/*z-index: 1;*/
}
.main_box2 button {
width: 101px;
height: 50px;
color: white;
font-size: 20px;
background-color: rgba(0, 0, 0, 0);
border: none;
position: absolute;
top: 260px;
left: 165px;
}
.game {
z-index: 1;
}
.min_box {
width: 100px;
height: 100px;
background-color: #ccc0b2;
float: left;
margin: 10px 0 0 10px;
border-radius: 5px;
font-size: 35px;
line-height: 100px;
text-align: center;
color: #796f65;
}
/**/
.n2 {
background-color: #aae3da
}
.n4 {
background-color: #ede0c8
}
.n8 {
background-color: #f2b179
}
.n16 {
background-color: #f59563
}
.n32 {
background-color: #f67c5f
}
.n64 {
background-color: #f65e3b
}
.n128 {
background-color: #edcf72
}
.n256 {
background-color: #edcc61
}
.n512 {
background-color: #9c0
}
.n1024 {
background-color: #33b5e5
}
.n2048 {
background-color: #09c9c0
}
.n4096 {
background-color: #a6c
}
.n8192 {
background-color: #93c
}
.n2,
.n4 {
color: #776e65
}
.n1024,
.n2048,
.n4096,
.n8192 {
font-size: 40px
}
结构部分
<body>
<div class="main_box">
<div class="min_box" id="number00"></div>
<div class="min_box" id="number01"></div>
<div class="min_box" id="number02"></div>
<div class="min_box" id="number03"></div>
<div class="min_box" id="number10"></div>
<div class="min_box" id="number11"></div>
<div class="min_box" id="number12"></div>
<div class="min_box" id="number13"></div>
<div class="min_box" id="number20"></div>
<div class="min_box" id="number21"></div>
<div class="min_box" id="number22"></div>
<div class="min_box" id="number23"></div>
<div class="min_box" id="number30"></div>
<div class="min_box" id="number31"></div>
<div class="min_box" id="number32"></div>
<div class="min_box" id="number33"></div>
</div>
<script src="2048-2.js"></script>
</body>
功能部分
左移
leftMove() {
this.num = this.panduan();
if(this.num==16) {
this.moverl();
}
if(this.num<16||this.canmoverl==true){
for (var r = 0; r < this.RN; r++) {
for (var c = 0; c < this.RC; c++) {
//当前有值
if (this.data[r][c]) {
for (var i = c + 1; i < this.RC; i++) {
//当前位置后的c+1 值不为0时
if (this.data[r][i]) {
//后面有值
if (this.data[r][c] === this.data[r][i]) {
this.data[r][c] *= 2;
//把后面的值清空
this.data[r][i] = 0;
break;
} else {
break;
}
}
}
} else {
//判断其后是否有值
for (var j = c + 1; j < this.RC; j++) {
if (this.data[r][j]) {
this.data[r][c] = this.data[r][j];
this.data[r][j] = 0;
c--;
break;
}
}
}
}
}
this.getRandom();
this.updateView();
}else{
}
}
右移
rightMove() {
this.num = this.panduan();
if(this.num==16) {
this.moverl();
}
if(this.num<16||this.canmoverl==true){
for (var r = 0; r < this.RN; r++) {
for (var c = this.RC - 1; c >= 0; c--) {
//当前有值
if (this.data[r][c]) {
for (var i = c - 1; i >= 0; i--) {
//当前位置前的c-1 值不为0时
if (this.data[r][i]) {
//后面有值
if (this.data[r][c] === this.data[r][i]) {
this.data[r][c] *= 2;
//把后面的值清空
this.data[r][i] = 0;
break;
} else {
break;
}
}
}
} else {
//判断其后是否有值
for (var j = c - 1; j >= 0; j--) {
if (this.data[r][j]) {
this.data[r][c] = this.data[r][j]
this.data[r][j] = 0;
c++;
break;
}
}
}
}
}
this.getRandom();
this.updateView();
}else{
}
}
上移
topMove() {
this.num = this.panduan();
if(this.num==16) {
this.movetb();
}
if(this.num<16||this.canmovetb==true){
for (var c = 0; c < this.RC; c++) {
for (var r = 0; r < this.RN; r++) {
//当前位置有值
if (this.data[r][c]) {
for (var i = r + 1; i < this.RN; i++) {
//当期位置 r+1开始遍历为是否0
if (this.data[i][c]) {
//下面有值
if (this.data[i][c] === this.data[r][c]) {
this.data[r][c] *= 2;
// 把下面的值清空
this.data[i][c] = 0;
break;
} else {
break;
}
}
}
if(r==3){
break;
}
//当前位置没值
} else {
// 判断其下面是否有值
for (var j = r + 1; j < this.RN; j++) {
if (this.data[j][c]) {
this.data[r][c] = this.data[j][c];
this.data[j][c] = 0;
r--;
break;
}
}
}
}
}
this.getRandom();
this.updateView();
}else{
}
},
下移
bottomMove() {
this.num = this.panduan();
if(this.num==16) {
this.movetb();
}
if(this.num<16||this.canmovetb==true){
for (var c = this.RC-1; c >=0; c--) {
for (var r = this.RN-1; r >=0; r--) {
//当前位置有值
if (this.data[r][c]) {
for (var i = r - 1; i >=0; i--) {
//当期位置 r+1开始遍历为是否0
if (this.data[i][c]) {
//下面有值
if (this.data[i][c] === this.data[r][c]) {
this.data[r][c] *= 2;
// 把下面的值清空
this.data[i][c] = 0;
break;
} else {
break;
}
}
}
if(r==3){
break;
}
//当前位置没值
} else {
// 判断其下面是否有值
for (var j = r - 1; j >=0; j--) {
if (this.data[j][c]) {
this.data[r][c] = this.data[j][c];
this.data[j][c] = 0;
r++;
break;
}
}
if(j==3){
break;
}
}
}
}
this.getRandom();
this.updateView();
}else{
}
},
判断格子是否满格
panduan() {
var num=0;
for(var i = 0;i<this.RN;i++){
for(var j=0;j<this.RC;j++){
if(this.data[i][j]!=0){
num++
}
}
}
this.canmoverl =false;
this.canmovetb =false;
return num;
判断满格时是否可以移动
可否左右移动:
moverl() {
for(var i = 0;i<this.RN;i++){
for(var j=0;j<this.RC;j++){
if(this.data[i][j]==this.data[i][j+1]){
this.canmoverl =true;
break;
}
}
}
},
可否上下移动:
movetb() {
for(var i = 0;i<this.RN;i++){
for(var j=0;j<this.RC;j++){
if(this.data[j][i]==this.data[j+1][i]){
this.canmovetb =true;
break;
}
}
}
},
};
随机数生成函数
getRandom() {
var r, c;
while (true) {
r = parseInt(Math.random() * this.RN);
c = parseInt(Math.random() * this.RC);
if (this.data[r][c] != 0) {
}else {
this.data[r][c] = Math.random() < 0.5 ? 2 : 4;
break;
}
}
},
渲染视图函数
updateView() {
for (var r = 0; r < this.RN; r++) {
for (var c = 0; c < this.RC; c++) {
//this.data[r][c]
//将页面不为0的数据渲染到页面中
if (this.data[r][c]) {
document.getElementById("number" + r + c).innerHTML = this.data[r][c];
//给到对应的背景颜色
document.getElementById('number' + r + c).className = 'min_box n' + (this.data[r][c]);
} else {
// 当前位置值为0时清空背景颜色
document.getElementById('number' + r + c).innerHTML = "";
document.getElementById("number" + r + c).className = 'min_box';
}
}
}
},
初始状态函数
start() {
for (var i = 0; i < this.RN; i++) {
this.data[i] = [];
for (var j = 0; j < this.RC; j++) {
this.data[i][j] = 0;
}
}
this.getRandom();
this.getRandom();
this.updateView();
},
常量定义
RN: 4,
RC: 4,
data: [],
num:0,
canmoverl:false,
canmovetb:false,