前几天,我在图书馆看到一本书叫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();
});
有问题或者意见的可以联系下我。