贪吃蛇

思路:

    蛇

食物

食物被吃掉之后随机位置出现

食物不能随机在蛇身上

蛇头碰到蛇身就结束了,碰到墙也结束了。

碰到食物变长

蛇能动

蛇不能180度转头

蛇可以加速

1.神说:要有蛇 画蛇

    1.1蛇头

1.2蛇身

2.让蛇动起来

    2.1默认的开启游戏的时候有一个方向

2.2键盘控制方向

2.3animate定时器

3.有食物 随机投放

    3.1产生随机的位置

3.2判断位置是否在蛇头或者蛇身上,如果在 重新产生位置,如果不在画食物

4.吃食物

    4.1判断迟到食物  碰撞检测

4.2迟到食物添加蛇身

5.判断游戏结束

    5.1蛇头碰到蛇身

5.2蛇头碰到墙壁


<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

<script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.js"></script>

</head>

<style type="text/css">

/* 设置canvas画布的阴影 颜色为黑色  居中并且向下移动20px*/

canvas{

box-shadow: 0 0 10px 10px #000;

display: block;

margin: 20px auto;

}

</style>

<body>

<!-- 我们要操作的canvas -->

<canvas id="canvas" width="1200" height="800"></canvas>

</body>

<script>

$(function(){

/**

[Draw description]canvas 绘图的构造函数

@param{[type]} canvas [description]

**/

function Draw(canvas){

this.canvas = canvas;// 这里通过Canvas获取canvas对象

/**

[check description]检测浏览器是否支持canvas

@return bool fals支持e 表示不支持  true表示

**/

this.check = function(){

//检测浏览器是否支持canvas

if(!this.canvas.getContext){

console.log('浏览器不支持canvas');

return false;//返回false

}else{

return true;//否则返回true

}

}

/**

[main description]canvas 绘图的主函数

@return{[type]} [description]

**/

this.main = function(){

//检测兼容

if(!this.check()){

console.log('浏览器不支持canvas');

return false;//返回false

}

//获取canvas绘图的上下文:画笔

Draw.prototype.xt = this.canvas.getContext('2d');

// var _this=this;

//绘制蛇的初始图像

var snake=new Snake(this);

    snake.draw();

//随机产生食物

var food = randFood(snake);

food.draw();

//做一个动画的定时器

Draw.prototype.timer=setInterval(function(){

//清除旧的图像

Draw.prototype.xt.clearRect(0,0,this.canvas.width,this.canvas.height);

//改变蛇的位置

if(!snake.move()){

clearInterval(Draw.prototype.timer);

alert('游戏结束')

}

//重新绘制图像

snake.draw();

food.draw();

//是否吃到了食物

if(isRectHit(food,snake.head)){

Snake.prototype.isEatFood=true;

//重新随机产生食物

food=randFood(snake);

}

},80);

}

}

/**

*[Rect description]

* @param number x      矩形起始点x坐标

* @param number y      矩形起始点y坐标

* @param number width  矩形的宽度

* @param number height  矩形的高度

* @param string color  矩形的填充颜色

* @param object xt      画笔  上下文

**/

//添加蛇默认的移动方向,右,公有的属性,任何地方能够修改访问,并且和实例共享

Snake.prototype.direction=1;

//定义一个是否吃到食物的标记

Snake.prototype.isEatFood=false;

//画蛇的方法

Snake.prototype.draw=function(){

//画蛇头

this.head.draw();

//画蛇身

for(var i=0;i<this.body.length;i++){

this.body[i].draw(); //判断当前尾部方向

}

}

//让蛇动起来

Snake.prototype.move=function(){

//检测蛇头与蛇身

for(var i=0;i<this.body.length;i++){

console.log(this.body[i])

if(isRectHit(this.head,this.body[i])){

return false;

}

}

//检测碰撞到墙壁

if(this.head.x<40||this.head.y<40||

  this.head.x>$('#canvas')[0].width-40-40||

this.head.y>$('#canvas')[0].height-40-40){

return false;

}

//检测蛇头与蛇身

//for (item in this.body){

// if(isRectHit(this.head,this.body[item])){

// return false

// }

// }

//蛇的 移动方式

//给身体加一个头

var rect=new Rect(this.head.x,this.head.y,40,40,'gray');//这个蛇头长40px,宽40Px,颜色为红色

  //添加到身体开始的地方

this.body.splice(0,0,rect);

//去掉一个尾巴

if(Snake.prototype.isEatFood){

Snake.prototype.isEatFood=false;

      // 如果吃到食物了就重新给位置,即末尾添加一节,即蛇变长

  // 重新随机产生食物

}else{

this.body.pop();//如果没吃到末尾就砍掉一节,即蛇长度不变

}

switch(this.direction){

case 0:

this.head.y-=40//向上

    break;

case 1:

this.head.x+=40;//向下

    break;

case 2:

this.head.y+=40//向右

    break;

case 3:

this.head.x-=40;//左

    break;

}

return true;

}

//添加键盘监听

$(window).keydown(function(e){

switch(e.keyCode){

case 37://向右

if(Snake.prototype.direction==1){

return;

}

  Snake.prototype.direction=3;

  break;

//如果当前方向是向下的,不能改为向上

case 38:

if(Snake.prototype.direction==2){

return;

}

Snake.prototype.direction=0;

  break;

case 39:

if(Snake.prototype.direction==3){

return;

}

Snake.prototype.direction=1;

  break;

case 40:

if(Snake.prototype.direction==0){

return;

}

Snake.prototype.direction=2;

  break;

}

})

//构造对象方块

function Rect(x,y,width,height,color){

this.x = x;//定义Rect的x坐标

this.y = y;//定义Rect的y坐标

this.width = width; //,宽

this.height = height;//,高

this.color = color;//颜色

}

/**

* [draw description]  画矩形

* @return

**/

//画方块的方法

Rect.prototype.draw = function(){

Draw.prototype.xt.beginPath();//画一条新的路径。

Draw.prototype.xt.fillStyle = this.color;//颜色

Draw.prototype.xt.fillRect(this.x,this.y,this.width,this.height);//起始位置

Draw.prototype.xt.strokeRect(this.x,this.y,this.width,this.height);//落点位置


}

//创建蛇的对象

function Snake(obj){

//蛇头,,蛇头设成红色

this.head=new Rect(obj.canvas.width/2,obj.canvas.height/2,40,40,'red');

//蛇身

this.body=[];//表示多个身体

var x=this.head.x-40;//表示这个蛇身的x坐标=蛇头的x-40

var y=this.head.y;//表示这个蛇身=蛇头的y坐标

//循环创建身体

for(var i=0;i<3;i++){//画出3个方块,设置成灰色

var rect=new Rect(x,y,40,40,'gray');//创建新的身体,定义了x,y宽高颜色为灰色

this.body.push(rect);//将该函数添加到数组里面

x-=40;//x=x-40

}

}

//随机产生食物

function randFood(snake){

//是否在蛇身上

isInSnake = true;

while(isInSnake){

//产生两个位置 x,y

var x = getRandPosition(0,($('#canvas')[0].width-40)/40)*40;

var y = getRandPosition(0,($('#canvas')[0].height-40)/40)*40;

//创建食物矩形

var food = new Rect(x,y,40,40,'green');

isInSnake = false;

//判断这个位置是否在蛇上.

//是否是蛇头

if(isRectHit(food,snake.head)){

isInSnake = true;

continue;

}

//是否是蛇身

    for(var i=0;i<snake.body.length;i++){

if(isRectHit(food,snake.body[i])){

isInSnake = true;

break;

}

}

}

return food;

}

//产生随机函数

function getRandPosition(min,max){

return Math.round(Math.random()*(max-min)+min);

}

//判断矩形是否重合

function isRectHit(rect1,rect2){

var R1_min_x = rect1.x;

var R2_min_x = rect2.x;

var R1_min_y = rect1.y;

var R2_min_y = rect2.y;

var R1_max_x = rect1.x+40;

var R2_max_x = rect2.x+40;

var R1_max_y = rect1.y+40;

var R2_max_y = rect2.y+40;

var min_x = Math.max(R1_min_x,R2_min_x);

var max_x = Math.min(R1_max_x,R2_max_x);

var min_y = Math.max(R1_min_y,R2_min_y);

var max_y = Math.min(R1_max_y,R2_max_y);

if(min_x<max_x && min_y<max_y){

return true;

}else{

return false;

}

}

var draw = new Draw($('#canvas')[0]);//创建一个绘图的实例对象

draw.main();//调用main绘制图像

})

</script>

</body>

</html>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • 1.HTML5 canvas arcTo() 用于在画布上创建介于两个切线之间的弧。但是要注意请使用 stroke...
    清欢152365阅读 346评论 0 0
  • HTML canvasarcTo()方法 1.arcTo() 方法在画布上创建介于两个切线之间的弧/曲线。 2....
    Agonl_0929a阅读 216评论 0 1
  • 【canvas】 《2.6.5 面向对象基础复习补充:》 创建对象的方式: * var o = { name: '...
    夜幕小草阅读 367评论 0 0
  • arcTo()方法主要就是用于在画布Canvas上创建两条切线之间的弧线或者曲线。 确定一条弧线,那么就要有两条切...
    氟西汀_677f阅读 867评论 0 0
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    J_L_L阅读 1,493评论 0 4