【酷炫 贪吃蛇——由“前端“实现___效果 + 全部代码】

一、游戏效果展示(运行)

这是带有调整速度的游戏运行展示:

在这里插入图片描述

这是带有"重新游戏"的展示:这速度我还不能驾驭哈哈~

在这里插入图片描述
在这里插入图片描述

测试一下你最好得多少分数?

注意:
背景图片、游戏格子、提示语言等都可以根据需要进行更改哦~

二、全部代码

index.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>贪吃蛇——CSDN追光者♂</title>
		<link rel="stylesheet" href="css/index.css" />
		<script src="js/index.js"></script>
	</head>
	<body>
		<div class="base">
			<div id="context">
				<div id="title">
					<div class="left">
						<div>说明:</div>
						<div>1、上、下、左、右键控制蛇运动的方向</div>
						<div>2、空格键控制游戏暂停与运行</div>
						<div>3、"+"、"-"控制运行速度</div>
					</div>
					<div class="center">
						<div>加油!奥利给!</div>
						<img src="img/gong.jpg" width="75px" />
					</div>
					<div class="right">
						分数:<label id="score"></label>
					</div>
				</div>
				<canvas id="canvas" height="500px" width="700px"></canvas>
			</div>
		</div>		
		<div class="model" id="model1">
			<div class="context">
				<div class="saoma">就这?</div>
				<img src="img/gong.jpg" width="160px" />
				<div class="jixu">游戏已暂停,按空格键继续</div>
			</div>
		</div>	
		<div class="model" id="model2">
			<div class="context">
				<div class="saoma">这就认输了?!</div>
				<img src="img/gong.jpg" width="160px" />
				<button onclick="reLoad()">再来一局</button>
			</div>
		</div>
	</body>
</html>

index.css

*{
    
    
	margin: 0;
	padding: 0;
}
.base{
    
    
	position: fixed;
	width: 100%;
	height: 100%;
	background-image: url(../img/bg.jpg);
	background-repeat: no-repeat;
}
button{
    
    width: 50px; }
a{
    
    text-decoration:none;}
#context{
    
     
	width: 700px;
	height: 600px;
	position: absolute;
	top: 50%;
	left: 50%;
	margin-left: -350px;
	margin-top: -300px;
	background-color: white;
	opacity: 0.7;
}
#title{
    
    
	width: 100%;
	height: 100px;
	float: left;
}
#canvas{
    
    
	float: left;
	
}
#title .left{
    
    
	width: 49%;
	height: 100%;
	float: left;	
}
#title .left div{
    
    
	margin-left: 10px;
	margin-top: 4px;
	font-size: 14px;
}
#title .right,
#title .center{
    
    
	width: 25%;
	height: 100%;
	float: left;
	border-left: solid gray 1px;
}
#title .right{
    
    
	line-height: 50px;
	text-align: center;
	font-size: 20px;	
}
#title .center div{
    
    
	float: left;
	width: 100%;
	text-align: center;
	font-size: 16px;
}
#title .center img{
    
    
	float: left;
	position: relative;
	left: 50%;
	margin-left: -37.5px;
}
.model{
    
    
	width: 100%;
	height: 100%;
	background-color: black;
	position: fixed;
	top: 0;
	left: 0;
	z-index: 10;
	opacity: 0.65;
	display: none;
}
.model .context{
    
    
	width: 200px;
	height: 220px;
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -110px;
	margin-left: -100px;
	color: white;
}
.model .context img{
    
    
	margin-left:20px;
}
.model .context div{
    
    
	text-align: center;
	margin-bottom: 5px;
}
.model .context button{
    
    
	width: 120px;
	height: 30px;
	background-color: white;
	color: black;
	border-radius: 3px;
	border: none;
	margin-left: 40px;
	margin-top: 20px;	
}

index.js

/*
 *   1、初始化 方法 init()
 * 
 * */

