利用HTML5 canvas和jQuery制作的貪吃蛇網(wǎng)頁(yè)小游戲:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Document</title>

<script src='js/jquery.min.js'></script>

<style>

#canvas{

box-shadow: 0 0 10px #000;

margin: 20px auto;

display: block;

}

</style>

</head>

<body>

<canvas id="canvas" width='1000' height='800'></canvas>

</body>

<script>

$(function(){

//canvas繪圖的構(gòu)造函數(shù)

function Draw(canvas){

this.canvas = canvas;//Draw私有屬性傳入dom獲取canvas;

//檢測(cè)兼容

this.check = function(){

if(!this.canvas.getContext){//如果this.canvas.getContext不存在就返回false如果存在就返回true

return false;

}else{

return true;

}

}

//繪圖的主函數(shù)

this.main = function(){

//判斷私有方法check()返回來(lái)的是什么如果是true就跳過

if(!this.check()){

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

}

//開整獲取畫筆

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

//創(chuàng)建蛇

var snake = new Snake(this)

//畫蛇

snake.draw();

//產(chǎn)生食物

var food = randFood(snake);

food.draw();

//動(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;

food = randFood(snake);

}

},100)

}

}

//創(chuàng)建矩形構(gòu)造函數(shù)

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

this.x= x; //創(chuàng)建私有屬性

this.y = y;

this.width = width;

this.height = height;

this.color = color;

}

//畫矩形的方法

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);//創(chuàng)建填充矩形

Draw.prototype.xt.strokeRect(this.x,this.y,this.width,this.height)//創(chuàng)建描邊矩形

}

//創(chuàng)建蛇

function Snake(obj){

this.head = new Rect(obj.canvas.width/2-20,obj.canvas.height/2,40,40,'red') //蛇頭喜庞,根據(jù)Rect構(gòu)造函數(shù)創(chuàng)建的實(shí)例對(duì)象

this.body = [] //蛇身

var x = this.head.x - 40; //定義變量

var y = this.head.y; //定義變量

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

for(var i=0;i<3;i++){

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

this.body.push(rect); //通過數(shù)組方法添加蛇身

x -= 40; //蛇身位置的調(diào)整

}

}

//默認(rèn)的移動(dòng)方向

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

}

}

//動(dòng)

Snake.prototype.move = function(){

if(this.head.x<40 || this.head.y<40 || this.head.x>$('#canvas')[0].width-80 ||this.head.y>$('#canvas')[0].height-80){

return false;

}

for(item in this.body){

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

return false;

}

}

//加一個(gè)頭

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

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

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

//去掉尾巴

if(this.isEatFood){

Snake.prototype.isEatFood = false;

//產(chǎn)生食物

}else{

this.body.pop()//去除一個(gè)身體

}

//

//改變方向

switch(this.direction){

case 0://方向?yàn)?蛇向上走

this.head.y -=40;

break;

case 1://方向?yàn)?蛇向右走

this.head.x += 40;

break;

case 2://方向?yàn)?蛇向下走

this.head.y +=40;

break;

case 3://方向?yàn)?蛇向左走

this.head.x -=40;

break;

}

return true;

}

//添加鍵盤事件

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

switch(e.keyCode){

case 37://鍵盤按左方向如果是右直接返回妙痹,如果不是方向變?yōu)樽?/p>

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

return;

}

Snake.prototype.direction = 3;

break;

case 38://鍵盤按左方向如果是下直接返回如撞鹉,果不是方向變?yōu)樯?/p>

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

return;

}

Snake.prototype.direction = 0;

break;

case 39://鍵盤按左方向如果是左直接返回,如果不是方向變?yōu)橛?/p>

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

return;

}

Snake.prototype.direction = 1;

break;

case 40://鍵盤按左方向如果是上直接返回蠢沿,如果不是方向變?yōu)橄?/p>

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

return;

}

Snake.prototype.direction = 2;

break;

}

})

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

