我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于JS制作一个简易的2048游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于JS制作一个简易的2048游戏

效果图

实现代码

<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
		<title>2048</title>
		<style type="text/css">
			.basic{
				height:80px;
				width:80px;
				background-color:#DBDBDB;
				float:left;
				margin:2px;
			}
			.row{
				height:80px;
				clear:both;
			}
		</style>
	</head>
	
	<body>
		<div id="pool"></div>
		<div id="sample" class="basic" style='opacity: 0;'></div>
		<div>score:<span id='score' style="font-size:200%;font-weight:bold;"></span></div>
		
		<script type="text/javascript" >
			//对象内使用,要加this
			var container={
				rowNum:4,
				colNum:4,
				score:0,//靠弄个Cookie记录下游戏记录
				isMoved:false,//Block 有没有移动过
				content:[],//{x:col,y:row,v:value}
				colour:['#DBDBDB','#56A36C','#EFCEE8',
						'#81C2D6','#8192D6','#D9B3E6',
						'#DCF7A1','#83FCD8','#E8F2FF',
						'#91C6FF','#B8F788','#58D2E8',
						'#F2B6B6','#E8ED51','#FFE3FB',
						'#E8FF8C','#FFDEC9','#F5A433',
						'#E6109B','#96C4E6','#E560CD'],
				colourObject:{},
				//初始化 背景
				loadBackground:function(){
					var pool = document.getElementById("pool");
					var sample = document.getElementById("sample")
					var margin = 2;
					var dotWidth = parseFloat(sample.offsetWidth) + margin;//基本方块宽度 + margin
					for(var i = 0; i != this.rowNum; i++){
		
						//创建行
						var rDiv = document.createElement("div");
						rDiv.setAttribute('id','r' + i);
						rDiv.setAttribute('class','row');
						
						for(var j = 0; j != this.colNum; j++){
							var cDiv = document.createElement("div");
							cDiv.setAttribute('id','c'+j + '_r' + i);
							cDiv.setAttribute('class','basic');
							rDiv.appendChild(cDiv);
						}
						rDiv.setAttribute('width',(this.colNum * (dotWidth + margin)) + 'px')
						pool.appendChild(rDiv);
					}
				},
				findBlock:function(colx, rowy){
					return this.content.find(function(value){
						return value.x == colx && value.y == rowy;
					});
				},
				addBlockToMine:function(){//开局或移动后,添加新块
					var zeroBlockArray = this.content.filter(function(value){
						return value.v == 0;
					});
					
					if(zeroBlockArray.length != 0){
						zeroBlockArray[this.makeRandomInteger(zeroBlockArray.length)].v = 
							(this.makeRandomInteger(2) + 1) * 2;
					}
				},
				makeRandomInteger:function(scope){
					return Math.floor(Math.random() * scope);
				},
				checkDeath:function(){
					if(this.content.filter(function(value){
							return value.v == 0;
						}).length != 0){
						return false;//有零块就表示没有死
					}else{
						//满格时,检测相邻之间可合并的可能性//Jallen Kwong
						//再没有合并的可能,没有的话,游戏就结束
						
						//穷举法(不聪明的方法)
						for(var i = 0; i < this.rowNum; i++){
							if(i != this.rowNum - 1){
								for(var j = 0;j < this.colNum; j++){
									var mainBlock = this.findBlock(j, i);
									var downBlock = this.findBlock(j, i + 1);

									if(j != this.colNum - 1){
										var rightBlock = this.findBlock(j + 1,i);
									
										if(mainBlock.v == rightBlock.v 
											|| mainBlock.v == downBlock.v){
											return false;
										}
									}else{
										if(mainBlock.v == downBlock.v){
											return false;
										}
									}
								
								}
							}else{
								for(var j = 0;j < this.colNum - 1; j++){
									var mainBlock = this.findBlock(j, i);
									var rightBlock = this.findBlock(j + 1, i);
									
									if(mainBlock.v == rightBlock.v){
										return false;
									}
								}
							}							
						}
						return true;//真的Game Over
					}
				},
				refresh:function(){//刷新显示页面
					for(var row = 0;row < this.rowNum;row++){
						for(var col = 0;col < this.colNum;col++){
							var value = this.findBlock(col,row).v;
							var elem = document.getElementById('c'+col+'_r'+row);
							elem.style.backgroundColor = this.colourObject[value] == undefined?this.colourObject[0]:this.colourObject[value];
							elem.innerHTML 
								= (value == 0 ? "" : "<span style='font-size:200%;font-weight:bold;'>"+value+"</span>");
						}
					}
					
					document.getElementById('score').innerHTML = this.score;
				},
				addKeyListener:function(event){
					var keycode = event.keyCode;
					if(keycode >= 37 && keycode <= 40){
						//alert(keycode);
						event.preventDefault();
						var changeCount = 0;//记住块有没真正得移动过
						switch(keycode){
						
							case 37://左
								//console.log(keycode);
								for(var i = 0; i < this.rowNum; i++){
									var queue = [];
									var flag = false;
									
									//入栈
									for(var j = 0 ; j < this.colNum; j++){
										var block = this.findBlock(j, i);
										
										if(block.v == 0){
											continue;
										}
									
										flag = this.coreCalculate(block, queue, flag);
									}
									
									//出队列
									for(var k = 0 ;k < this.colNum; k++){
										changeCount += this.outOfQueue(k, i, queue, k);
									}
									
								}
								break;
							case 38://上
								for(var i = 0; i < this.colNum; i++){
									var queue = [];
									var flag = false;
									
									for(var j = 0 ;j < this.rowNum; j++){
										var block = this.findBlock(i, j);
										
										if(block.v == 0){
											continue;
										}
									
										flag = this.coreCalculate(block, queue, flag);
									}
									
									//出队列
									for(var k = 0 ;k < this.rowNum; k++){
										changeCount += this.outOfQueue(i, k, queue, k);
									}
								}
								break;
							case 39://右
								for(var i = 0; i < this.rowNum; i++){
									var queue = [];
									var flag = false;
									//入栈
									for(var j = this.colNum - 1 ; j >= 0; j--){
										var block = this.findBlock(j, i);
										
										if(block.v == 0){
											continue;
										}
									
										flag = this.coreCalculate(block, queue, flag);
									}
									//console.log(queue);
									//出队列
									for(var k = this.colNum - 1 ,l = 0;k >= 0; k--,l++){
										changeCount += this.outOfQueue(k, i, queue, l);
									}
								}
							
								break;
							case 40://下
								for(var i = 0; i < this.colNum; i++){
									var queue = [];
									var flag = false;
									for(var j = this.rowNum - 1 ;j >= 0; j--){
										var block = this.findBlock(i, j);
										
										if(block.v == 0){
											continue;
										}
									
										flag = this.coreCalculate(block, queue, flag);
									}
									
									//出队列
									for(var k = this.rowNum - 1 ,l = 0;k >= 0; k--,l++){
										changeCount += this.outOfQueue(i, k, queue, l);
									}
								}
								break;
							default:break;
						}
						
						//要检查content的v们有没有改变过
						//1.入栈操作前,要来个数组拷贝,然后在做比对,这做法并不聪明
						//2.出队列的时候,跟原来的值进行比较,有改变 changCount++
						
						//console.log('changeCount:' + changeCount);
						if(changeCount != 0){
							this.addBlockToMine();
							
							this.refresh();//刷新显示页面
							
							if(this.checkDeath()){
								alert("Game Over!");
								document.onkeydown = function(event){
									var keycode = event.keyCode;
									if(keycode >= 37 && keycode <= 40){
										event.preventDefault();
										alert("Game Over!");
									}
								};
							}
					
						}
					}
				},
				init:function(){
					for(var row = 0; row < this.rowNum; row++){
						for(var col = 0; col < this.colNum; col++){
							this.content[this.content.length] = {x:col,y:row,v:0};
						}
					}
					
					for(var i = 0;i <= 20;i++){
						if(i == 0){
							this.colourObject[i] = this.colour[i];
							continue;
						}
						this.colourObject[Math.pow(2,i)] = this.colour[i];
					}
					//console.log(this.colourObject[7]);
					
				},
				coreCalculate:function(block, queue, flag){ flag的作用,入栈方式有问题,譬如2,2,4  应得 4,4 但结果 得8
					if(queue.length == 0 ){
						queue[queue.length] = block.v;
						return flag;
					}else{
						var tailOfQueue = queue[queue.length - 1];
						if((tailOfQueue == block.v) && !flag){
							this.score += (queue[queue.length - 1] = tailOfQueue * 2);
							return true;
						}else{
							queue[queue.length] = block.v;
							return false;
						}
					}
				},
				outOfQueue:function(colx, rowy, queue, index){
					var block = this.findBlock(colx, rowy);
					var oldValue = block.v;
					block.v = queue[index] == undefined ? 0 : queue[index];
					return oldValue != block.v? 1 : 0;
				}
			};
		
			//main
			window.onload = function(){
				container.loadBackground();
				container.init();
				//alert(container.findBlock(1,1).v);
				container.addBlockToMine();
				container.addBlockToMine();
				container.refresh();
				document.addEventListener('keydown', function(event){
					container.addKeyListener(event);
				});
			};
		
		</script>
	</body>
