js贪吃蛇游戏实现思路和源码


Posted in Javascript onApril 14, 2016

本文实例为大家分享了js贪吃蛇游戏的相关代码,供大家参考,具体内容如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>贪吃蛇小游戏</title>
 <style>
*{margin:0; padding:0;}
header {
 display: block;
 margin: 0 auto;
 width: 500px;
 text-align: center;
}
header h1 {
 font-family: Arial;
 font-weight: bold;
}
header #newGameButton {
 display: block;
 margin: 20px auto;
 width: 100px;
 padding: 10px 10px;
 background-color: #8f7a66;
 font-family: Arial;
 color: white;
 border-radius: 10px;
 text-decoration: none;
}
header #newGameButton:hover {
 background-color: #9f8b77;
}
header p {
 font-family: Arial;
 font-size: 25px;
 margin: 20px auto;
}
canvas{
 display:block; 
 border:medium double black;
 margin:4px auto;
}
 </style>
</head>
<body>
 <header>
 <h1>贪吃蛇小游戏</h1>
 <a href="javascript:newgame();" id="newGameButton">New Game</a>
 <p>score:<span id="score">0</span></p>
 </header>
 <canvas id="canvas">
 Your browser doesn't support the <code>canvas</code> element.
 </canvas>
 <script>
 var CANVAS = document.getElementById("canvas");
var CTX = CANVAS.getContext("2d");
var SNAKE = new Array(); //用队列模拟蛇身
var DIR = "right"; //用来控制蛇头的方向
var SIZE = 20; //蛇身的宽度
var FOODX = 0; //食物的x坐标
var FOODY = 0; //食物的y坐标
var HEADX = 0; //蛇头的x坐标
var HEADY = 0; //蛇头的y坐标
var MAXWIDTH = 200; //画布的高度
var MAXHEIGHT = 200; //画布的宽度
var TIME = 400; //蛇的速度
var SCORE = 0; //计算玩家分数
var interval = null;

CANVAS.width = MAXWIDTH;
CANVAS.height = MAXHEIGHT;

window.onload = function(){
 newgame();
};
document.getElementById("newGameButton").click(function(){
 newgame();
});
function newgame(){
 SNAKE = []; //用队列模拟蛇身
 DIR = "right"; //用来控制蛇头的方向
 HEADX = 0; //蛇头的x坐标
 HEADY = 0; //蛇头的y坐标
 SCORE = 0;
 window.clearInterval(interval);
 interval = null;
 //初始化画布
 CTX.clearRect(0, 0, MAXWIDTH, MAXHEIGHT);
 //画一条蛇
 drawSnake();
 //放置食物
 setFood();
 //移动蛇
 interval = window.setInterval(move, TIME);

}
function move(){
 switch(DIR){
 case "up":HEADY = HEADY-SIZE;break;
 case "right":HEADX = HEADX+SIZE;break;
 case "down":HEADY = HEADY+SIZE;break;
 case "left":HEADX = HEADX-SIZE;break;
 }
 if(HEADX>MAXWIDTH-SIZE || HEADY>MAXHEIGHT-SIZE || HEADX<0 || HEADY<0){
 alert("你的分数为:"+SCORE+"分,继续努力吧!失败原因:碰壁了.....");
 window.location.reload();
 }
 for(var i=1;i<SNAKE.length;i++){
 if(SNAKE[i][0] == SNAKE[0][0] && SNAKE[i][1] == SNAKE[0][1]){
 alert("你的分数为:"+SCORE+"分,继续努力吧!失败原因:撞到自己了.....");
 window.location.reload();
 }
 }
 if(SNAKE.length == MAXWIDTH *MAXHEIGHT){
 alert("好厉害!么么哒~");
 window.location.reload();
 }
 moveIn(HEADX, HEADY);//移动一格
}
document.onkeydown = function(e) { //改变蛇方向
 var code = e.keyCode - 37;
 switch(code){
 case 1 : DIR = "up";break;//上
 case 2 : DIR = "right";break;//右
 case 3 : DIR = "down";break;//下
 case 0 : DIR = "left";break;//左
 }
}
//=============================画一条蛇=======================================================
function drawSnake(){
 CTX.fillStyle = "black";
 //画蛇头
 CTX.fillRect (HEADX, HEADY, SIZE, SIZE);
 SNAKE.push([HEADX, HEADY]);
 
 //画蛇身
 switch(DIR){
 case "up": 
 drawBody(HEADX, HEADY + SIZE, HEADX, HEADY + 2 * SIZE);
 break;
 case "right": 
 drawBody(HEADX - SIZE, HEADY, HEADX - 2 * SIZE, HEADY);
 break;
 case "down": 
 drawBody(HEADX, HEADY - SIZE, HEADX, HEADY - 2 * SIZE);
 break;
 case "left": 
 drawBody(HEADX + SIZE, HEADY, HEADX + 2 * SIZE, HEADY);
 break;
 }
}
function drawBody(x1, y1, x2, y2){
 CTX.fillRect (x1, y1, SIZE, SIZE); 
 CTX.fillRect (x2, y2, SIZE, SIZE); 
 SNAKE.push([x1, y1]);
 SNAKE.push([x2, y2]);
}
//===========================放置食物==============================
function setFood(){
 do{
 FOODX = SIZE * Math.floor(Math.random() * MAXWIDTH / SIZE);
 FOODY = SIZE * Math.floor(Math.random() * MAXHEIGHT / SIZE);
 }while(foodInSnake());
 CTX.fillStyle = "red";
 CTX.fillRect (FOODX, FOODY, SIZE, SIZE);
}
function foodInSnake(){
 for (var i = 0; i < SNAKE.length; i++) {
 if(FOODX == SNAKE[i][0] && FOODY == SNAKE[i][1]){
 return true;
 }
 }
 return false;
}
//========================================移动一格===========================
function moveIn(x, y){
 CTX.fillStyle = "black";
 CTX.fillRect(x, y, SIZE, SIZE);//重画蛇头 
 //把新蛇头添加到 SNAKE 数组
 var newSnake = [[x, y]];
 SNAKE = newSnake.concat(SNAKE);

 if(false == eatFood()){//如果没吃到食物,减少一格蛇尾 
 var snakeTail = SNAKE.pop();//获得蛇尾位置
 CTX.clearRect(snakeTail[0], snakeTail[1], SIZE, SIZE);//去掉蛇尾 
 }
}
function eatFood(){
 if(HEADX == FOODX && HEADY == FOODY){
 CTX.fillStyle = "block";
 CTX.fillRect (FOODX, FOODY, SIZE, SIZE);

 setFood();
 SCORE++;
 //$("#score").text(SCORE);
 document.getElementById("score").innerHTML = SCORE;
 return true;
 }
 return false;
}

 </script>
