扫雷小游戏
注意:
代码中有需要替换的图片路径,需根据自己图片位置更改
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=0.5">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>扫雷</title>
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<div id="box">
<div id="baozha"></div>
<ul id="ul"></ul>
</div>
<!-- 雷数 -->
<div id="leishu">
雷:<input type="text" id="inp" placeholder="默认30">
<button id="btn">确定</button>
</div>
<script src="js/index.js"></script>
</body>
</html>
js
// 雷的个数
var leishu = 30;
// 格子的个数
var kuan = 20;
var gao = 20;
var geshu = kuan * gao;
var box = document.getElementById('box');
box.style.width = kuan * 30 + 30 + 'px';
box.style.height = gao * 30 + 30 + 'px';
var inp = document.getElementById('inp');
var btn = document.getElementById('btn');
var ul = document.getElementById('ul');
btn.onclick = function(){
var inpV = inp.value;
if(!isNaN(inpV) && inpV > 0){
if(inpV > geshu){
inpV = geshu;
}
ul.innerHTML = '';
saolei(inpV);
}else{
alert('请输入数字或正值');
}
}
saolei(leishu);
function saolei(leishu){
var lei = '<img src="images/bomb.jpg" alt="">';//此处为雷图片
var leishu = leishu || 30;
// --------------------------------------生成小格子------------------------------------------
var arr = [];
var arr1 = [];
for(var i = 0; i < geshu; i++){
var li = document.createElement('li');
var div = document.createElement('div');
li.setAttribute('zdy',i);
li.setAttribute('zuodianji','0');
li.appendChild(div);
ul.appendChild(li);
arr.push(li);
arr1.push(li);
// 给li点击事件
// 右键
li.onclick = dianji;
// 左键
li.oncontextmenu = zuo;
}
// -----------------------------------------随机生成雷----------------------------------------
var lis = ul.childNodes;
var liLength = ul.childNodes.length;
for(var i = 0; i < leishu; i++){
var random = Math.floor(Math.random() * liLength);
if(arr1[random] !== 'NaN'){
lis[random].children[0].innerHTML = lei;
arr1.splice(random,1,'NaN');
}else{
i--;
}
}
// ----------------------------------------------生成数字--------------------------------------
for(var i = 0; i < liLength; i++){
sun(i,kuan);
}
function sun(i,w,h){
var a = 0;
if(lis[i].children[0].innerHTML !== lei){
if(lis[i - (w+1)] && lis[i - (w+1)].children[0].innerHTML == lei && i % w !== 0){
a += 1;
}
if(lis[i - w] && lis[i - w].children[0].innerHTML == lei){
a += 1;
}
if(lis[i - (w-1)] && lis[i - (w-1)].children[0].innerHTML == lei && i % w !== (w-1)){
a += 1;
}
if(lis[i - 1] && lis[i - 1].children[0].innerHTML == lei && i % w !== 0){
a += 1;
}
if(lis[i + 1] && lis[i + 1].children[0].innerHTML == lei && i % w !== (w-1)){
a += 1;
}
if(lis[i + (w-1)] && lis[i + (w-1)].children[0].innerHTML == lei && i % w !== 0){
a += 1;
}
if(lis[i + w] && lis[i + w].children[0].innerHTML == lei){
a += 1;
}
if(lis[i + (w+1)] && lis[i + (w+1)].children[0].innerHTML == lei && i % w !== (w-1)){
a += 1;
}
if(a !== 0){
lis[i].children[0].innerHTML = a;
if(a == 2){
lis[i].children[0].style.color = 'rgb(149, 236, 9)';
}else if(a == 3){
lis[i].children[0].style.color = 'rgb(187, 236, 9)';
}else if(a == 4){
lis[i].children[0].style.color = 'rgb(236, 213, 9)';
}else if(a == 5){
lis[i].children[0].style.color = 'rgb(236, 164, 9)';
}else if(a == 6){
lis[i].children[0].style.color = 'rgb(236, 119, 9)';
}else if(a == 7){
lis[i].children[0].style.color = 'rgb(236, 81, 9)';
}else if(a == 8){
lis[i].children[0].style.color = 'rgb(250, 3, 3)';
}
lis[i].setAttribute('shu',a);
}else if(a == 0){
lis[i].setAttribute('shu','');
}
}else{
lis[i].setAttribute('shu',lei);
}
}
// -------------------------------------------点击显示下面内容-----------------------------------
var baozha = document.getElementById('baozha');
function dianji(){
if(this.children[0].innerHTML !== '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
this.style.backgroundColor = '#fff';
this.children[0].style.display = 'block';
var center = this.children[0].innerHTML;
var zdy = this.getAttribute('zdy');
kong(zdy,center,kuan);
victory();
// 比较是否是炸弹如果是则失败
if(center == lei){
baozha.innerHTML = '<img src="images/baozha.gif" alt="">';//此处为游戏失败显示的图片
for(var i = 0; i < liLength; i++){
lis[i].onclick = over;
lis[i].oncontextmenu = over;
if(lis[i].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
lis[i].children[0].innerHTML = lis[i].getAttribute('shu');
}
lis[i].children[0].style.display = 'block';
}
setTimeout(function(){
baozha.innerHTML = '';
alert('游戏结束!');
},1000)
}
}
}
function over(){
alert('游戏结束请刷新,重新开始!');
}
function kong(zdy,center,kuan){
// 点击判断是空后,接着判断相邻的是否为空,如果是接着此效果
if(center == ''){
function left(zdy,center){
if( arr[Number(zdy) - 1] && zdy % kuan !== 0 && center == '' && arr[Number(zdy) - 1].children[0].style.display !== 'block'){
arr[Number(zdy) - 1].style.backgroundColor = '#fff';
arr[Number(zdy) - 1].children[0].style.display = 'block';
if(arr[Number(zdy) - 1].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
arr[Number(zdy) - 1].children[0].style.display = 'inline-block';
}
bottom(zdy - 1,arr[Number(zdy) - 1].children[0].innerHTML);
top(zdy - 1,arr[Number(zdy) - 1].children[0].innerHTML);
left(zdy - 1,arr[Number(zdy) - 1].children[0].innerHTML);
}
}
left(zdy,center);
function right(zdy,center){
if(arr[Number(zdy) + 1] && zdy % kuan !== (kuan-1) && center == '' && arr[Number(zdy) + 1].children[0].style.display !== 'block'){
arr[Number(zdy) + 1].style.backgroundColor = '#fff';
arr[Number(zdy) + 1].children[0].style.display = 'block';
if(arr[Number(zdy) + 1].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
arr[Number(zdy) + 1].children[0].style.display = 'inline-block';
}
right(Number(zdy) + 1,arr[Number(zdy) + 1].children[0].innerHTML);
top(Number(zdy) + 1,arr[Number(zdy) + 1].children[0].innerHTML);
bottom(Number(zdy) + 1,arr[Number(zdy) + 1].children[0].innerHTML);
}
}
right(zdy,center);
function bottom(zdy,center){
if(arr[Number(zdy) + kuan] && center == '' && arr[Number(zdy) + kuan].children[0].style.display !== 'block'){
arr[Number(zdy) + kuan].style.backgroundColor = '#fff';
arr[Number(zdy) + kuan].children[0].style.display = 'block';
if(arr[Number(zdy) + kuan].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
arr[Number(zdy) + kuan].children[0].style.display = 'inline-block';
}
bottom(Number(zdy) + kuan,arr[Number(zdy) + kuan].children[0].innerHTML);
left(Number(zdy) + kuan,arr[Number(zdy) + kuan].children[0].innerHTML);
right(Number(zdy) + kuan,arr[Number(zdy) + kuan].children[0].innerHTML);
}
}
bottom(zdy,center);
function top(zdy,center){
if(arr[Number(zdy) - kuan] && center == '' && arr[Number(zdy) - kuan].children[0].style.display !== 'block'){
arr[Number(zdy) - kuan].style.backgroundColor = '#fff';
arr[Number(zdy) - kuan].children[0].style.display = 'block';
if(arr[Number(zdy) - kuan].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为小红旗图片
arr[Number(zdy) - kuan].children[0].style.display = 'inline-block';
}
top(Number(zdy) - kuan,arr[Number(zdy) - kuan].children[0].innerHTML);
left(Number(zdy) - kuan,arr[Number(zdy) - kuan].children[0].innerHTML);
right(Number(zdy) - kuan,arr[Number(zdy) - kuan].children[0].innerHTML);
}
}
top(zdy,center);
}
}
// --------------------------------------------左键插小红旗-----------------------------------------
function zuo(e){
e.preventDefault();
var conter = this.getAttribute('shu');
if(this.children[0].style.display !== 'block'){
var zuodianji = this.getAttribute('zuodianji');
if(zuodianji == 0){
this.children[0].innerHTML = '<img src="images/flag.jpg" alt="">';//此处为小红旗图片
this.children[0].style.display = 'inline-block';
this.setAttribute('zuodianji','1');
}else if(zuodianji == 1){
this.children[0].innerHTML = conter;
this.children[0].style.display = 'none';
this.style.backgroundColor = 'rgb(122, 128, 123)';
this.setAttribute('zuodianji','0');
}
}
}
// ---------------------------------------------当界面只剩雷没有点开则胜利------------------------------------
var shengli = false;
function victory(){
var v = 0;
for(var i = 0; i < liLength; i++){
if(lis[i].children[0].innerHTML !== lei && lis[i].children[0].style.display == 'block' && shengli == false){
v++;
if(liLength - v == leishu){
shengli = true;
victory();
}
}
if(shengli){
if(lis[i].children[0].innerHTML == '<img src="images/flag.jpg" alt="">'){//此处为右键小红旗图片
lis[i].children[0].innerHTML = lei;
}
lis[i].children[0].style.display = 'block';
baozha.innerHTML = '<img src="images/yanhua.gif" alt="">';//此处为胜利后显示图片
}
}
if(shengli){
for(var j = 0; j < liLength; j++){
lis[j].onclick = over;
lis[j].oncontextmenu = over;
}
setTimeout(function(){
baozha.innerHTML = '';
alert('恭喜获胜!!!');
},3000);
}
}
}
css
*{
margin:0;
padding:0;
}
ul{
list-style:none;
}
#box{
position:relative;
top:20px;
left:50%;
transform:translate(-50%);
background-color: #999;
padding:15px;
box-sizing: border-box;
/* overflow: hidden; */
float: left;
}
#ul li{
width: 30px;
height: 30px;
background-color: rgb(122, 128, 123);
float: left;
border:1px solid #000;
box-sizing: border-box;
}
#ul li div{
display: none;
font-size: 20px;
color:rgb(9, 250, 9);
text-align:center;
line-height:30px;
}
#ul li div img{
width: 28px;
height: 28px;
}
/* 爆炸图片 */
#baozha{
position: absolute;
left:50%;
top:50%;
transform: translate(-50%,-50%);
}
#baozha img{
opacity: 0.8;
}
/* 雷个数 */
#leishu{
position: absolute;
top:50px;
left:50%;
margin-left:400px;
width: 95px;
}
#leishu #inp{
width: 50px;
height: 30px;
box-sizing: border-box;
padding-left:5px;
}
#leishu #btn{
width: 82px;
height: 30px;
border:1px solid #000;
box-sizing: border-box;
}
图片
其他资源(2048,飞行棋,五子棋,贪吃蛇…)
https://github.com/liuzilong2000/xiaoyouxi.git