JS实现贪吃蛇小游戏
来源:互联网 发布:南京大学大数据实验室 编辑:程序博客网 时间:2024/05/16 00:25
最近一个月在看机器学习方向的书籍,推理的头大了,抽了点空,写了个小游戏玩玩
<!DOCTYPE html><html><head><title></title><style type="text/css">body,h2{margin: 0px;padding: 0px;}#page{width: 810px;height: 620px;margin: 20px auto;text-align: center;}#mark{font-weight: 800;}#mark_con{ color: red; }</style></head><body><div id="page"><h2>贪吃蛇游戏</h2> <div id="gameBox"> <canvas id="canvas" height="500px" width="800px" style="border:1px solid #66ff00;background: #9a968b"></canvas> </div> <div id="help"> <div id="mark">得分:<span id="mark_con"></span></div> </div> </div> <script type="text/javascript"> var canvas=document.getElementById("canvas");//获取到canvas对象 var ctx=canvas.getContext('2d');//建立二维画布 var oMark = document.getElementById('mark_con');//分数显示框 var blocksize=20;//格子大小 var rows=canvas.height/blocksize; //行数 var cols=canvas.width/blocksize;//列数 var snakes=[] //用于存储蛇的位置 var foodX=20*blocksize;//食物横坐标 var foodY=13*blocksize;//食物的纵坐标 var initsnack=4;//初始化蛇的长度 var direction=-1;//蛇初始方向为右边 var speed=1; //贪吃蛇移动的速率 function draw(){ //防止蛇移动的时候,画板上的数据没有清空 ctx.clearRect(0,0,blocksize * cols, blocksize * rows); //画出横线 for(var i=1;i<=rows;i++) { ctx.beginPath(); ctx.moveTo(0,i*blocksize); ctx.lineTo(cols*blocksize,i*blocksize); ctx.strokeStyle="white"; ctx.closePath(); ctx.stroke(); } //画出竖线 for(var i=1;i<=cols;i++) { ctx.beginPath(); ctx.moveTo(i*blocksize,0); ctx.lineTo(i*blocksize,rows*blocksize); ctx.strokeStyle="white"; ctx.closePath(); ctx.stroke(); } //画蛇 drawsnakes(); //画出食物 drawFood(); } function drawsnakes(){ for(var i=0;i<snakes.length;i++) { ctx.beginPath(); ctx.moveTo(snakes[i].x,snakes[i].y); ctx.lineTo(snakes[i].x+blocksize,snakes[i].y); ctx.lineTo(snakes[i].x+blocksize,snakes[i].y+blocksize); ctx.lineTo(snakes[i].x,snakes[i].y+blocksize); if(i==0) { //蛇尾 ctx.fillStyle="#806464"; ctx.lineTo(snakes[i].x,snakes[i].y); } else if (i==snakes.length-1) { //蛇头 ctx.fillStyle="#a24e33"; } else { //蛇身体 ctx.fillStyle="#806464"; } ctx.fillRect(snakes[i].x,snakes[i].y,blocksize,blocksize); ctx.strokeStyle="gray"; ctx.stroke(); ctx.closePath(); } } function drawFood(){ ctx.beginPath(); ctx.fillStyle = "green"; ctx.fillRect(foodX, foodY, blocksize, blocksize); ctx.moveTo(foodX, foodY); ctx.lineTo(foodX + blocksize, foodY); ctx.lineTo(foodX + blocksize, foodY + blocksize); ctx.lineTo(foodX, foodY + blocksize); ctx.lineTo(foodX, foodY); ctx.closePath(); ctx.strokeStyle = "gray"; ctx.stroke(); } //随机产生一个食物 function addFood(){ foodX = Math.floor(Math.random() * (cols - 1)) * blocksize;foodY = Math.floor(Math.random() * (rows - 1)) * blocksize; //防止食物随机出现在蛇身上 var temp=1; for(var i=0;i<snakes.length;i++) { if(snakes[i].x==foodX&&snakes[i].y==foodY) { temp=0; break; } } if(temp==0) addFood(); } function Cell(x,y){ this.x=x; this.y=y; } //初始化 function init(){ for( var i = 0; i < initsnack; i++){ snakes[i]=new Cell((i+1)*blocksize,60); } addFood(); oMark.innerHTML = 0; } //1 左 -1 右 2 上 -2 下 function keydown(keyCode) { switch(keyCode) { case 37: if(direction!=-1) direction=1; break; case 38: if(direction!=-2) direction=2; break; case 39: if(direction!=1) direction=-1; break; case 40: if(direction!=2) direction=-2; break; } move(); } //1 左 -1 右 2 上 -2 下 function move(){ var head=snakes[snakes.length-1]; switch(direction){ case 1://左 snakes.push(new Cell(head.x-blocksize,head.y));break; case -1://右 snakes.push(new Cell(head.x+blocksize,head.y));break; case 2:// 上 snakes.push(new Cell(head.x,head.y-blocksize));break; case -2: //下 snakes.push(new Cell(head.x,head.y+blocksize));break; } snakes.shift(); IsEatFood(); IsDie(); //console.log(snakes) draw(); } //判断是否吃到了食物,即蛇头与食物坐标是否一致,若一致,则蛇长加一,重新生成新的食物,分数加1 function IsEatFood(){ var head=snakes[snakes.length-1]; if(head.x==foodX&&head.y==foodY) { oMark.innerHTML = (parseInt(oMark.innerHTML) + 1).toString(); addSnakes(); addFood(); } } function addSnakes(){ snakes.unshift(new Cell(blocksize*cols,blocksize * rows)); } //判断是否死亡,要么蛇头超出边界,要么蛇头撞到蛇身体 function IsDie() { var head=snakes[snakes.length-1]; if(head.x==-blocksize||head.x==blocksize*cols||head.y==-blocksize||head.y==blocksize*rows) { alert("撞墙了,游戏结束!分数为:"+oMark.innerHTML); clearInterval(interval); window.location.reload(); } else { var temp=1; for (var i=0; i <snakes.length-2; i++) { if (head.x==snakes[i].x&&head.y==snakes[i].y) { temp=0; break; } } if(temp==0) { alert("撞到身体了,游戏结束!分数为:"+oMark.innerHTML); clearInterval(interval); window.location.reload(); } } } // 启动函数 window.onload = function(){ init(); draw(); interval = setInterval(move,200); document.onkeydown = function(event){ var event = event || window.event; keydown(event.keyCode); } } </script></body></html>运行的效果图如下
贪吃蛇小游戏,主要在于需要考虑清逻辑,多种可能性,实现还是不难的。
阅读全文
0 1
- js实现贪吃蛇小游戏
- JS实现贪吃蛇小游戏
- js实现贪吃蛇小游戏
- js实现的贪吃蛇的小游戏
- 原生JS实现传统贪吃蛇小游戏
- JS实现简单的贪吃蛇小游戏
- JS-贪吃蛇小游戏
- js贪吃蛇小游戏
- 贪吃蛇(js小游戏)
- js小游戏----贪吃蛇
- js jq 贪吃蛇小游戏
- JavaScript 实现各种小游戏源码 !js贪吃蛇源码
- 【05】20行js代码实现的贪吃蛇小游戏
- Java ,实现贪吃蛇小游戏
- JavaScript, 实现贪吃蛇小游戏
- java实现贪吃蛇小游戏
- 贪吃蛇小游戏 C++实现
- 《Java小游戏实现》:贪吃蛇
- STL之vector容器详解
- GDB 命令大全
- ShellExecuteA命令行执行程序
- web.xml中配置servlet时url-pattern标签到底是干什么的
- ISR的特点
- JS实现贪吃蛇小游戏
- Visual Studio结合Team Foundation Server和Git进行代码管理
- 利用F5 VE制作F5 11.6.1系统安装引导U盘
- Python自备关键复习点
- HDU 3555 Bomb + HDU 2089 不要62 数位dp入门题目
- C++实现BASE64码编解码
- 内存分配malloc
- 使用cmake编译安装mysql
- CGIC编程