现在的位置: 首页 > 综合 > 正文

用html5实现贪食蛇游戏

2013年02月24日 ⁄ 综合 ⁄ 共 5559字 ⁄ 字号 评论关闭

  前几天,我在图书馆看到一本书叫HTML5 Canvas基础教程,于是马上花了两天时间把它看完了。今天就用了那本书里讲到的html5的知识做了一个贪吃蛇游戏。游戏比较简单,有点小缺点,蛇头的反应有点迟钝。

   首先是html的代码:

<!DOCTYPE html>

<html>
	<head>
		<title>Greedy snake</title>
		<meta charset="gb2312">
		
		<link href="mygame.css" rel="stylesheet" type="text/css">
		
		<script type="text/javascript" src="jquery.js"></script>
		<script type="text/javascript" src="mygame.js"></script>
	</head>
	
	<body>
		<div id="game">
			<div id="gameUI">
				<div id="gameIntro">
					<h1>Greedy snake</h1>
					<p>This is an awesome game.</p>
					<p><a id="gamePlay" class="button" href="">Play</a></p>
				</div>
				<div id="gameStats">
					<p>Scores: <span class="gameScore"></span></p>
					<p><a class="gameReset" href="">Reset</a></p>
				</div>
				<div id="gameComplete">
					<h1>Game over!</h1>
					<p>You got <span class="gameScore"></span> scores.</p>
					<p><a class="gameReset button" href="">Play again</a></p>
				</div>
			</div>
			<canvas id="gameCanvas" width="350" height="600">
				<!-- Insert fallback content here -->
			</canvas>
		</div>
	</body>
</html>

   然后是css的代码

* { margin: 0; padding: 0; }
html, body { height: 100%; width: 100%; }
canvas { display: block; }

body {
	background: #000;
	color: #fff;
	font-family: Verdana, Arial, sans-serif;
	font-size: 18px;	
}

h1 {
	font-size: 30px;
}

p {
	margin: 0 20px;
}

a {
	color: #fff;
	text-decoration: none;
}

a:hover {
	text-decoration: underline;
}

a.button {
	background: #185da8;
	border-radius: 5px;
	display: block;
	font-size: 30px;
	margin: 40px 0 0 45px;
	padding: 10px;
	width: 200px;
}

a.button:hover {
	background: #2488f5;
	color: #fff;
	text-decoration: none;
}

#game {
	height: 600px;
	left: 50%;
	margin: -300px 0 0 -175px;
	position: relative;
	top: 50%;
	width: 350px;
}

#gameCanvas {
	background: #001022;
}

#gameUI {
	height: 600px;
	position: absolute; /* Places UI on top of the canvas */
	width: 350px;
}


#gameIntro, #gameComplete {
	background: rgba(0, 0, 0, 0.5);
	margin-top: 100px;
	padding: 40px 0;
	text-align: center;
}

#gameStats {
	font-size: 14px;
	margin: 20px 0;
}

#gameStats .gameReset {
	margin: 20px 20px 0 0;
	position: absolute;
	right: 0;
	top: 0;
}

  最后是js的代码

 

