js实现贪吃蛇

思路:

1.创建画布

2.创建的蛇头、身体、食物

3.蛇头、身体、食物随机产生坐标

4.设置蛇头的初始方向

5.设置按键改变蛇头方向

6.开启定时器,自动移动蛇头

7.判断是否吃到食物

8.碰撞则随机产生食物

9.食物被吃掉,蛇加一节,去掉原来的食物,生成新的食物

10.蛇跑起来:下一节到前一节的位置,蛇头根据方向变,删除原来的蛇,新建蛇;当出界时,游戏结束;当蛇头吃到自己的时候,游戏结束

<!DOCTYPE html>

<html>

<head>

<title></title>

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

<style>

  canvas{

  box-shadow: 0 0 10px #000;

  display: block;

  margin: 20px auto;

  }

</style>

</head>

<body>

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

</body>

<script>

$(function(){

function Draw(canvas){    //创建一个draw对象

this.canvas = canvas; //给drow对象复制canvas

this.check = function(){

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

                if(!this.canvas.getContext){

                return false; //表示不支持返回false

                }else{

                return true;  //表示支持返回true

                }

}

this.main = function(){

//检测兼容

if(!this.check()){

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

return false;//表示不支持返回false

}

//获取canvas绘制上下文

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

var snake = new Snake(this); //创建蛇的对象

snake.draw(); //调用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);

}

},200);

}

}

//随机产生食物

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;//第一个矩形的x最小边

var R2_min_x = rect2.x;//第二个矩形的x最小边

var R1_min_y = rect1.y;//第一个矩形的y最小边

var R2_min_y = rect2.y;//第二个矩形的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);//x最小值中的最大值

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

var min_y = Math.max(R1_min_y,R2_min_y);//y最小值中的最大值

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

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

return true;//碰撞一起返回true

}else{

return false;//没碰撞一起返回false

}

}

//判断举行是否重合

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

this.x=x;  //矩形起始点x坐标

this.y=y; //矩形起始点y坐标

this.width = width;   //矩形的宽度

this.height = height;  //矩形的高度

this.color = color; //矩形的填充颜色

}

Rect.prototype.draw = function(){//画矩形

Draw.prototype.xt.beginPath();  //在Draw添加画笔

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-20,40,40,'red');

//蛇身

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

var x = this.head.x - 40; //定义第一个蛇身的位置  蛇头的位置width/2-20-40

var y = this.head.y; //  竖直距离相同

//循环创建身体

for (var i = 0; i < 3; i++) {  //创建3个身体

var rect = new Rect(x,y,40,40,'gray');//创建矩形一个蛇的身体宽高40,颜色灰色

this.body.push(rect);  //每创建一个对象推一个rect到身体

x -=40; //x每个-40,y不变

}

}

//添加蛇默认的移动方向 向右 公有属性任何地方可以修改访问 实例共享

Snake.prototype.direction = 1;

//画蛇的方法

this.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(){

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(var i=0;i<this.body.length;i++){

console.log(this.body[i])

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

return false;

}

}

//加一个头

var rect = new Rect(this.head.x,this.head.y,40,40,'gray');

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

//从起始位置往后宽高40填充红色

//去掉一个尾巴

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;

}

})

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

draw.main();//调用main绘制函数

var rect1 = new Rect(0,0,40,40);

var rect2 = new Rect(0,0,40,40);

console.log(isRectHit(rect1,rect2));

})

</script>

</html>


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

推荐阅读更多精彩内容

  • HTML canvas 实现贪吃蛇的效果 思路:1. 画蛇 食物被吃掉之后随机位置出现 食物不能随机在蛇身上...
    Agonl_0929a阅读 500评论 0 1
  • 思路: 蛇 食物 食物被吃掉之后随机位置出现 食物不能随机在蛇身上 蛇头碰到蛇身就结束了,碰到墙也结束了。 碰...
    孤久成瘾_63e8阅读 388评论 0 0
  • <!DOCTYPE html> Document canvas{ box-s...
    慌拥_658c阅读 946评论 0 0
  • 贪吃蛇的思路与方法 1.设计蛇: 设计蛇的宽、高、长、蛇的状态、蛇的方向。 2.设计蛇的食物:设计食物的宽、高、位...
    guoshauili阅读 195评论 0 0
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2