纯js+css 2048 小游戏

页面代码

<!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;
		}
	}
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里提供一个基于 HTML、CSS 和 JavaScript 的小游戏,是一个打地鼠的游戏: HTML 部分: ```html <!DOCTYPE html> <html> <head> <title>打地鼠游戏</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1>打地鼠游戏</h1> <div class="game-box"> <div class="hole"></div> <div class="hole"></div> <div class="hole"></div> <div class="hole"></div> <div class="hole"></div> <div class="hole"></div> </div> <button onclick="startGame()">开始游戏</button> <script src="script.js"></script> </body> </html> ``` CSS 部分: ```css .game-box { display: flex; flex-wrap: wrap; width: 300px; margin: 20px auto; } .hole { width: 80px; height: 80px; background-image: url('mole.png'); background-size: contain; background-repeat: no-repeat; background-position: center; margin: 10px; cursor: pointer; opacity: 0; transition: opacity 0.3s; } .hole.up { opacity: 1; } ``` JavaScript 部分: ```javascript var holes = document.querySelectorAll('.hole'); var score = 0; var isPlaying = false; function startGame() { if (isPlaying) { return; } isPlaying = true; score = 0; // 清除所有地鼠的状态 holes.forEach(hole => hole.classList.remove('up')); // 开始游戏 playGame(); } function playGame() { var time = Math.round(Math.random() * (1500 - 500) + 500); var hole = holes[Math.floor(Math.random() * holes.length)]; hole.classList.add('up'); setTimeout(function() { hole.classList.remove('up'); if (isPlaying) { playGame(); } }, time); } function whack(e) { if (!e.isTrusted) { return; } score++; this.classList.remove('up'); // 更新分数 document.getElementById('score').textContent = score; } holes.forEach(hole => hole.addEventListener('click', whack)); ``` 这个游戏的原理是随机在 6 个洞里面弹出地鼠,玩家需要在规定时间内点击地鼠,每次点击得分加 1 分。游戏结束后可以重新开始。其中,`mole.png` 是地鼠的图片。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值