</html>

效果图:

js贪吃蛇游戏实现思路和源码

思路:

function newgame(){
 重置蛇和分数的数据;
 清除interval;
 初始化画布;
 画一条蛇;
 放置食物;
 使用定时器(setInterval)使蛇移动(move函数);
}
function move(){
 根据方向改变蛇头下一格将要到达的位置;
 判断游戏是否结束,以及显示结束的原因(包含输赢);
 蛇移动一格(moveIn函数);
}
对键盘的方向键作监控,当改变方向时,修改全局变量DIR的值(用于存储方向);
function moveIn(){
 在蛇头的前一格增加一格作为新的蛇头,并将蛇头的坐标作为第一个元素加入到代表蛇的数组中;
 if(没吃到食物){
 删除一格蛇尾,在画布中做相应改变;
 }
}

需要注意的是,如果需要在JS中设定canvas中的宽度和高度,和设置其他CSS属性略有不同。

CANVAS.width = MAXWIDTH;CANVAS.height = MAXHEIGHT;

小编还为大家准备了精彩的专题:javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
Jquery实现仿新浪微博获取文本框能输入的字数代码
Feb 22 Javascript
解析使用js判断只能输入数字、字母等验证的方法(总结)
May 14 Javascript
javascript同页面多次调用弹出层具体实例代码
Aug 16 Javascript
javascript ajax 仿百度分页函数
Oct 29 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
node.js实现多图片上传实例
Jun 03 Javascript
jQuery ajax MD5实现用户注册即时验证功能
Oct 11 Javascript
JavaScript中双符号的运算详解
Mar 12 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
详解angularjs利用ui-route异步加载组件
May 21 Javascript
angularJs-$http实现百度搜索时的动态下拉框示例
Feb 27 Javascript
layui自定义插件citySelect实现省市区三级联动选择
Jul 26 Javascript
JS跨域解决方案之使用CORS实现跨域
Apr 14 #Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 #Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
Apr 13 #Javascript
原生js编写autoComplete插件
Apr 13 #Javascript
JS中的eval 为什么加括号
Apr 13 #Javascript
jQuery操作属性和样式详解
Apr 13 #Javascript
jquery跟随屏幕滚动效果的实现代码
Apr 13 #Javascript
You might like
PHP 的几个配置文件函数
2006/12/21 PHP
php将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
Jquery插件写法笔记整理
2012/09/06 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
深入理解JavaScript系列(28):设计模式之工厂模式详解
2015/03/03 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
在layui.use 中自定义 function 的正确方法
2019/09/16 Javascript
p5.js实现故宫橘猫赏秋图动画
2019/10/23 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
[02:36]DOTA2英雄基础教程 帕格纳
2014/01/20 DOTA
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
2013/12/03 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
浅谈Python3实现两个矩形的交并比(IoU)
2020/01/18 Python
Python加载数据的5种不同方式(收藏)
2020/11/13 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
大学应届生求职简历的自我评价
2013/10/08 职场文书
学生会离职感言
2014/02/11 职场文书
公务员政审个人鉴定
2014/02/25 职场文书
大学新生军训方案
2014/05/03 职场文书
质量提升方案
2014/06/16 职场文书
材料物理专业求职信
2014/09/01 职场文书
怎么写工作检讨书
2014/11/16 职场文书
撤诉状格式范本
2015/05/19 职场文书
Nginx 安装SSL证书完成HTTPS部署
2022/04/28 Servers