JavaScript实现打地鼠

效果如下:

html代码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
		<script src="js/index.js"></script>
		<link rel="stylesheet" type="text/css" href="css/index.css"/>
		<style type="text/css">
		</style>
	</head>
	<body>
		<div id="controlCenter">
			<div class="buttons">
				<button class="buttonCss" onclick="startGame()">开始</button>
				<button class="buttonCss" onclick="pauseGame()">暂停</button>
				<button class="buttonCss" onclick="stopGame()">停止</button>
			</div>
			<div class="buttons">
				<div class="score"><span>得分:</span><span class="spanCss" id="scoreId">0</span></div>
				<div class="score">时间:<span class="spanCss" id="timeId">00:00</span></div>
			</div>
		</div>
		<div id="mainFrame" class="mouseMiddle">
			
		</div>
	</body>
</html>

js代码:

var columns = 4;
var rows = 3;
var gameFrameWidth = 0;
var gameFrameHeight = 0;
var caveWidth = 0;
var caveHeight = 0;
var caveCoord = []; //所有的洞穴坐标
var caveCoordMark = [];
var mouseOffsetX = 10; //变化成锤子后X轴的偏移
var mouseOffsetY = 15; //Y轴的偏移

var mouseTimeQueue = []; //老鼠存在的时间队列
var nowMouseTime = []; //老鼠已经经过的生命周期
var bulgeQueue = []; //正在探头的老鼠队列
var destroyQueue = []; //真正销毁的老鼠队列
var maxMouseNum = 5; //最多同时存在的老鼠数量
var startLoop = undefined; //开关的启动
var pauseFlag = false; //暂停标志
var minTime = 10; //生存的最小时间周期
var maxTime = 15;//生存的最大时间周期
var mouseFrameNum = 5; // 图片的帧数
var leftWidth = 0;
var topHeight = 0;
//var preTimeStamp = 0;

var score = 0;

window.onload = function() {
	init();
	mainFrameOnclick();
}

function init() {
//	preTimeStamp = Date.parse(new Date());
	gameFrameWidth = mainFrame.offsetWidth;
	gameFrameHeight = mainFrame.offsetHeight;
	caveWidth = Math.floor(gameFrameWidth / (columns + 2));
	caveHeight = Math.floor(gameFrameHeight / (rows + 2));
	caveHeight = caveWidth = Math.min(caveHeight, caveWidth); //以计算出的洞穴长宽中最小的边作为洞穴的长宽
	caveCoord = drawCave();
	mouseAnimationUpdate();
	scoreAutomationChange();
}

function timeChange(){
	let timestamp = Date.parse(new Date());
	let time = document.getElementById("timeId");
	let m = 0;
	let s = 0;
	setInterval(()=>{
		let now = Date.parse(new Date());
		let v = (now - timestamp)/1000;
//		console.log(v);
		let str = "";
		s = v % 60;
		m = Math.floor(v/60);
		str = str + (m>9?m:"0"+m);
		str = str + ":";
		str = str + (s>9?s:"0"+s);
		time.innerText = str;
	},1000);
}

function scoreAutomationChange(){
	leftWidth = mainFrame.getBoundingClientRect().left;
	topHeight = mainFrame.getBoundingClientRect().top;
	mainFrame.addEventListener("click",(event)=>{
		CheckHitMouse(event.pageX,event.pageY);
//		CheckHitMouse(event.pageX - left,event.pageY - top);
	});
}


function CheckHitMouse(xx,yy) {
	let x = xx + mouseOffsetX; //计算鼠标偏移
	let y = yy + mouseOffsetY;
	//鼠标点击的位置
//	let c = document.createElement("div");
//	c.style.backgroundColor = "red";
//	c.style.width = "10px";
//	c.style.height = "10px";
//	c.style.left = x-5 + "px";
//	c.style.top = y-5 + "px";
//	c.style.position = "absolute";
//	mainFrame.appendChild(c);
//	console.log("**"+x+"  "+y);
	let flag = false;
	for(let i = 0; i < bulgeQueue.length; i ++ ){
		let mouse = document.getElementById("mouseId"+bulgeQueue[i][2]);
		let left = mouse.getBoundingClientRect().left;
		let top = mouse.getBoundingClientRect().top;
		console.log(left+"  "+top);
		if(x>left&&x<left+caveWidth&&y>top&&y<top+caveHeight){
			playHitAnimation(xx-leftWidth,yy-topHeight,i);
			score+=1;
			document.getElementById("scoreId").innerText = score;
		}
	}
}

