js贪食蛇--2

本文介绍了一个基于经典贪食蛇游戏的改进版本,通过引入超级食物和区分蛇的不同部分(蛇头、蛇身、蛇尾),增加了游戏的趣味性和挑战性。详细阐述了游戏的实现原理,包括蛇的移动逻辑、食物的生成与交互机制,以及如何通过JavaScript代码实现这些功能。此外,还展示了游戏的试玩链接,让读者能够亲身体验这一有趣的游戏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前做过一个简单的贪食蛇,这个相对与以前的改进了下,加入了超级食物及区分了蛇头、蛇身、蛇尾,设计思想基本一样

试玩http://snailanger.free3v.net/snake.html

js

var sx = 12;//定义蛇的位置
var sy = 13;
var fx;//定义食物位置
var fy;
var map;//全局二维数组
var canvas;//游戏画布
var canvasdiv;//画布对象
var food;//食物对象
var manyFoods;//所有食物数组
var tempfood;//临时食物对象
var snake;//蛇对象
var tempsnake;//临时蛇对象
var snakeBody;//蛇身体数组
var step_x = 1;//移动参数
var step_y = 0;
var run;//Interval对象
var score = 0;//分数
var eatcount = 0;//所吃食物数
var speed = 150;//速度
//游戏画布
canvas = {
	createCanvas:function(){
        canvasdiv = document.createElement("div");  
        canvasdiv.className = "canvas";  
        document.documentElement.appendChild(canvasdiv); 
        return true;
   }
};
//蛇
snake = {
	createSnakeBody:function(flag){ //创建一个蛇
		var snakes = document.createElement("div");
		switch(flag){
			case 0: snakes.className = "snaketag"; break; //蛇头
			case 1: snakes.className = "snakebody"; break; //蛇身
			case 2: snakes.className = "snakehead"; break; //蛇尾
			default:snakes.className = "snakehead";
		}
		snakes.style.left = sx * 15 + 1 + "px";
		snakes.style.top = sy * 15 + 1 + "px";
		snakes.setAttribute("current_x",sy);
		snakes.setAttribute("current_y",sx);
		return snakes;
	},
	setSnakeBody:function(){ //设置蛇的各部位
		snakeBody[0].className = "snaketag";
		for(var i=1;i<snakeBody.length-1;i++){
			snakeBody[i].className = "snakebody";
		}
	}
};
//食物
food = {
	createFood:function(flag,tscore,classname){ //创建一个食物,flag:食物类型,tscore:食物分数,classname:食物样式
		this.createFoodLocation();
		var foods = document.createElement("span");
		foods.className = classname;
		foods.setAttribute("score",tscore); 
		foods.setAttribute("foodtype",flag);
		foods.setAttribute("fx",fx);
		foods.setAttribute("fy",fy);
		foods.style.left = fx * 15 + 1 + "px";
		foods.style.top = fy * 15 + 1+ "px";
		return foods;
	},
	createFoodLocation:function(){ //生成食物位置
		fx = parseInt(Math.random()*29);
		fy = parseInt(Math.random()*29);
		if(!map[fy][fx]==0){ //如果该位置为蛇或食物,则重新生成
			this.createFoodLocation();
		}
	}
};
//蛇前进
function forward(){
	sx += step_x; //获得前方位置坐标
	sy += step_y;
	if(sx>29 || sx<0 || sy>29 || sy<0){ //是否碰到边框,如是,游戏结束
		gameOver();
	}
	var nextPosition = map[sy][sx]; //前方位置在地图中的标记
	switch(nextPosition){
        case 0: //为空
            go(); //前进一步
            break;
        case 1: //蛇身体
            gameOver(); //游戏结束
            break;
        case 2: //食物1
            eat(nextPosition); //吃掉
            break;
        case 3: //食物2
            eat(nextPosition); //吃掉
            break;
	}
}
//蛇前进一步
function go(){
	var temp_x = snakeBody[0].getAttribute("current_x");//获取蛇尾巴在地图中坐标
	var temp_y = snakeBody[0].getAttribute("current_y");
	map[temp_x][temp_y] = 0; //将尾巴子地图中位置置空
	canvasdiv.removeChild(snakeBody[0]); //将尾巴从地图中删除
	snakeBody.shift(); //将尾巴从蛇身删除
	createSnake(); //在前方生成一节蛇,同时将最后一节作为新的尾巴
}
//吃食物
function eat(flag){
	var temp_food;
	if(flag==2){ //食物1
		if(temp_food=removeFood(0)){ //删除食物,并返回所删食物对象
			createFood(0,100,"food",2); //生成新的食物1
			score += temp_food.getAttribute("score")*1; //计算该食物分数 
		}
	}else if(flag==3){ //食物2
		if(temp_food=removeFood(1)){ //删除食物,并返回所删食物对象
			score += temp_food.getAttribute("score")*1; //计算该食物分数 
		}
	}
	createSnake(); //在当前食物位置生成一节蛇
	++eatcount; //所吃食物数增加
	if(eatcount%3==0){ //每吃掉3个食物,速度加7
		speed -= 7;
		begin(); //以新的速度运动
	}
	document.getElementById("count").innerHTML = score;
}
//生成一节蛇
function createSnake(flag){
	 tempsnake = snake.createSnakeBody(flag); //生成一个蛇元素
	 snakeBody.push(tempsnake); //添加到蛇身数组中
	 snake.setSnakeBody(); //修改蛇身,蛇尾,蛇头
	 canvasdiv.appendChild(tempsnake);//添加到画布中
	 map[sy][sx] = 1; //地图中该位置置1.表示是蛇
}
//生成一个食物
function createFood(type,scores,cname,val){
	 tempfood = food.createFood(type,scores,cname); //生成一个食物元素
	 canvasdiv.appendChild(tempfood); //添加到画布中
	 manyFoods.push(tempfood); //添加到食物数组中
	 map[fy][fx] = val; //地图中该为置置成相应标记
	 if (parseInt(Math.random() * 4) == 1 && manyFoods.length == 1) { //是否生成特殊食物
		if (manyFoods.length == 1) {
			createFood(1, 500, "superfood", 3); //生成特殊食物
		    setTimeout("removeFood(1)",3500); //特殊食物在指定时间后消失
		}
	}
}
//删除食物
function removeFood(flag,type){
	for(var i=0;i<manyFoods.length;i++){
		if(manyFoods[i].getAttribute("foodtype")==flag){ //如果数组中取出的食物与所删食物类型相同,则删除
			tempfood = manyFoods[i]; //保存所删的食物
			canvasdiv.removeChild(manyFoods[i]); //从画布中移除
			manyFoods.splice(i,1); //从食物数组中删掉
			return tempfood; //返回删掉的食物元素
		}
	}
	return null;
}
//游戏结束
function gameOver(){
    if (confirm('Game Over,是否重新开始?')) {  
        reStart();  
    }  
}
//键盘事件
function keyDown(e){
	 var keycode;
         if(e){
             keycode = e.keyCode;
         }else{
             keycode = window.event.keyCode;
         }
	switch(keycode){
		case 37: //左
		    changeDirect(-1,0);
		    break;
		case 38: //上
		    changeDirect(0,-1);
		    break;
		case 39: //右
		    changeDirect(1,0);
		    break;
		case 40: //下
		    changeDirect(0,1);
		    break;
		case 83: //s暂停
		    stop();
		    break;
	}
}
//设置运动方向
function changeDirect(fix_x,fix_y){
	isstop = true; //启用暂停标记
	if(!(fix_x+step_x==0 || fix_y+step_y==0)){ //判断是否是相反方向
	    step_x = fix_x; //设置运动参数
	    step_y = fix_y;
	}
	begin(); //以新的方向运动
}
//游戏初始化
function init(){
	map = new Array(); //初始化地图数组
	for(var i=0;i<30;i++){
		map.push(new Array());
		for(var j=0;j<30;j++){
			map[i].push(0);
		}
	}
	snakeBody = new Array();
	manyFoods = new Array();
	for(var i=12;i<15;i++){ //生成蛇
		sx = i;
        createSnake(i-12);
	}
	createFood(0,100,"food",2); //生成食物
}
//开始运动
function begin(){
	if(run != null){ //如果当前正在运动,则清掉
		window.clearInterval(run);
	}
        run = window.setInterval('forward()', speed);
}
//暂停
function stop(){
	window.clearInterval(run);
}
//重新开始
function reStart(){
	window.clearInterval(run);
	location.reload(true);
}
document.onkeydown = keyDown; //绑定事件
if(canvas.createCanvas()){ //运行游戏
	init();
}


