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 相关文章推荐
js下写一个事件队列操作函数
Jul 19 Javascript
用javascript判断IE版本号简单实用且向后兼容
Sep 11 Javascript
JS连连看源码完美注释版(推荐)
Dec 09 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 Javascript
javascript性能优化之DOM交互操作实例分析
Dec 12 Javascript
怎么引入(调用)一个JS文件
May 26 Javascript
基于vue 实现token验证的实例代码
Dec 14 Javascript
vue+node实现图片上传及预览的示例方法
Nov 22 Javascript
对TypeScript库进行单元测试的方法
Jul 18 Javascript
vue路由权限校验功能的实现代码
Jun 07 Javascript
详细分析vue响应式原理
Jun 22 Javascript
JS如何操作DOM基于表格动态展示数据
Oct 15 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.ini中文版(2)
2006/10/09 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
解析php常用image图像函数集
2013/06/24 PHP
linux下php上传文件注意事项
2016/06/11 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
javascript基本类型详解
2014/11/28 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
妙用Angularjs实现表格按指定列排序
2017/06/23 Javascript
jQuery+PHP实现上传裁剪图片
2020/06/29 jQuery
详解js创建对象的几种方法及继承
2019/04/12 Javascript
Python中使用dom模块生成XML文件示例
2015/04/05 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
face++与python实现人脸识别签到(考勤)功能
2019/08/28 Python
Python集合基本概念与相关操作实例分析
2019/10/30 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
Python查找不限层级Json数据中某个key或者value的路径方式
2020/02/27 Python
django执行原始查询sql,并返回Dict字典例子
2020/04/01 Python
使用python-Jenkins批量创建及修改jobs操作
2020/05/12 Python
基于Python的图像阈值化分割(迭代法)
2020/11/20 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
多媒体编辑专业毕业生推荐信
2013/11/05 职场文书
关于圣诞节的广播稿
2014/01/26 职场文书
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
医药销售自荐书
2014/05/29 职场文书
班级心理活动总结
2014/07/04 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
中班教师个人总结
2015/02/05 职场文书
公司文体活动总结
2015/05/07 职场文书
大学生党课感想
2015/08/11 职场文书
优质服务心得体会(共4篇)
2016/01/22 职场文书
7个关于Python的经典基础案例
2021/11/07 Python
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python