</html> 

到此这篇关于基于JS制作一个简易的2048游戏的文章就介绍到这了,更多相关JS 2048游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于JS制作一个简易的2048游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么用Python+Pygame制作简易版2048小游戏

这篇文章主要介绍了怎么用Python+Pygame制作简易版2048小游戏的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Python+Pygame制作简易版2048小游戏文章都会有所收获,下面我们一起来看
2023-06-29

基于JavaSwing制作一个Pong小游戏

《Pong》是美国雅达利公司(ATARI)开发的视频游戏,该作模拟了两个打乒乓球的人,就是在两条线中间有一个点在动,操纵器就是一个摇杆上有一个按钮的那种。本文就来用JavaSwing制作一个Pong小游戏吧
2023-01-05

基于Java制作一个简易的远控终端

这篇文章主要为大家详细介绍了如何基于Java制作一个简易的远控终端,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
2023-05-14

怎么在python中使用tkinter制作一个2048游戏

怎么在python中使用tkinter制作一个2048游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。创建main.py代码:from tkinter import *fro
2023-06-14

如何基于Vue制作一个猜拳小游戏

Vue.js作为目前最热门最具前景的前端框架之一,其提供了一种帮助我们快速构建并开发前端项目的新的思维模式,下面这篇文章主要给大家介绍了关于如何基于Vue制作一个猜拳小游戏的相关资料,需要的朋友可以参考下
2023-01-05

基于Python制作简单的井字棋游戏

这篇文章主要为大家详细介绍了如何基于Python实现简单的井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2023-05-18

编程热搜

目录