色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

原生js+canvas實現貪吃蛇效果

瀏覽:107日期:2024-04-26 15:18:48

本文實例為大家分享了canvas實現貪吃蛇效果的具體代碼,供大家參考,具體內容如下

效果展示:

原生js+canvas實現貪吃蛇效果

源碼展示:

頁面布局展示:worm.html

<!DOCTYPE html><html> <head> <meta charset='utf-8'> <title>貪吃蛇</title> <style type='text/css'> canvas{ border: 1px solid black; } div{ width: 50px; height: 50px; border: 1px solid black; cursor: pointer; text-align: center; line-height: 50px; } </style> <script type='text/javascript' src='http://m.lshqa.cn/bcjs/Node.js' ></script> <script type='text/javascript' src='http://m.lshqa.cn/bcjs/Worm.js' ></script> <script src='http://m.lshqa.cn/bcjs/Stage.js' type='text/javascript' charset='utf-8'></script> <script type='text/javascript'> function load () { //創建一個舞臺 調用print方法打印 stage=new Stage(); //獲取ctx var mCanvas=document.getElementById('mCanvas'); ctx=mCanvas.getContext(’2d’); stage.print(ctx); startPrint(); } function changeDir(dir){ DIR=dir; } var task; var stage; var ctx; function startPrint () { task=window.setInterval(function () { stage.worm.step(); stage.print(ctx); }, SPEED); } function endPrint () { window.clearInterval(task); } </script> </head> <body onload='load()'> <canvas height='500'> </canvas> <table> <tr> <td></td> <td> <div onclick='changeDir(UP)'>UP</div> </td> <td></td> </tr> <tr> <td> <div onclick='changeDir(LEFT)'>LEFT</div> </td> <td></td> <td> <div onclick='changeDir(RIGHT)'>RIGHT</div> </td> </tr> <tr> <td></td> <td> <div onclick='changeDir(DOWN)'>DOWN</div> </td> <td></td> </tr> </table> </body></html>

節點類的js :Node.js

/* 節點類 */function Node (x, y) { this.x=x; this.y=y; this.equals=function (i, j) { return this.x==i && this.y==j; }; }

舞臺類js:Stage.js

/** 舞臺類 */function Stage () { this.width=50; this.height=50; this.worm=new Worm(); /* 在canvas中繪制舞臺的內容 */ this.print=function (ctx) { for(i=0; i<this.width; i++){ for(j=0; j<this.height; j++){ //如果當前節點是蛇身子的一部分 //那么換一種顏色繪制 if(this.worm.contains(i,j)){ ctx.fillStyle='#ab55ff'; ctx.fillRect(i*10, j*10, 10, 10); }else if(this.worm.food.equals(i, j)){ ctx.fillStyle='#000000'; ctx.fillRect(i*10, j*10, 10, 10); }else{ ctx.fillStyle='#dddddd'; ctx.fillRect(i*10, j*10, 10, 10); } } } //在舞臺的左上角繪制分數 ctx.font='30px Arial'; ctx.fillStyle='#880000'; ctx.fillText('score:'+SCORE, 10,40); };}

蛇類js:Worm.js

/** 蛇類 */var UP=0;var DOWN=1;var LEFT=2;var RIGHT=3; var DIR=UP; var SCORE=0;var SPEED=300;//蛇類初始化的形狀function Worm () { this.nodes=[]; this.nodes[this.nodes.length]=new Node(20,10); this.nodes[this.nodes.length]=new Node(20,11); this.nodes[this.nodes.length]=new Node(20,12); this.nodes[this.nodes.length]=new Node(20,13); this.nodes[this.nodes.length]=new Node(20,14); this.nodes[this.nodes.length]=new Node(20,15); this.nodes[this.nodes.length]=new Node(21,15); this.nodes[this.nodes.length]=new Node(22,15); this.nodes[this.nodes.length]=new Node(23,15); this.nodes[this.nodes.length]=new Node(24,15); this.nodes[this.nodes.length]=new Node(24,16); this.nodes[this.nodes.length]=new Node(24,17); this.nodes[this.nodes.length]=new Node(24,18); this.nodes[this.nodes.length]=new Node(24,19); /* 蛇會走一步 */ this.step=function () { //計算出頭結點 把頭節點添加到nodes數組中 var oldHead=this.nodes[0]; var newHead; switch (DIR){ case UP: if(oldHead.y-1<0){ newHead=new Node(oldHead.x, 49); }else{ newHead=new Node(oldHead.x, oldHead.y-1); } break; case DOWN: if(oldHead.y+1>49){ newHead=new Node(oldHead.x, 0); }else{ newHead=new Node(oldHead.x, oldHead.y+1); } break; case LEFT: if(oldHead.x-1<0){ newHead=new Node(49, oldHead.y); }else{ newHead=new Node(oldHead.x-1, oldHead.y); } break; case RIGHT: if(oldHead.x+1>49){ newHead=new Node(0, oldHead.y); }else{ newHead=new Node(oldHead.x+1, oldHead.y); } break; } this.nodes.unshift(newHead); if(!this.food.equals(newHead.x, newHead.y)){ //把尾節點刪掉 (在沒有吃到食物的時候) this.nodes.pop(); }else{ //吃到了食物 重新生成食物 this.food=this.randomFood(); SCORE+=10; SPEED-=50; endPrint(); startPrint(); } }; /* 判斷i,j節點是否是當前蛇身子的一部分 */ this.contains=function (i, j) { for(k=0; k<this.nodes.length; k++){ var node=this.nodes[k]; if(node.x==i && node.y==j){ return true; } } return false; }; //聲明生成食物的方法 this.randomFood=function () { var x; var y; do{ x=Math.floor(Math.random()*50); y=Math.floor(Math.random()*50); }while(this.contains(x, y)); return new Node(x, y); }; //聲明食物 this.food=this.randomFood(); }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 久久视频6免费观看视频精品 | 日本免费高清一区 | 久久久久久久久久久大尺度免费视频 | 中文乱码字幕午夜无线观看 | 国产成人精品亚洲日本在线观看 | 久久综合九色综合欧洲色 | 全国男人的天堂网站 | 一级v片 | 午夜在线播放免费人成无 | 日韩精品久久久毛片一区二区 | 欧美亚洲另类久久综合 | 国产一区二区三区四区在线 | 国产免费一区二区三区在线 | 久久久久琪琪去精品色村长 | 欧美xxxxx色视频在线观看 | 久久久久免费观看 | 中文字幕免费观看 | 亚洲乱视频 | 99九九国产精品免费视频 | 国产成人精品日本亚洲专区6 | 日韩在线观看中文字幕 | 日本三级视频在线 | 国产亚洲欧美ai在线看片 | 日韩中文字幕精品久久 | 精品国产一区二区三区久 | 视频二区好吊色永久视频 | 碰碰碰免费公开在线视频 | 国产成人丝袜网站在线看 | 正在播放的国产a一片 | 亚洲成网站 | 香港aa三级久久三级老师 | 72种姿势欧美久久久久大黄蕉 | 久久久亚洲欧美综合 | 男人的天堂免费网站 | 特级毛片免费观看视频 | 国产高清精品一区 | 999国内精品永久免费视频 | 亚洲精品一区二区三区四 | 美国毛片免费一级 | 亚洲国内自拍 | 最新亚洲一区二区三区四区 |