function randFood(snake){

var isInSnake = true;//定義默認(rèn)食物在蛇身上

//判斷食物是否在蛇身上

while(isInSnake){

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

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

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

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; //返回一個(gè)食物矩形

}

//創(chuàng)建隨機(jī)坐標(biāo)函數(shù)

function getRandPosition(min,max){

return Math.round(Math.random()*(max-min)+min)//返回一個(gè)隨機(jī)的整數(shù)值

}

//碰撞檢測(cè)參數(shù)為兩個(gè)矩形

function isRectHit(rect1,rect2){

var R1_min_x = rect1.x;? //矩形1的x軸起始點(diǎn)

var R2_min_x = rect2.x; //矩形2的x軸起始點(diǎn)

var R1_min_y = rect1.y; //矩形1的y軸起始點(diǎn)

var R2_min_y = rect2.y; //矩形2的y軸起始點(diǎn)

var R1_max_x = rect1.x+40; //矩形1的x周的結(jié)束點(diǎn)

var R2_max_x = rect2.x+40; //矩形2的x周的結(jié)束點(diǎn)

var R1_max_y = rect1.y+40; //矩形1的y周的結(jié)束點(diǎn)

var R2_max_y = rect2.y+40; //矩形2的y周的結(jié)束點(diǎn)

var min_x = Math.max(R1_min_x,R2_min_x) //矩形1矩形2兩個(gè)中最大的x軸起始點(diǎn)

var max_x = Math.min(R1_max_x,R2_max_x) //矩形1矩形2兩個(gè)中最小的x軸結(jié)束點(diǎn)

var min_y = Math.max(R1_min_y,R2_min_y) //矩形1矩形2兩個(gè)中最大的y軸起始點(diǎn)

var max_y = Math.min(R1_max_y,R2_max_y) //矩形1矩形2兩個(gè)中最小的y軸結(jié)束點(diǎn)

//如果條件成立返回布爾值

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

return true;

}else{

return false;

}

}

//創(chuàng)建一個(gè)實(shí)例對(duì)象

var draw? = new Draw($('#canvas')[0])

//調(diào)用主函數(shù)

draw.main();

})

</script>

</html>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子盟庞,更是在濱河造成了極大的恐慌,老刑警劉巖汤善,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茫经,死亡現(xiàn)場(chǎng)離奇詭異巷波,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卸伞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門抹镊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人荤傲,你說我怎么就攤上這事垮耳。” “怎么了遂黍?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵终佛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我雾家,道長(zhǎng)铃彰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任芯咧,我火速辦了婚禮牙捉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敬飒。我一直安慰自己邪铲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布无拗。 她就那樣靜靜地躺著带到,像睡著了一般。 火紅的嫁衣襯著肌膚如雪英染。 梳的紋絲不亂的頭發(fā)上揽惹,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音四康,去河邊找鬼搪搏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛箭养,可吹牛的內(nèi)容都是我干的慕嚷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼毕泌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼喝检!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起撼泛,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤挠说,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后愿题,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體损俭,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛙奖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杆兵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雁仲。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琐脏,靈堂內(nèi)的尸體忽然破棺而出攒砖,到底是詐尸還是另有隱情,我是刑警寧澤日裙,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布吹艇,位于F島的核電站,受9級(jí)特大地震影響昂拂,放射性物質(zhì)發(fā)生泄漏受神。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一格侯、第九天 我趴在偏房一處隱蔽的房頂上張望鼻听。 院中可真熱鬧,春花似錦养交、人聲如沸精算。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至驮履,卻和暖如春鱼辙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玫镐。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工倒戏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恐似。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓杜跷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親矫夷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子葛闷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 首先設(shè)置canvas和樣式 #canvas{ box-shadow: 0 0 10px #000; margin:...
    淡然_x閱讀 349評(píng)論 0 0
  • HTML canvas 實(shí)現(xiàn)貪吃蛇的效果 思路:1. 畫蛇 食物被吃掉之后隨機(jī)位置出現(xiàn) 食物不能隨機(jī)在蛇身上...
    Agonl_0929a閱讀 502評(píng)論 0 1
  • 思路: 1.創(chuàng)建畫布 2.創(chuàng)建的蛇頭、身體双藕、食物 3.蛇頭淑趾、身體、食物隨機(jī)產(chǎn)生坐標(biāo) 4.設(shè)置蛇頭的初始方向 5.設(shè)...
    GY_3ade閱讀 1,029評(píng)論 0 0
  • 思路: 蛇 食物 食物被吃掉之后隨機(jī)位置出現(xiàn) 食物不能隨機(jī)在蛇身上 蛇頭碰到蛇身就結(jié)束了忧陪,碰到墻也結(jié)束了扣泊。 碰...
    孤久成癮_63e8閱讀 388評(píng)論 0 0
  • 貪吃蛇的思路與方法 1.設(shè)計(jì)蛇: 設(shè)計(jì)蛇的寬近范、高、長(zhǎng)延蟹、蛇的狀態(tài)评矩、蛇的方向。 2.設(shè)計(jì)蛇的食物:設(shè)計(jì)食物的寬阱飘、高稚照、位...
    guoshauili閱讀 196評(píng)論 0 0