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 相关文章推荐
JSON.stringify 语法实例讲解
Mar 14 Javascript
jQuery获取样式中颜色值的方法
Jan 29 Javascript
js操作css属性实现div层展开关闭效果的方法
May 11 Javascript
学习Angular中作用域需要注意的坑
Aug 17 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
JS实现数组去重复值的方法示例
Feb 18 Javascript
微信小程序 图片宽度自适应的实现
Apr 06 Javascript
JavaScript事件处理程序详解
Sep 19 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
Feb 22 Javascript
如何使node也支持从url加载一个module详解
Jun 05 Javascript
vue watch深度监听对象实现数据联动效果
Aug 16 Javascript
js数组的基本使用总结
Jan 18 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设计模式 Factory(工厂模式)
2011/06/26 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
JavaScript入门教程之引用类型
2016/05/04 Javascript
SWFUpload多文件上传及文件个数限制的方法
2016/05/31 Javascript
详解获取jq ul第一个li定位的四种解决方案
2016/11/23 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
2018/07/10 Javascript
vue-cli3 项目从搭建优化到docker部署的方法
2019/01/28 Javascript
vue-cli3项目展示本地Markdown文件的方法
2019/06/07 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
layer实现登录弹框,登录成功后关闭弹框并调用父窗口的例子
2019/09/11 Javascript
js实现无限瀑布流实例方法
2019/09/16 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python实现Linux下守护进程的编写方法
2014/08/22 Python
深入理解Python中字典的键的使用
2015/08/19 Python
Python黑帽编程 3.4 跨越VLAN详解
2016/09/28 Python
python 读取鼠标点击坐标的实例
2018/12/29 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
机电专业毕业生求职信
2014/07/01 职场文书
企业公益活动策划方案
2014/08/24 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
幼儿园中班个人总结
2015/02/28 职场文书
2015年高中班主任工作总结
2015/04/30 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
唱歌比赛拉拉队口号
2015/12/25 职场文书
一劳永逸彻底解决pip install慢的办法
2021/05/24 Python
详解Flask开发技巧之异常处理
2021/06/15 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python