canvas的贪吃蛇。

laidezhong 2012-02-28 05:28:41
加精
第一次写canvas ...

demo:http://xiaobude.com/app/snake




<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>HTML canvas 贪吃蛇</title>
<style type="text/css">
html,body{overflow:hidden;}
</style>
</head>

<body>


<canvas id="canvas" style="background:#eee;border:1px solid #ccc;">你的浏览器不支持canvas,请升级你的浏览器</canvas>
<br /><span style="color:#ccc;font-family:Arial;font-size:12px;">laidezhong(at)gmail.com</span>

<script type="text/javascript">

var setting = {
width:50,
height:25,
pixel:10,
fps:3,
gameOver : false,
paush : false,
color : "#ef0f6e",
border: "#ffffff",
level:{
"7":[1,0],
"11":[1,0],
"14":[1,0],
"20":[1,1],
"25":[1,0],
"30":[1,0],
"40":[1,1],
"50":[1,0],
"70":[1,0],
"90":[1,0],
"120":[1,0]
}
};

var snake = {
position : [ [2,0],[1,0],[0,0] ],
keyCode:39,
forward:[],
food:[],
draw : function(){
ctx.clearRect(0,0,setting.width*setting.pixel,setting.height*setting.pixel)
var length = this.position.length;
for(var k = length - 1;k >= 0;k--){
this.drawDotted( this.position[k] );
}
for(var k=0,kk=this.food.length;k<kk;k++){
this.drawDotted( this.food[k] );
}
},
next:function(){
var keyCode = snake.keyCode;
var forwardList = {
"37" : [-1,0],
"38" : [0,-1],
"39" : [1,0],
"40" : [0,1]
};
if( forwardList[keyCode] && snake.forward[0] != forwardList[keyCode][0] && snake.forward[1] != forwardList[keyCode][1] ) snake.forward = forwardList[keyCode];
var length = this.position.length;
var last = [ this.position[length-1][0],this.position[length-1][1] ];
for(var k = length - 1;k >= 0;k--){
if(k){
this.position[k][0] = this.position[k-1][0];
this.position[k][1] = this.position[k-1][1];
}
};
this.position[0][0] += this.forward[0];
this.position[0][1] += this.forward[1];
for(var k = length - 1;k >= 0;k--){
if(k){
if( this.position[0][0] == this.position[k][0] && this.position[0][1] == this.position[k][1] )setting.gameOver = true;
if( this.position[0][0] < 0 || this.position[0][1] < 0 || this.position[0][0] >= setting.width || this.position[0][1] >= setting.height)setting.gameOver = true;
}
}
for(var k=0,kk=this.food.length;k<kk;k++){
if( this.position[0][0] == this.food[k][0] && this.position[0][1] == this.food[k][1] ){
this.position.push( last );
this.createFood(k);
}
}
if( setting.level[length]){
if( setting.level[length][0] )setting.fps+=setting.level[length][0];
if( setting.level[length][1] ){
this.createFood(this.food.length)
}
setting.level[length] = false;
}
},
createFood:function(key){
var r = function(n){
return parseInt(Math.random()*n) + 1;
}
var x = r(setting.width-1);
var y = r(setting.height-1);
var length = this.position.length;
for(var k =0;k<length;k++){
if( x == this.position[k][0] && y == this.position[k][1] ){
createFood(key);
return;
}
}
this.food[key] = [x,y];
},
drawDotted:function(pos){
ctx.fillRect( pos[0]*setting.pixel, pos[1]*setting.pixel,setting.pixel,setting.pixel );
ctx.strokeRect( pos[0]*setting.pixel, pos[1]*setting.pixel,setting.pixel,setting.pixel );
}
}

document.body.onkeydown = function(e){
e = e || window.event;
var keyCode = e.keyCode;
if(keyCode == 32){
setting.paush = !setting.paush;
return;
};
snake.keyCode = keyCode;
}

var canvas = document.getElementById("canvas");
canvas.width = setting.width * setting.pixel;
canvas.height = setting.height * setting.pixel;
var ctx=canvas.getContext("2d");
ctx.fillStyle = setting.color;
ctx.strokeStyle = setting.border;


snake.createFood(0);
loop();
function loop(){
if(!setting.paush){
snake.next();
if(setting.gameOver){
alert("game over");
return;
};
snake.draw();
}
setTimeout( loop,1000/setting.fps );
}


</script>

</body>
</html>

...全文
3997 117 打赏 收藏 转发到动态 举报
写回复
用AI写文章
117 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yikes-异客 2012-07-13
  • 打赏
  • 举报
回复
很不错,我的opera,chrome,firefox浏览器上都能玩
wuezs 2012-07-13
  • 打赏
  • 举报
回复
厉害啊啊啊啊
wuezs 2012-07-13
  • 打赏
  • 举报
回复
厉害。。。
cd1991619 2012-07-12
  • 打赏
  • 举报
回复
玩到后面会报错: ceateFood方法找不到
然后表示可以先用空格暂停, 然后很悠闲地换方向...
  • 打赏
  • 举报
回复
楼主真N,想学习
new_lb 2012-03-11
  • 打赏
  • 举报
回复
要是每行后有注释那就更好了。
arnold 2012-03-09
  • 打赏
  • 举报
回复
努力学习谢谢分享。
sujie315 2012-03-09
  • 打赏
  • 举报
回复
哈哈 我也去试试看 谢了!
xiaokangbuben 2012-03-09
  • 打赏
  • 举报
回复
代码照贴,完全没反应,什么情况?
yanxuan23 2012-03-09
  • 打赏
  • 举报
回复
搜狗的浏览器表示不支持canvas
sfywyq 2012-03-08
  • 打赏
  • 举报
回复
看看能玩不
索隆 2012-03-07
  • 打赏
  • 举报
回复
大牛!
22too 2012-03-07
  • 打赏
  • 举报
回复
我也试试
  • 打赏
  • 举报
回复
不错啊,玩了半天
wendongsoft 2012-03-07
  • 打赏
  • 举报
回复
好东西,学习啦!!!
cart55free99 2012-03-07
  • 打赏
  • 举报
回复
相当厉害!!!!!
酸狐狸 2012-03-07
  • 打赏
  • 举报
回复
。。。俄罗斯方块。。。贪吃蛇。。。。还有什么啊。。。。大哥些,你们太牛啦。。。
纳尼 2012-03-07
  • 打赏
  • 举报
回复
我也去试试看
crmFather 2012-03-07
  • 打赏
  • 举报
回复
html 5,must be IE9.0+ can support this game
t1n1t1 2012-03-06
  • 打赏
  • 举报
回复
不错, 不过玩的过程中好像出BUG了
加载更多回复(70)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