页面代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>1024 -- 小游戏</title>
<link rel="stylesheet" type="text/css" href="index.css">
</head>
<body>
<div class="main">
<div class="center">
<h1 class="title">2048</h1>
</div>
<div class="center">
<button class="button" type="button" onclick="GameRollback()">上一步</button>
<button class="button" type="button" onclick="BtnGameStart()">开始游戏</button>
</div>
<div class="game game-background">
<div class="game-group">
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
</div>
<div class="game-group">
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
</div>
<div class="game-group">
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
</div>
<div class="game-group">
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
<div class="game-group-block"></div>
</div>
</div>
<div class="game game-game">
<div class="game-group">
<div id="0-0" class="game-group-block"></div>
<div id="0-1" class="game-group-block"></div>
<div id="0-2" class="game-group-block"></div>
<div id="0-3" class="game-group-block"></div>
</div>
<div class="game-group">
<div id="1-0" class="game-group-block"></div>
<div id="1-1" class="game-group-block"></div>
<div id="1-2" class="game-group-block"></div>
<div id="1-3" class="game-group-block"></div>
</div>
<div class="game-group">
<div id="2-0" class="game-group-block"></div>
<div id="2-1" class="game-group-block"></div>
<div id="2-2" class="game-group-block"></div>
<div id="2-3" class="game-group-block"></div>
</div>
<div class="game-group">
<div id="3-0" class="game-group-block"></div>
<div id="3-1" class="game-group-block"></div>
<div id="3-2" class="game-group-block"></div>
<div id="3-3" class="game-group-block"></div>
</div>
</div>
<div class="game-over">
<p class="game-over-p">Game Over</p>
<div><button class="button" type="button" onclick="BtnGameStarts()">再来一局</button></div>
</div>
</div>
<script type="text/javascript" src="index.js"></script>
</body>
</html>
js 代码
var gameData = [['','','',''],['','','',''],['','','',''],['','','','']];
var gameDatas = []; // 运行执行顺序
var className = []; // 游戏类名
var key = null; // 当前键盘码
var gameXY = 1; // 游戏方向 1-上下 | 0-左右
var gameStatus = false; // 游戏状态
var gameOver = 2048 // 游戏结束值
var gameAnnal = []; // 游戏执行记录
var blockClass = ' game-group-block game_'; // 游戏方块样式
var block = ' game-group-block'; // 方块样式
// 准备
function Ready(){
let style = document.createElement('style');
style.type = 'text/css';
let gameStyle = {
game_2:{'color':'#776e65;','font-size':'55px;','background-color':'#eee4da;'},
game_4:{'color':'#776e65;','font-size':'55px;','background-color':'#ede0c8;'},
game_8:{'color':'#f9f6f2;','font-size':'55px;','background-color':'#f2b179;'},
game_16:{'color':'#f9f6f2;','font-size':'55px;','background-color':'#f59563;'},
game_32:{'color':'#f9f6f2;','font-size':'55px;','background-color':'#f67c5f;'},
game_64:{'color':'#f9f6f2;','font-size':'55px;','background-color':'#f65e3b;'},
game_128:{'color':'#f9f6f2;','font-size':'45px;','background-color':'#edcf72;'},
game_256:{'color':'#f9f6f2;','font-size':'45px;','background-color':'#edcc61;'},
game_512:{'color':'#f9f6f2;','font-size':'45px;','background-color':'#eee4da;'},
game_1024:{'color':'#f9f6f2;','font-size':'35px;','background-color':'#edc53f;'},
game_2048:{'color':'#f9f6f2;','font-size':'35px;','background-color':'##edc22e;'}
};
for (let i in gameStyle) {
style.innerHTML += '.' + i + '{';
for (x in gameStyle[i]){
style.innerHTML += x + ':' + gameStyle[i][x];
}
style.innerHTML += '}';
}
document.getElementsByTagName('head')[0].appendChild(style);
}
// 游戏
/*
* n x - y 轴 1 | 0
* m 加 - 减 1 | -1
*/
function GameInit(n,m){
// 初始 执行顺序
gameDatas = [];
// 添加 记录块
gameAnnal.push([]);
gameXY = n;
Game(n,m);
}
// 游戏规则
function Game(n,m){
let x,y,s,p2,i = j = 4;
n ? (y = 3,s = x = m == 1 ? 0 : 3) : (x = 3,s = y = m == 1 ? 0 : 3);
let p = [x,y];
let game = Games();
while(i > 0){
while(j > 1){
let p3 = n ? (x += m,p2 = p[0] - x ,0) : (y += m,p2 = p[1] - y ,1);
(function(x,y){
if(gameData[x][y]){
if(!gameData[p[0]][p[1]]){
game([ x,y,gameData[x][y],p[0],p[1],gameData[p[0]][p[1]], p2 ]);
}else if(gameData[p[0]][p[1]] == gameData[x][y]){
game([ x,y,gameData[x][y],p[0],p[1],gameData[p[0]][p[1]], p2 ],2);
GameClearance(gameData[p[0]][p[1]]);
p[p3] += m;
}else if(Math.abs(p2) > 1){
p[p3] += m;
game([ x,y,gameData[x][y],p[0],p[1],gameData[p[0]][p[1]], p2 ]);
}else{
p[p3] += m;
}
}
})(x,y);
j--;
}
n ? (y--,x = s) : (x--,y = s);
p = [x,y];
i--;
j = 4;
}
GameStarts()();
}
// 游戏数据 -- 修改
// 游戏记录保存
function Games(){
return function(arr,code = 1){
let displyAnimation = DisplyAnimation();
gameDatas.push(arr);
gameAnnal[gameAnnal.length - 1].push(arr);
gameData[arr[3]][arr[4]] = arr[2] * code;
gameData[arr[0]][arr[1]] = '';
displyAnimation(arr[0],arr[1]);
displyAnimation(arr[3],arr[4],arr[2] * code);
}
}
// 添加-清除 类名
/*
* x x坐标
* y y坐标
* n x-y坐标
*/
var DisplyAnimation = function (){
return function(x,y,n = null){
let obj = findDiv()(x,y);
obj.className = n ? blockClass + n : block;
obj.innerHTML = n;
}
}
// 游戏数据执行记录 -- 用于后退
/*
* x 原x坐标
* y 原y坐标
* n 原 x-y 坐标的值
* x1 执行后的x的坐标
* y1 执行后的y的坐标
* n2 执行后的 x1-y1 坐标的值
*/
function GameAnnal(arr){
gameStatus = false;
gameAnnal[gameAnnal.length - 1].push(arr);
}
// 游戏回退
function GameRollback(){
if(gameAnnal.length){
let arr = gameAnnal.pop();
let displyAnimation = DisplyAnimation();
for(let i = arr.length - 1; i >= 0; i--){
if(arr[i].length > 3){
displyAnimation(arr[i][0],arr[i][1], arr[i][2]);
gameData[arr[i][0]][arr[i][1]] = arr[i][2];
displyAnimation(arr[i][3],arr[i][4],arr[i][5]);
gameData[arr[i][3]][arr[i][4]] = arr[i][5];
}else{
displyAnimation(arr[i][0],arr[i][1]);
gameData[arr[i][0]][arr[i][1]] = '';
}
}
}
}
// 游戏通过判断
/*
* e 当前最高数值
*/
function GameClearance(e){
if(e == gameOver){
// 游戏通关
gameStatus = true;
//console.log('游戏通关');
document.getElementsByClassName("game-over")[0].style.display = "block";
document.getElementsByClassName("game-over-p")[0].innerHTML = "过关成功!";
}
}
// 游戏运行判断 --
/*
* k 当前键盘码 上-下-左-右 | w-s-a-d
*/
function GameKeyTest(k){
if( gameStatus ){
document.getElementsByClassName("game-over")[0].style.display = "block";
return false;
}
key = k;
return true;
}
// 测试是否游戏 已经不能进行下去,结束了
/*
* x x坐标
* y y坐标
*/
function GameTest(x = 0,y = 0){
let status = true;
function test(x,y){
let list = [];
if(x != 0){
list.push([x-1,y]);
}
if(x != 3){
list.push([x+1,y]);
}
if(y != 0){
list.push([x,y-1]);
}
if(y != 3){
list.push([x,y+1]);
}
for(let i = 0; i < list.length; i++){
if(gameData[list[i][0]][list[i][1]] == gameData[x][y]){
return false;
}
}
return true;
}
//先执行一次 当前坐标周围值是否一样
if(status = test(x,y)){
for(let i = 0; i < gameData.length; i++){
for(let j = 0; j < gameData[i].length; j++){
if(!test(i,j)){
return false;
}
}
}
if(status){
gameStatus = true;
document.getElementsByClassName("game-over")[0].style.display = "block";
console.log('game over');
}
}
}
// 随机
/*
* m 最小值
* n 最大值
*/
function Random(m,n){
return Math.floor(Math.random()*(m - n) + n);
}
// 定位
/*
* return dom对象
*/
var findDiv = function (){
return function(x,y){
try{
let obj = document.getElementById(x + '-' + y);
// //console.log(obj);
return obj;
}
catch(err){
//console.log(err);
//console.log(x,y);
}
}
}
// 方块随机出现 --
var GameStarts = function (){
return function(){
let random,data = [];
for(let i = 0; i < gameData.length; i++){
for(let j = 0; j < gameData[i].length; j++){
if(!gameData[i][j]){
data.push([i,j]);
}
}
}
if(data.length != 0){
random = Random(0,data.length);
DisplyAnimation()(data[random][0],data[random][1],2);
gameData[data[random][0]][data[random][1]] = 2;
renewCode = true;
GameAnnal([data[random][0],data[random][1],2]);
}
//console.log('x--y -- '+data[random][0],data[random][1]);
// 判断游戏是否 game over
if(data.length == 1){
GameTest(data[random][0],data[random][1]);
}else if(data.length == 0){
GameTest();
}
}
}
// 游戏开始
function GameStart(){
let n = 2; //初始个数;
let i = 0;
let displyAnimation = DisplyAnimation();
while(i < n){
let gameX = Random(0,4);
let gameY = Random(0,4);
displyAnimation(gameX ,gameY,2);
gameData[gameX][gameY] = 2;
i++;
}
}
// 按钮 -- 游戏重新开始
function BtnGameStart(){
gameData = [['','','',''],['','','',''],['','','',''],['','','','']];
gameAnnal = [];
let arr = document.getElementsByClassName("game-game")[0].getElementsByClassName("game-group-block");
for(v in arr){
arr[v].innerHTML = '';
arr[v].className = block;
}
GameStart();
}
// 按钮 -- 再来一局
function BtnGameStarts(){
document.getElementsByClassName("game-over")[0].style.display = "none";
document.getElementsByClassName("game-over-p")[0].innerHTML = "Game Over";
BtnGameStart();
}
Ready(); // 样式准备
GameStart(); // 游戏开始
document.addEventListener("keydown", function (event) {
if(GameKeyTest(event.keyCode)){
switch(event.keyCode){
case 37:
case 65:
//console.log('left');
GameInit(0,1);
break;
case 38:
case 87:
//console.log('top');
GameInit(1,1);
break;
case 39:
case 68:
//console.log('right');
GameInit(0,-1);
break;
case 40:
case 83:
//console.log('bottom');
GameInit(1,-1);
break;
default:
break;
}
}
});