貪吃蛇

思路:

? ? 蛇

食物

食物被吃掉之后隨機(jī)位置出現(xiàn)

食物不能隨機(jī)在蛇身上

蛇頭碰到蛇身就結(jié)束了桨啃,碰到墻也結(jié)束了端衰。

碰到食物變長

蛇能動(dòng)

蛇不能180度轉(zhuǎn)頭

蛇可以加速

1.神說:要有蛇 畫蛇

? ? 1.1蛇頭

1.2蛇身

2.讓蛇動(dòng)起來

? ? 2.1默認(rèn)的開啟游戲的時(shí)候有一個(gè)方向

2.2鍵盤控制方向

2.3animate定時(shí)器

3.有食物 隨機(jī)投放

? ? 3.1產(chǎn)生隨機(jī)的位置

3.2判斷位置是否在蛇頭或者蛇身上当宴,如果在 重新產(chǎn)生位置,如果不在畫食物

4.吃食物

? ? 4.1判斷遲到食物? 碰撞檢測(cè)

4.2遲到食物添加蛇身

5.判斷游戲結(jié)束

? ? 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">

/* 設(shè)置canvas畫布的陰影 顏色為黑色? 居中并且向下移動(dòng)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 繪圖的構(gòu)造函數(shù)

@param{[type]} canvas [description]

**/

function Draw(canvas){

this.canvas = canvas;// 這里通過Canvas獲取canvas對(duì)象

/**

[check description]檢測(cè)瀏覽器是否支持canvas

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

**/

this.check = function(){

//檢測(cè)瀏覽器是否支持canvas

if(!this.canvas.getContext){

console.log('瀏覽器不支持canvas');

return false;//返回false

}else{

return true;//否則返回true

}

}

/**

[main description]canvas 繪圖的主函數(shù)

@return{[type]} [description]

**/

this.main = function(){

//檢測(cè)兼容

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();

//隨機(jī)產(chǎn)生食物

var food = randFood(snake);

food.draw();

//做一個(gè)動(dòng)畫的定時(shí)器

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('游戲結(jié)束')

}

//重新繪制圖像

snake.draw();

food.draw();

//是否吃到了食物

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

Snake.prototype.isEatFood=true;

//重新隨機(jī)產(chǎn)生食物

food=randFood(snake);

}

},80);

}

}

/**

*[Rect description]

* @param number x? ? ? 矩形起始點(diǎn)x坐標(biāo)

* @param number y? ? ? 矩形起始點(diǎn)y坐標(biāo)

* @param number width? 矩形的寬度

* @param number height? 矩形的高度

* @param string color? 矩形的填充顏色

* @param object xt? ? ? 畫筆? 上下文

**/

//添加蛇默認(rèn)的移動(dòng)方向搪搏,右,公有的屬性架诞,任何地方能夠修改訪問,并且和實(shí)例共享

Snake.prototype.direction=1;

//定義一個(gè)是否吃到食物的標(biāo)記

Snake.prototype.isEatFood=false;

//畫蛇的方法

Snake.prototype.draw=function(){

//畫蛇頭

this.head.draw();

//畫蛇身

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

this.body[i].draw(); //判斷當(dāng)前尾部方向

}

}

//讓蛇動(dòng)起來

Snake.prototype.move=function(){

//檢測(cè)蛇頭與蛇身

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

console.log(this.body[i])

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

return false;

}

}

//檢測(cè)碰撞到墻壁

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;

}

//檢測(cè)蛇頭與蛇身

//for (item in this.body){

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

// return false

// }

// }

//蛇的 移動(dòng)方式

//給身體加一個(gè)頭

var rect=new Rect(this.head.x,this.head.y,40,40,'gray');//這個(gè)蛇頭長40px狗超,寬40Px弹澎,顏色為紅色

? //添加到身體開始的地方

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

//去掉一個(gè)尾巴

if(Snake.prototype.isEatFood){

Snake.prototype.isEatFood=false;

? ? ? // 如果吃到食物了就重新給位置,即末尾添加一節(jié)努咐,即蛇變長

? // 重新隨機(jī)產(chǎn)生食物

}else{

this.body.pop();//如果沒吃到末尾就砍掉一節(jié)苦蒿,即蛇長度不變

}

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;

}

//添加鍵盤監(jiān)聽

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

switch(e.keyCode){

case 37://向右

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

return;

}

? Snake.prototype.direction=3;

? break;

//如果當(dāng)前方向是向下的,不能改為向上

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;

}

})

//構(gòu)造對(duì)象方塊

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

this.x = x;//定義Rect的x坐標(biāo)

this.y = y;//定義Rect的y坐標(biāo)

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);//落點(diǎn)位置


}

//創(chuàng)建蛇的對(duì)象

function Snake(obj){

//蛇頭,竿屹,蛇頭設(shè)成紅色

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

//蛇身

this.body=[];//表示多個(gè)身體

var x=this.head.x-40;//表示這個(gè)蛇身的x坐標(biāo)=蛇頭的x-40

var y=this.head.y;//表示這個(gè)蛇身=蛇頭的y坐標(biāo)

//循環(huán)創(chuàng)建身體

for(var i=0;i<3;i++){//畫出3個(gè)方塊报强,設(shè)置成灰色

var rect=new Rect(x,y,40,40,'gray');//創(chuàng)建新的身體,定義了x,y寬高顏色為灰色

this.body.push(rect);//將該函數(shù)添加到數(shù)組里面

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

}

}

//隨機(jī)產(chǎn)生食物

function randFood(snake){

//是否在蛇身上

isInSnake = true;

while(isInSnake){

//產(chǎn)生兩個(gè)位置 x,y

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

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

//創(chuàng)建食物矩形

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

isInSnake = false;

//判斷這個(gè)位置是否在蛇上.

//是否是蛇頭

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;

}

//產(chǎn)生隨機(jī)函數(shù)

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]);//創(chuàng)建一個(gè)繪圖的實(shí)例對(duì)象

draw.main();//調(diào)用main繪制圖像

})

</script>

</body>

</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拱燃,一起剝皮案震驚了整個(gè)濱河市秉溉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碗誉,老刑警劉巖召嘶,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诗充,居然都是意外死亡苍蔬,警方通過查閱死者的電腦和手機(jī)诱建,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門蝴蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人俺猿,你說我怎么就攤上這事茎匠。” “怎么了押袍?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诵冒,是天一觀的道長。 經(jīng)常有香客問我谊惭,道長汽馋,這世上最難降的妖魔是什么侮东? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮豹芯,結(jié)果婚禮上悄雅,老公的妹妹穿的比我還像新娘。我一直安慰自己铁蹈,他們只是感情好宽闲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著握牧,像睡著了一般容诬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沿腰,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天览徒,我揣著相機(jī)與錄音,去河邊找鬼颂龙。 笑死吱殉,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的厘托。 我是一名探鬼主播友雳,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼铅匹!你這毒婦竟也來了押赊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤包斑,失蹤者是張志新(化名)和其女友劉穎流礁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罗丰,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡神帅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌抵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片找御。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绍填,靈堂內(nèi)的尸體忽然破棺而出霎桅,到底是詐尸還是另有隱情,我是刑警寧澤讨永,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布滔驶,位于F島的核電站,受9級(jí)特大地震影響卿闹,放射性物質(zhì)發(fā)生泄漏揭糕。R本人自食惡果不足惜萝快,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望著角。 院中可真熱鬧杠巡,春花似錦、人聲如沸雇寇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锨侯。三九已至嫩海,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囚痴,已是汗流浹背叁怪。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留深滚,地道東北人奕谭。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像痴荐,于是被迫代替她去往敵國和親血柳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.HTML5 canvas arcTo() 用于在畫布上創(chuàng)建介于兩個(gè)切線之間的弧生兆。但是要注意請(qǐng)使用 stroke...
    清歡152365閱讀 364評(píng)論 0 0
  • HTML canvasarcTo()方法 1.arcTo() 方法在畫布上創(chuàng)建介于兩個(gè)切線之間的弧/曲線难捌。 2....
    Agonl_0929a閱讀 221評(píng)論 0 1
  • 【canvas】 《2.6.5 面向?qū)ο蠡A(chǔ)復(fù)習(xí)補(bǔ)充:》 創(chuàng)建對(duì)象的方式: * var o = { name: '...
    夜幕小草閱讀 373評(píng)論 0 0
  • arcTo()方法主要就是用于在畫布Canvas上創(chuàng)建兩條切線之間的弧線或者曲線。 確定一條弧線鸦难,那么就要有兩條切...
    氟西汀_677f閱讀 887評(píng)論 0 0
  • 一阅畴、canvas簡介 1.1 什么是canvas形葬?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    J_L_L閱讀 1,516評(píng)論 0 4