//定义全局变量
var ROWS; //行数
var COLS; //列数
var CONTEXT; //画布上下文对象
var BLOCK_SIZE; //格子大小
var snakes = []; //保存蛇坐标
var snakeCount; //蛇身数量
var foodX, foodY; //食物的坐标
var interval; //计时
var moveTo; //蛇移动的方向
var isStop;  //是否暂停
var score;  //分数
var speed;   //蛇运行速度
window.onload = function() {
    
    
	//游戏初始化
	init();
	start();
}
//重新加载
function reLoad(){
    
    
	window.location.reload()
}
//开始游戏
function start() {
    
    
	interval = setInterval(move, speed);
	document.onkeydown = function(event) {
    
    
		var event = event || window.event;
		keydown(event.keyCode);
	}
}
//交互响应函数
function keydown(keyCode) {
    
    
	switch(keyCode) {
    
    
		case 37: //左边
			if(moveTo != 0 && moveTo != 2) moveTo = 0;
			break;
		case 38: //上边
			if(moveTo != 1 && moveTo != 3) moveTo = 1;
			break;
		case 39: //右边
			if(moveTo != 2 && moveTo != 0) moveTo = 2;
			break;
		case 40: //下的
			if(moveTo != 3 && moveTo != 1) moveTo = 3;
			break;
		case 32: //开始/暂停
			if(isStop) {
    
    
				interval = setInterval(move, speed);
				isStop = false;
				document.getElementById("model1").style.display='none';
			} else {
    
    
				clearInterval(interval);
				isStop = true;
				document.getElementById("model1").style.display='block';
			}
			break;
		case 107:
		
		    if(speed>50){
    
    
		    	speed-=50;
		    	clearInterval(interval);
		    	interval = setInterval(move, speed);
		    }
		    console.log(speed)
		    break;
		    
		  case 109:
		    if(speed<500){
    
    
		    	speed+=50;
		    	clearInterval(interval);
		    	interval = setInterval(move, speed);
		    }
		    console.log(speed)
		    break;
	}
}
//制造食物
function addFood() {
    
    
	foodX = Math.floor(Math.random() * (ROWS - 1)) * BLOCK_SIZE;
	foodY = Math.floor(Math.random() * (COLS - 1)) * BLOCK_SIZE;
	drawFood();
}
//死亡判断
function isDie() {
    
    
	if(snakes[snakeCount - 1].x == -20 || snakes[snakeCount - 1].x == BLOCK_SIZE * ROWS ||
		snakes[snakeCount - 1].y == -20 || snakes[snakeCount - 1].y == BLOCK_SIZE * COLS) {
    
    
		clearInterval(interval);
		document.getElementById("model2").style.display='block';
	}
	for(var i = 0; i < snakeCount - 1; i++) {
    
    
		if(snakes[snakeCount - 1].x == snakes[i].x && snakes[snakeCount - 1].y == snakes[i].y) {
    
    
			clearInterval(interval);
			document.getElementById("model2").style.display='block';
		}
	}
}
//吃到食物判断
function isEat() {
    
    
	if(snakes[snakeCount - 1].x == foodX && snakes[snakeCount - 1].y == foodY) {
    
    
		document.getElementById("score").innerHTML=++score;
		addFood();
		addSnake();
	}
}
//添加蛇身
function addSnake() {
    
    
	snakeCount++;
	snakes.unshift({
    
    
		x: BLOCK_SIZE * ROWS,
		y: BLOCK_SIZE * COLS
	});
}
//移动函数
function move() {
    
    
	switch(moveTo) {
    
    
		case 0: //左边
			snakes.push({
    
    
				x: snakes[snakeCount - 1].x - BLOCK_SIZE,
				y: snakes[snakeCount - 1].y
			});
			break;
		case 1: //上边
			snakes.push({
    
    
				x: snakes[snakeCount - 1].x,
				y: snakes[snakeCount - 1].y - BLOCK_SIZE
			});
			break;
		case 2: //右边
			snakes.push({
    
    
				x: snakes[snakeCount - 1].x + BLOCK_SIZE,
				y: snakes[snakeCount - 1].y
			});
			break;
		case 3: //下边
			snakes.push({
    
    
				x: snakes[snakeCount - 1].x,
				y: snakes[snakeCount - 1].y + BLOCK_SIZE
			});
			break;
		default:			;
	}
	snakes.shift();
	drawMap();
	drawFood();
	drawSnake();
	isEat();
	isDie();
}
//游戏初始化
function init() {
    
    
	ROWS = 35; //初始化行数
	COLS = 25; //初始化列数
	BLOCK_SIZE = 20;
	snakeCount = 3;
	moveTo = 2;
	score=0;
	document.getElementById("score").innerHTML=score;
	CONTEXT = document.getElementById('canvas').getContext('2d'); //初始化画布上下文对象的引用
	for(var i = 0; i < snakeCount; i++) {
    
    
		snakes[i] = {
    
    
			x: i * BLOCK_SIZE,
			y: 0
		};
	}
	isStop=false;
	speed=500;
	addFood();
	drawMap(); //初始化场地
	drawSnake(); //初始化蛇
	drawFood(); //初始化食物
}
//画出蛇运动的场地
function drawMap() {
    
    
	CONTEXT.clearRect(0, 0, BLOCK_SIZE * ROWS, BLOCK_SIZE * COLS);
	//画横线
	for(var i = 0; i < COLS; i++) {
    
    
		CONTEXT.beginPath();
		CONTEXT.moveTo(0, i * BLOCK_SIZE);
		CONTEXT.lineTo(BLOCK_SIZE * ROWS, i * BLOCK_SIZE);
		CONTEXT.strokeStyle = "gray";
		CONTEXT.lineWidth=1;
		CONTEXT.stroke();
	}
	//画竖线
	for(var i = 0; i < ROWS; i++) {
    
    
		CONTEXT.beginPath();
		CONTEXT.moveTo(i * BLOCK_SIZE, 0);
		CONTEXT.lineTo(i * BLOCK_SIZE, BLOCK_SIZE * COLS);
		CONTEXT.strokeStyle = "gray";
		CONTEXT.lineWidth=1;
		CONTEXT.stroke();
	}
}
//画蛇
function drawSnake() {
    
    

	for(var i = 0; i < snakes.length; i++) {
    
    
		CONTEXT.beginPath();
		CONTEXT.fillStyle = "red";
		CONTEXT.fillRect(snakes[i].x, snakes[i].y, BLOCK_SIZE, BLOCK_SIZE);
		CONTEXT.moveTo(snakes[i].x, snakes[i].y);
		CONTEXT.lineTo(snakes[i].x + BLOCK_SIZE, snakes[i].y);
		CONTEXT.lineTo(snakes[i].x + BLOCK_SIZE, snakes[i].y + BLOCK_SIZE);
		CONTEXT.lineTo(snakes[i].x, snakes[i].y + BLOCK_SIZE);
		CONTEXT.closePath();
		CONTEXT.strokeStyle = "gray";
		CONTEXT.stroke();
	}
}
//画食物
function drawFood() {
    
    
	CONTEXT.beginPath();
	CONTEXT.fillStyle = "yellow";
	CONTEXT.fillRect(foodX, foodY, BLOCK_SIZE, BLOCK_SIZE);
	CONTEXT.moveTo(foodX, foodY);
	CONTEXT.lineTo(foodX + BLOCK_SIZE, foodY);
	CONTEXT.lineTo(foodX + BLOCK_SIZE, foodY + BLOCK_SIZE);
	CONTEXT.lineTo(foodX, foodY + BLOCK_SIZE);
	CONTEXT.closePath();
	CONTEXT.strokeStyle = "red";
	CONTEXT.stroke();
}

三、说明

图片背景大家自行添加即可哦!按照自己的喜好更改就好!
如果需要直接运行的效果,即我在上面展示的效果,可以直接下载。我已
经上传到"资源"中了哦!
另外,欢迎各位在此留言讨论问题!

猜你喜欢

转载自blog.csdn.net/qq_44731019/article/details/122492162