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 相关文章推荐
date.parse在IE和FF中的区别
Jul 29 Javascript
javascript中的window.location.search方法简介
Sep 02 Javascript
用js来获取上传的文件名纯粹是为了美化而用
Oct 23 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
Nov 01 Javascript
原生js实现淘宝首页点击按钮缓慢回到顶部效果
Apr 06 Javascript
如何在Angular.JS中接收并下载PDF
Nov 26 Javascript
javascript实现去除HTML标签的方法
Dec 26 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
vue与django集成打包的实现方法
Nov 11 Javascript
jQuery 实现扁平式小清新导航
Jul 07 jQuery
基于vue与element实现创建试卷相关功能(实例代码)
Dec 07 Vue.js
node脚手架搭建服务器实现token验证的方法
Jan 20 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提取字符串中的手机号正则表达式怎么写
2017/07/17 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
为jquery.ui.dialog 增加“在当前鼠标位置打开”的功能
2009/11/24 Javascript
jquery特效 幻灯片效果示例代码
2013/07/16 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
javascript中数组的多种定义方法和常用函数简介
2014/05/09 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
Javascript中实现String.startsWith和endsWith方法
2015/06/10 Javascript
js浏览器html5表单验证
2016/10/17 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
javascript实现延时显示提示框效果
2017/06/01 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
详解React Native网络请求fetch简单封装
2017/08/10 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python获取糗百图片代码实例
2013/12/18 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
在Python的Flask框架中实现单元测试的教程
2015/04/20 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python数据集切分实例
2018/12/08 Python
python实现图像全景拼接
2020/03/27 Python
Python识别处理照片中的条形码
2020/11/16 Python
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
2013/01/23 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
美国钻石商店:Zales
2016/11/20 全球购物
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
Piercing Pagoda官网:耳环、戒指、项链、手链等
2020/09/28 全球购物
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
“鬼灭之刃”热度不减,其成功背后的原因是什么?
2022/03/22 日漫
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB