HTML实现简单的贪吃蛇小游戏(附完整源码)

Posted 准程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML实现简单的贪吃蛇小游戏(附完整源码)相关的知识,希望对你有一定的参考价值。

 基于html5技术的贪吃蛇小游戏的设计与实现


项目简介:

        贪吃蛇作为我们儿时经典的游戏之一,它是一款单机而又好玩的小游戏。今天,就让我们用html5技术实现一个简单的贪吃蛇小游戏!

项目核心技术:

        html5的canvas+JS技术

操作步骤:

        游戏玩家通过操作键盘的方向键(上下左右键)来控制小蛇的方向,使小蛇吃到红色的食物,然后促使小蛇长大。并且,如果得到的分数在不断上涨,游戏的难度也会不断的上升(小蛇的移动速度会越来越快)。如果小蛇头部撞到墙壁或小蛇自己的身体,就会判定游戏失败。


实现效果图:(不会动态图,将就着看!)


复制以下全部代码,可直接查看效果!!!


实现代码如下:

本项目代码一共分为两个部分:HTML+JS两部分。具体代码如下:

HTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html>
<head>
	<meta charset="utf-8">
	<title>html5贪吃蛇小游戏</title>
	<script type="text/javascript" src="贪吃蛇.js"></script>

	<script>

	</script>
</head>
<body>
	<h1>html5贪吃蛇小游戏</h1>
	<div align="left" class="a">
		游戏规则:<br>
		1.初始分数为=0、初始速度为1!<br>
		2.操作蛇移动,使蛇可以吃到红色的食物!<br>
		3.每当我的分数每次达到100分时,当前速度就会提高一个等级!<br>
		4.最高速度为10.相信能力强的人可以达到最高速度!<br>
		5.当蛇的碰到墙体或者自己的身子的时候,会宣布游戏失败!<br>
	</div>
	<style>
body
	text-align: center;
	background-color: aqua;

#snake
	margin-top: 20px;

.a
	margin-top: 50px;
	margin-left: 680px;
	width: 600px;
	font-size: 20px;
 


	</style>
	<canvas id="snake" width="" height=""></canvas>

	<h3 id="score">我的得分:0</h3>
	<h3 id="speed">当前速度:1</h3>

	<script>
	var snake = new Snake("snake","score","speed",36,36);
		snake.init();

	</script>
</body>

js代码:

var Snake = function(ele,scoreele,speedele,x,y)

	this.cellWidth = 15;//格子的大小
	this.ele = document.getElementById(ele);
	this.cxt = this.ele.getContext("2d");
	this.x=x;
	this.y=y;
	this.scoreele = document.getElementById(scoreele);
	this.speedele = document.getElementById(speedele);

	//生成canvas大小。边框。
	this.ele.width = this.cellWidth * this.x;
	this.ele.height = this.cellWidth * this.y;
	this.ele.style.border ="2px solid #000";

	this.changeDiretion();//绑定方向事件。


Snake.prototype = 

	init:function()
		//初始化,重置。恢复js数据以及dom。

		this.direction = 1;//向右  2下 3左  4 上
		this.nextDirection = '';
		this.snakeArr = [[0,parseInt(this.y/2)],[1,parseInt(this.y/2)]];
		this.speed = 1;
		this.score = 0;

		this.cxt.fillStyle ='#fff';
		this.cxt.fillRect(0,0,this.cellWidth*this.x,this.cellWidth*this.y);
		this.scoreele.innerHTML="我的得分:0";
		this.speedele.innerHTML="当前速度:1";

		this.createCoolPoint();
		this.drawCell(this.coolPoint,2);
		this.drawSnake();
		this.setTimer();
	,
	getCellArea:function(pos)//返回一个格子左上角的像素坐标[32,666];		
		return [(pos[0]-1)*this.cellWidth+1,(pos[1]-1)*this.cellWidth+1];
	,
	setTimer:function()
		var speedArr = [180,160,140,120,100,80,60,40,20];
		var speed = this.speed;
		if(speed>8)
			speed = 8;
		
		(function(theThis)
			var that = theThis;
			that.timer = setTimeout(function() 
				that.moveSnake();			
			, speedArr[speed]);
		)(this);

	,
	moveSnake:function()
		//移动蛇的逻辑。数组处理。

		this.direction = this.nextDirection == ''?this.direction:this.nextDirection;//当前移动方向,和下一个移动方向。这样处理能避免一个bug.
		var direction = this.direction;
		var snakeArr = this.snakeArr;
		var snakeHead = snakeArr[snakeArr.length-1];
		switch(direction)
			case 1 ://向右
			snakeHead = [snakeHead[0]+1,snakeHead[1]];
			break;
			case 2 ://向下
			snakeHead = [snakeHead[0],snakeHead[1]+1];
			break;
			case 3 ://向左
			snakeHead = [snakeHead[0]-1,snakeHead[1]];
			break;
			case 4 ://向上
			snakeHead = [snakeHead[0],snakeHead[1]-1];
			break;
		

		//超界,或撞上自己。结束,重置。
		if(in_array(snakeHead,snakeArr) || snakeHead[0]<0 || snakeHead[0]>this.x || snakeHead[1]<0 || snakeHead[1]>this.y)
			window.clearInterval(this.timer);
			alert('虽然失败了,不过没关系,还可以再来一局!本局得分:'+this.score);
			this.init();
			return;
		

		 snakeArr.push(snakeHead);//将蛇头放入数组


		 this.drawCell(snakeHead,1);
		 if(snakeHead.toString() != this.coolPoint.toString())
			var tail = snakeArr.shift();//移除蛇尾。
			this.drawCell(tail,0);

		else//撞到coolPoint
			this.createCoolPoint();
			this.drawCell(this.coolPoint,2);
			this.score = this.score + 10;
			this.scoreele.innerHTML="我的得分:"+this.score;
			this.speed =  Math.ceil((this.score + 1)/100);
			this.speedele.innerHTML="当前速度:"+this.speed;
		

		this.setTimer();

	,

	createCoolPoint:function()//随机生成coolPoint,不在代表snakeArr的数组中。		
		do
			this.coolPoint = [getRandom(this.x),getRandom(this.y)];
		while(in_array(this.coolPoint,this.snakeArr));
	,
	changeDiretion:function()
		//更换移动方向。下一步的移动方向。
		var that = this;
		document.onkeydown=function(event)
			var e = event || window.event || arguments.callee.caller.arguments[0];
			var direction = that.direction;
			var keyCode = e.keyCode;

			switch(keyCode)
				case 39://右
				if(direction!=1 && direction !=3)
					that.nextDirection = 1;
				

				break;
				case 40://下
				if(direction!=2 && direction !=4)
					that.nextDirection = 2;
				
				break;
				case 37://左
				if(direction!=1 && direction !=3)
					that.nextDirection = 3;
				
				break;
				case 38://上
				if(direction!=2 && direction !=4)
					that.nextDirection = 4;
				
				break;

				default:
				break;
			
		; 
	,
	drawSnake:function()
		//绘制初始小蛇。
		var snakeArr = this.snakeArr;
		for (var i = 0,sLen=snakeArr.length; i < sLen; i++) 
			this.drawCell(snakeArr[i],1);
		;

	,
	drawCell:function(pos,type)//绘制会用到的几种颜色的图。

		var colorArr = ['#fff','rgb(0, 0, 0)',"red"];
		var cxt = this.cxt;
		var area;
		cxt.fillStyle = colorArr[type];
		area = this.getCellArea(pos);
		cxt.fillRect(area[0],area[1],this.cellWidth-1,this.cellWidth-1);
	


function moveClock() 
    moveSnake(head.d);

var isMove = false;
function beginGame() 
    !isMove && setInterval(moveClock, 300);
    isMove = true;

//生成随机正整数 1到n之间。
function getRandom(n)
	return Math.floor(Math.random()*n+1)


//判断一个数组是否在另一个数组中。注意toString()
function in_array(stringToSearch, arrayToSearch) 
	for (s = 0; s < arrayToSearch.length; s++) 
		thisEntry = arrayToSearch[s].toString();
		if (thisEntry == stringToSearch.toString()) 
			return true;
		
	
	return false;

想直接下载代码的,请点击以下链接进入下载:

不会内卷/贪吃蛇小游戏 - 码云 - 开源中国 (gitee.com)

点击贪吃蛇项目代码即可看到相关的所有文件代码!

观看完了,麻烦给个点赞+收藏!!!

谢谢!!!

如果有更好的建议,可以私信或者在评论区留言一起讨论!!!

一条贪吃蛇的使命——零基础入门贪吃蛇游戏(附演示地址)

零基础入门贪吃蛇游戏

贪吃蛇是一款最常见、最经典、最受欢迎的小游戏之一。本篇文章带你零基础实现贪吃蛇游戏,一条蛇的使命从这里开始。

演示地址:贪吃蛇演示,可能会提示危险操作,请忽略,放心访问。

1、游戏描述

????贪吃蛇是一款非常经典的休闲类游戏。在一块固定大小的区域内,游戏玩家通过控制贪吃蛇的移动去吃食物,吃到食物的蛇身体变长。食物被蛇吃到后立马消失,并再次随机产生。蛇撞到四周墙壁或者自己身体时死亡。

2、前期准备

2.1 具备技能

????本游戏所说是零基础,但你具备以下技能最佳:
????1、 HTML(主要是div盒子模型,canvas画布)
????2.、CSS (为你好看的游戏界面做准备)
????3.、JavaScript (让小蛇动起来,逻辑代码实现)

2.2 开发工具

????为提高开发速率,选择一款优秀的开发工具也很重要,这里小编推荐 sublime text3,轻巧方便,可以去百度下载,也可以关注小编公众号“C you again”,私信获取破解中文版。当然你足够优秀,使用记事本小编也不拦着。

3、实现目标