css

body {  
    font-size: 14px;  
}  
.info_div{  
    margin: 100px;  
    float: right;  
}  
.info_div span{  
    margin: 10px;  
    display: block;  
}  
.count{
	font-size:33px
}
.canvas{  
    width: 450px;  
    height: 450px;  
    position: absolute;
    left:50%;
    margin-left:-220px;
    border:1px solid gray
}  
table{  
    width: 450px;  
    height: 450px;  
    border-collapse:collapse;  
    overflow: hidden;  
}  
table,tr,td{  
    border: 1px solid gray;  
}  
.snakebody{  
    background-color: red;  
}  
.snakehead{
	background-color: blue;  
}
.snaketag{
	background-color: gray; 
}
.snakebody,.snakehead,.snaketag{
	width: 13px;  
    height: 13px;  
    position: absolute;  
}
.food{  
    background-color: green;  
    width: 11px;  
    height: 11px;  
    position: absolute;  
}
.superfood{  
    background-color: black;  
    width: 11px;  
    height: 11px;  
    position: absolute;  
}

html

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">

		<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

		<title>snake</title>
		<meta name="description" content="">
		<meta name="author" content="Thinkpad">
        <link rel="stylesheet" type="text/css" href="snake.css" />
		<script type="text/javascript" src="snake.js"></script>
	</head>

	<body>
		<div class="info_div">  
            <span>按上、下、左、右控制蛇移动</span>  
            <span>按S键暂停游戏,按方向键继续</span>  
            <span>得分:<span class="count" id="count">0</span> </span> 
        </div>
	</body>
</html>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值