$(document).ready(function() {
	var canvas = $("#gameCanvas");
	var context = canvas.get(0).getContext("2d");
	
	// Canvas dimensions
	var canvasWidth = canvas.width();
	var canvasHeight = canvas.height();
	
	// Game settings
	var playGame;
	var score;
	var platformX;
	var platformY;
	var platformWidth;
	var platformLength;
	var numX;
	var numY;
	var pWidth;
	var pLength;
	var snakes;
	var food;
	var sLength;
	
	// Keyboard keycodes using descriptive variables (enumeration)
	var arrowLeft = 37;
	var arrowUp = 38;
	var arrowRight = 39;
	var arrowDown = 40;
	
	// Game UI
	var ui = $("#gameUI");
	var uiIntro = $("#gameIntro");
	var uiStats = $("#gameStats");
	var uiComplete = $("#gameComplete");
	var uiPlay = $("#gamePlay");
	var uiReset = $(".gameReset");
	var uiScore = $(".gameScore");
	
	//snake
	var cube = function(x, y) {
		this.x = x;
		this.y = y;
		this.direction='right';
		this.snake = true;
	};
	
	// Reset and start the game
	function startGame() {
		// Reset game stats
		uiScore.html("0");
		uiStats.show();
		
		// Set up initial game settings
		playGame = false;
		score = 0;
		platformWidth=300;
		platformLength=500;
		platformX=canvasWidth/2-platformWidth/2;
	  platformY=60;
	  numX=12;
	  numY=20;
	  pWidth=platformWidth/numX;
	  pLength=platformLength/numY;
	  snakes = null;
	  snakes = new Array();
	  
	  //create sanke 
	  snakes.push(new cube(0,0));
	  snakes.push(new cube(1,0));
	  snakes.push(new cube(2,0));
		sLength=3;
		
		 //create food
	  disFood();
		
		// Set up keyboard event listeners
		$(window).keydown(function(e) {
			var keyCode = e.keyCode;
			if (playGame == false) {
				playGame = true;
				
				// Start the animation loop
				animate();
			};
			var olddirection=snakes[sLength-1].direction;
			if (keyCode == arrowLeft && olddirection!='right') {//new direction can not be opposite to old direction
				snakes[sLength-1].direction = 'left';
			} else if (keyCode == arrowRight && olddirection!='left') {
				snakes[sLength-1].direction = 'right';
			} else if (keyCode == arrowUp && olddirection!='down') {
				snakes[sLength-1].direction = 'up';
			} else if (keyCode == arrowDown && olddirection!='up') {
				snakes[sLength-1].direction = 'down';
			};		
		});
		
		// Start the animation loop
		animate();
	};
	
	// Inititialise the game environment
	function init() {
		uiStats.hide();
		uiComplete.hide();
		
		uiPlay.click(function(e) {
			e.preventDefault();
			uiIntro.hide();
			startGame();
		});
		
		uiReset.click(function(e) {
			e.preventDefault();
			uiComplete.hide();
			$(window).unbind("keydown");
			startGame();
		});
	};
	
	// Animation loop that does all the fun stuff
	function animate() {
		// Clear
		context.clearRect(0, 0, canvasWidth, canvasHeight);	
		
		context.strokeStyle="rgb(255,255,255)";
		 for(var i=0;i<numX;i++)
    {
        for(var j=0;j<numY;j++)
        {
		      context.strokeRect(platformX+i*pWidth,platformY+j*pLength,pWidth,pLength); 
		    }
		};

		context.fillStyle="rgb(255,0,0)";
		for(var i=0;i<sLength;i++)
    {
    	 context.fillRect(platformX+snakes[i].x*pWidth,platformY+snakes[i].y*pLength,pWidth,pLength);
    };
    
    context.fillStyle="rgb(0,255,0)";
    context.fillRect(platformX+food.x*pWidth,platformY+food.y*pLength,pWidth,pLength);
    var x=y=0;
    if(snakes[sLength-1].direction=='left')
    {
         x = -1;
         y = 0;
    }else if(snakes[sLength-1].direction=='right')
    {
         x = 1;
         y = 0;
    }else if(snakes[sLength-1].direction=='up')
    {
         x = 0;
         y = -1;
    }else if(snakes[sLength-1].direction=='down')
    {
         x = 0;
         y = 1;
    };
    nx = snakes[sLength-1].x + x;
    ny = snakes[sLength-1].y + y;
    if(nx<0 || nx>=numX || ny<0 || ny>=numY)//whether hit the border
    {
         gameover();
    }
    else if(isInSnake(nx,ny))//whether hit itself
    {
         gameover();
    }else if(score==60)//when got 60 scores
    {
         gameover();
    };   
    //move snake
    var newone=new cube(nx,ny);
    newone.direction=snakes[sLength-1].direction;
    snakes.push(newone);
    if(nx==food.x&&ny==food.y)//eat food
    {
      disFood();
      sLength++;
      uiScore.html(++score);
    }else{
    	snakes.shift();
    };
    
		if (playGame){
			// Run the animation loop again in 33 milliseconds
			setTimeout(animate, 500);
		};
	};
	
	function isInSnake(a,b)
	{
		 for(var i=0;i<sLength;i++)
		 {
		 	 if(snakes[i].x == a&&snakes[i].y == b)
		 	 {
		 	 	  return true;
		 	 };
		 };
		 return false;
	};
	
	function disFood()
	{
		 var x2,y2;
		 var flag=true;
		 while(flag)
		 {
		 	 x2=Math.floor(Math.random()*numX);
		 	 y2=Math.floor(Math.random()*numY);
		 	 flag = isInSnake(x2,y2);
		 };
	   food=new cube(x2,y2);
	   food.snake = false;
	};
  
	function gameover()
  {
       // Game over				
				playGame = false;
				uiStats.hide();
				uiComplete.show();
		
				// Reset event handlers
				$(window).unbind("keydown");
  };
	init();
});

  有问题或者意见的可以联系下我。

抱歉!评论已关闭.