????本篇文章欲带你实现以下功能
????1、基本贪吃蛇(蛇的移动,吃食物,产生食物,增加分数)
????2、增加 暂停游戏/继续游戏功能
????3、再来一局功能(贪吃蛇死亡后有再来一局提示)

4、按键约定

????为方便玩家游戏,对操作按键做以下约定:
???? 1、上、下、左、右按键分别操作贪吃蛇的四个运动方向
???? 2、“+”、“-”按键分别代表贪吃蛇的加速、减速
???? 3.、空格键代表游戏暂停/继续

5、实现原理

????1、利用canvas画布完成运动场地、食物、贪吃蛇的展示
????2、利用数组存储贪吃蛇的坐标位置
????3、利用上、下、左、右键改变贪吃蛇的蛇头坐标
????2、不断重新绘制页面,造成贪吃蛇运动的错觉

6、实现逻辑

//伪代码
function 初始化数据(){
    1、初始化贪吃蛇运动区域大小
    2、初始化canvas画布山下文对象
    3、初始化贪吃蛇的坐标
    4、初始化贪吃蛇运动的方向
    5、初始化玩家分数
    6、初始化贪吃蛇的速度
    7、初始化食物
    8、初始化蛇
    9、初始化蛇的状态
 }
function 开始游戏(){
  interval = setInterval(运动方法(), speed);
  document.onkeydown = function(event) {
		var event = event || window.event;
		按键监控方法(event.keyCode);
	}
}

function 按键监控方法(key){
   switch(key){
      case: 37
      左
      break;
       case: 38
      上
      break;
       case: 39
      右
      break;
       case: 40
      下
      break;
      case: 32
      开始/暂停
      break;
      case: 107
      加速
      break;
      case: 109
      减速
      break;
   }
}

function 运动方法(){
  switch(moveTo){
     case 0:
       向左运动代码;
       break;
      case 1:
       向上运动代码;
       break;
      case 2:
       向右运动代码;
       break;
      case 3:
       向下运动代码;
       break;
  }
  画地图方法();
  画食物方法();
  画蛇方法();
  是否吃到食物方法();
  是否死亡方法();
}

function 画地图方法(){
  画地图代码实现.....
}

function 画食物方法(){
   画食物代码实现.....
}

function 画蛇方法(){
   画蛇代码实现.....
}
function 是否吃到食物方法(){
  if(蛇头左上角的坐标==食物左上角的坐标){
     //吃到食物
     1、分数加一;
     2、重新绘制食物
     3、增加蛇身
  }
}

function 是否死亡方法(){
   1、判断蛇头左上角坐标是否越过上、下、左、右任一墙壁;
   2、判断蛇头左上角坐标是否与自己身体相撞;
}

7、实现过程

7.1 全局变量的定义与解释
变量名称 说明
ROWS 行数
COLS 列数
CONTEXT canvas上下文对象
BLOCK_SIZE 贪吃蛇运动的格子大小
snake[] 保存蛇的坐标
snakeCount 蛇身长度
foodX, foodY 食物的坐标
interval 计时
moveTo 蛇移动的方向
isStop 是否暂停
score 分数
speed 运动速度
7.2 方法的定义与解释
方法名称 参数 返回值 说明
init() 初始化方法
start() 游戏启动方法
reLoad() 页面重新加载方法
keydown(keyCode) 按键的码值 交互响应方法
isDie() 判断是否死亡方法
isEat() 判断是否吃到食物方法
addSnake() 增加蛇身方法
addFood() 制造食物方法
move() 移动方法
drawMap() 绘制运动区域方法
drawFood() 绘制食物方法
drawSnake() 绘制蛇方法
7.3 主要实现代码

1、初始化方法的实现

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(); //初始化食物
}

2、绘制运动区域方法的实现

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();
	}

}

3、判断是否死亡方法的实现

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‘;
		}
	}
}

4、绘制蛇方法的实现

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();
	}
}

8、结果演示

8.1 运行

技术图片

8.2 暂停

技术图片

8.3 死亡

技术图片

9、最后的话

????1、至此贪吃蛇已制作完成,谢谢你的支持
????2、本教程纯属个人思想构建,避免不了出现一些缺陷或错误,欢迎你批评指正
????3、如果你对那部分不太理解或有更好的解决办法,请在公众号“C you again”私信与我交流
????4、获取源码请搜索公众号“C you again”或扫描下面二维码,回复“贪吃蛇”
????5、转载请标明来源
????6、其它游戏教程请公众号私信获取
技术图片



















以上是关于HTML实现简单的贪吃蛇小游戏(附完整源码)的主要内容,如果未能解决你的问题,请参考以下文章

C语言实现贪吃蛇小游戏!(超简单详细)详细思路+源码分享

一条贪吃蛇的使命——零基础入门贪吃蛇游戏(附演示地址)

HTML+CSS+JS实现 ❤️贪吃蛇游戏源码❤️

HTML+CSS+JS实现 ❤️贪吃蛇游戏源码❤️

C实现贪吃蛇游戏练手项目

Web前端---HTML+CSS+JS实现的贪吃蛇游戏