zoukankan      html  css  js  c++  java
  • 简单的扫雷游戏,原生JS实现

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="UTF-8">
    		<title></title>
    		<style>
    			.box{
    				position:relative;
    			}
    			.father{
    				position: relative;
    			}
    			.box div{
    				20px;
    				height:20px;
    				background-color: #ccc;
    				border:2px solid #666;
    				border-top-color: #fff;
    				border-left-color: #fff;
    				position:absolute;
    				text-align: center;
    			}
    			.shadow{
    				position:absolute;
    				top:0;
    				left:0;
    				background-color: rgba(0,0,0,.5);
    				display: none;
    				text-align: center;
    			}
    			.btn{
    				margin-top:100px;
    				80px;
    				height:30px;
    			}
    			.win{
    				position:absolute;
    				top:0;
    				left:0;
    				background-color: rgba(0,0,0,.5);
    				display: none;
    				text-align: center;
    				color:#fff;
    			}
    		</style>
    	</head>
    	<body>
    		<section class="father">
    			<div class="box"></div>
    			<div class="shadow">
    				<input type="button" class = "btn" value="再来一次"/>
    			</div>
    			<div class="win">
    				<p>少年恭喜过关</p>
    				<input type="button" class = "btn1" value="再来一次"/>
    			</div>
    		</section>
    		
    	</body>
    	<script type="text/javascript">
    		// 计算雷点
    		var index = 0;
    		// 生成页面
    		page(10,10);
    		state();
    		leiClick();
    		leiM();
    		leiOpen();
    		More();
    		rightClick();
    		//封装界面初始值
    		function state(){
    			// 设置界面宽度
    			var dives = document.querySelectorAll('.box div');
    			
    			var box = document.querySelector('.box');
    			
    			var shadow = document.querySelector('.shadow');
    
    			var win1 = document.querySelector('.win');
    			
    			box.style.width = dives.length/10*24 + 'px';
    			
    			box.style.height = dives.length/10*24 + 'px';
    			
    			shadow.style.width = dives.length/10*24 + 'px';
    
    			shadow.style.height = dives.length/10*24 + 'px';
    			win1.style.width = dives.length/10*24 + 'px';
    
    			win1.style.height = dives.length/10*24 + 'px';
    		}
    		// 封装生成页面函数
    		function page(row,con){
    			
    			var box = document.querySelector('.box');
    			
    			var html = '';
    			
    			for(var i =0;i<row;i++){
    				
    				for(var j =0;j<con;j++){
    					
    					html += '<div style="top:'+i*24+'px;left:'+j*24+'px;"></div>';
    					
    				}
    			}
    			box.innerHTML = html;
    		}
    		// 给雷点添加点击事件
    		function leiClick(){
    			// 设置雷点
    			var dives = document.querySelectorAll('.box div');
    			
    			var num = 10;
    			
    			var arr = [];
    			
    			for(var i =0;i<num;i++){
    				
    				var n =Math.floor(Math.random()*dives.length);
    				
    				
    				var onOff = false;
    				
    				for(var j =0;j<arr.length;j++){
    					
    					if(n==arr[j]){
    						onOff = true;
    						break;
    					}
    				}
    				if(!onOff){
    					arr.push(n);
    				}else{
    					i--;
    				}
    			}
    			// 布置雷点
    			for(var i =0;i<arr.length;i++){
    				dives[arr[i]].className = 'lei';
    			}
    			for(var i =0;i<arr.length;i++){
    			
    				dives[arr[i]].onclick = function(){
    					if (this.onOff) return;
    					var lei = document.querySelectorAll('.lei');
    					
    					var shadow = document.querySelector('.shadow');
    
    					shadow.style.display = 'block';
    					
    					fn(0);
    					
    		            function fn(num){
    		                setTimeout(function(){
    		                	
    		                    lei[num].style.backgroundColor = 'red';
    		                    
    		                    lei[num].innerHTML = '雷';
    		                    
    		                    if(num+1<lei.length){
    		                    	
    		                        fn(num+1);
    		                        
    		                    }
    		                },200)
    		            }
    					
    				}
    			}
    		}
    		// 计算雷点个数
    		function leiM(){
    			var dives = document.querySelectorAll('.box div');
    		
    			for(var i =0;i<dives.length;i++){
    				
    				if(dives[i].className=='lei') continue;
    				
    				var num = 0;
    				// 上
    				if(dives[i-10]&&dives[i-10].className=='lei'){
    					num++;
    				}
    				//下
    				if(dives[i+10]&&dives[i+10].className=='lei'){
    					num++;
    				}
    				if(i%10!=0){
    					// 左
    					if(dives[i-1]&&dives[i-1].className=='lei'){
    						num++;
    					}
    					//左上
    					if(dives[i-11]&&dives[i-11].className=='lei'){
    						num++;
    					}
    					//左下
    					if(dives[i+9]&&dives[i+9].className=='lei'){
    						num++;
    					}
    				}
    				if(i%10!=9){
    					// 右
    					if(dives[i+1]&&dives[i+1].className=='lei'){
    						num++;
    					}
    					// 右上
    					if(dives[i-9]&&dives[i-9].className=='lei'){
    						num++;
    					}
    					// 右下
    					if(dives[i+11]&&dives[i+11].className=='lei'){
    						num++;
    					}
    				}
    				if(num>0){
    					dives[i].num = num;
    				}
    				
    			}
    		}
    		//打开空雷点
    		function leiOpen(){
    			var dives = document.querySelectorAll('.box div');
    			
    			for(var i =0;i<dives.length;i++){
    				
    				if(dives[i].className!='lei'){
    					
    					dives[i].index = i;
    					
    					dives[i].onclick = function(){
    						var winGame = document.querySelector('.win')
    						findLei(dives,this.index);
    						if(index==90){
    							winGame.style.display = 'block';
    							win();
    						}
    					}
    				}
    			}
    		}
    		// 再玩一次
    		function More(){
    			var btn = document.querySelector('.btn');
    			btn.onclick = function(){
    				index = 0;
    				var shadow = document.querySelector('.shadow');
    				shadow.style.display = 'none';
    				// 生成页面
    				page(10,10);
    				state();
    				leiClick();
    				leiM();
    				leiOpen();
    				rightClick();
    				
    			}
    		}
    		function win(){
    			var btn = document.querySelector('.btn1');
    			btn.onclick = function(){
    				index = 0;
    				var win1 = document.querySelector('.win');
    				win1.style.display = 'none';
    				// 生成页面
    				page(10,10);
    				state();
    				leiClick();
    				leiM();
    				leiOpen();
    				rightClick();
    
    			}
    		}
    
    		function findLei(dives,i){
    			if(dives[i].onOff) return;
    			
    			dives[i].onOff = true;
    			if(dives[i].onOff) index++;
    			console.log(index);
    			dives[i].style.border = '1px solid #ccc';
    			
    			dives[i].innerHTML = dives[i].num||'';
    			
    			dives[i].style.backgroundColor = '#f1f1f1';
    			
    	        dives[i].style.width = '22px';
    	        
    	        dives[i].style.height = '22px';
    	        
    			if(!dives[i].num){
    				
    				if(dives[i-10]&&dives[i-10].className!='lei'){
    					
    					findLei(dives,i-10);
    				}
    				//下
    				if(dives[i+10]&&dives[i+10].className!='lei'){
    					
    					findLei(dives,i+10);
    					
    				}
    				if(i%10!=0){
    					// 左
    					if(dives[i-1]&&dives[i-1].className!='lei'){
    						
    						findLei(dives,i-1);
    					}
    					//左上
    					if(dives[i-11]&&dives[i-11].className!='lei'){
    						
    						findLei(dives,i-11);
    						
    					}
    					//左下
    					if(dives[i+9]&&dives[i+9].className!='lei'){
    						
    						findLei(dives,i+9);
    						
    					}
    				}
    				if(i%10!=9){
    					// 右
    					if(dives[i+1]&&dives[i+1].className!='lei'){
    						
    						findLei(dives,i+1);
    						
    					}
    					// 右上
    					if(dives[i-9]&&dives[i-9].className!='lei'){
    						
    						findLei(dives,i-9);
    						
    					}
    					// 右下
    					if(dives[i+11]&&dives[i+11].className!='lei'){
    						
    						findLei(dives,i+11);
    						
    					}
    				}
    			}
    			
    			
    		}
    
    		function rightClick(){
    			var dives = document.querySelectorAll('div');
    			for(var i =0;i<dives.length;i++){
    				dives[i].oncontextmenu=function(ev){
    					var ev = ev||event;
    					ev.preventDefault();
    					if(!this.onOff){
    						this.style.backgroundColor = 'blue';
    						this.onOff = true;
    					}else{
    						this.style.backgroundColor = '';
    						this.onOff = false;
    					}
    
    				}
    			}
    		}
    		
    	</script>
    </html>
    

      

  • 相关阅读:
    矩形法求积分sin cos exp
    约瑟夫环问题
    KMP算法详解
    找出float型数组的最大值和最小值,分别和第一个和最后一个元素互换
    二重指针应用
    C++学习笔记(一)
    Line学习笔记
    node2vec学习笔记
    deepwalk学习笔记
    如何保证消息不被重复消费?(如何保证消息消费时的幂等性)
  • 原文地址:https://www.cnblogs.com/settimeout/p/8029280.html
Copyright © 2011-2022 走看看