function playHitAnimation(x,y,index){
	let a = document.createElement("img");
	a.src = "img/4.png";
	a.width = caveWidth;
	a.hheight = caveHeight;
	a.classList.add("caveCss");
	a.style.left = x-5 +"px";
	a.style.top = y-5 + "px";
	mainFrame.appendChild(a);
	setTimeout(()=>{
		mainFrame.removeChild(a);
		let v = bulgeQueue[index];
		let element = document.getElementById("mouseId"+v[2]);
		element.src = "img/mouse0.png";
		caveCoord.push(v);
		bulgeQueue.splice(index,1);
		nowMouseTime.splice(index,1);
		mouseTimeQueue.splice(index,1);
	},100);
}

function startGame() {
	pauseFlag = false;
	window.clearInterval();
	timeChange();
	startLoop = setInterval(()=>{
		if(pauseFlag) return;
		for(let i = 0; i < bulgeQueue.length; i ++ ){
			if(nowMouseTime[i] >= mouseFrameNum && nowMouseTime[i] <= mouseTimeQueue[i]){
				nowMouseTime[i]+=1;
			}
		}
		if(bulgeQueue.length<maxMouseNum){//老鼠数量少于5个
			let index = getRandom(caveCoord.length);
			bulgeQueue.push(caveCoord[index]);
			caveCoord.splice(index,1);
			mouseTimeQueue.push(getRandomTime());
			nowMouseTime.push(0);
		}
	},500);
}

function mouseAnimationUpdate(){
	setInterval(()=>{
		if(pauseFlag) return;
		for(let i = 0; i < bulgeQueue.length; i ++ ){
			if(nowMouseTime[i]<mouseFrameNum){
				nowMouseTime[i]+=1;
				let mouse = bulgeQueue[i];
				let element = document.getElementById("mouseId"+mouse[2]);
				element.src = "img/mouse"+nowMouseTime[i]+".png";
			}
			else if(nowMouseTime[i]>mouseTimeQueue[i]){
				let mouse = bulgeQueue[i];
				let element = document.getElementById("mouseId"+mouse[2]);
				if(nowMouseTime[i]-mouseTimeQueue[i] >= mouseFrameNum+1){
					caveCoord.push(bulgeQueue[i]);
					bulgeQueue.splice(i,1);
					nowMouseTime.splice(i,1);
					mouseTimeQueue.splice(i,1);
					break;
				}
				element.src = "img/mouse"+(mouseFrameNum-nowMouseTime[i]+mouseTimeQueue[i])+".png";
				nowMouseTime[i]+=1;
			}
		}
	},200);
}

function pauseGame() {
	pauseFlag = pauseFlag ? false : true;
}

function stopGame() {
	location.reload();
}

function getRandomTime(){
	return minTime + getRandom(maxTime - minTime);
}


function mainFrameOnclick() {
	let mf = document.getElementById("mainFrame");
	mf.onclick = function(e) {
		mf.style.cursor = "url(img/01.ico),auto";
		setTimeout(() => {
			mf.style.cursor = "url(img/21.ico),auto";
		}, 200);
		setTimeout(() => {
			mf.style.cursor = "url(img/11.ico),auto";
		}, 400);
	}
}

function drawCave() {
	let coord = getAxialCoord();
	let count = getRandom(2) + 1;
	let mark = [];
	let newCoord = [];
	for(let i = 0; i < count; i++) {
		mark[getRandom(columns * rows)] = true;
	}
	for(let i = 0; i < coord.length; i++)
		if(mark[i] == undefined) {
			coord[i].push(i);
			newCoord.push(coord[i]);
			CreateCaveElement(coord[i][0], coord[i][1],i);
		}
	return newCoord;
}

function CreateCaveElement(axialX, axialY,index) {
	let createImg = document.createElement("img");
	createImg.width = caveWidth;
	createImg.height = caveHeight;
	createImg.style.left = axialX + "px";
	createImg.style.top = axialY + "px";
	createImg.classList.add("caveCss");
	createImg.id = "mouseId"+index;
	createImg.src = "img/mouse0.png";
	mainFrame.appendChild(createImg);
}

function getAxialCoord() {
	let location = [];
	let xWidth = Math.floor(gameFrameWidth / columns);
	let xRange = xWidth - caveWidth;
	let yHeight = Math.floor(gameFrameHeight / rows);
	let yRange = yHeight - caveHeight;
	for(let i = 0; i < rows; i++) {
		for(let j = 0; j < columns; j++) {
			let coord = [];
			coord.push(j * xWidth + getRandom(xRange));
			coord.push(i * yHeight + getRandom(yRange));
			location.push(coord);
		}
	}
	return location;
}

function getRandom(max) {
	let a = Math.random();
	return Math.floor(a * max);
}

 

项目资源:https://download.csdn.net/download/qq_38865022/12058296

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值