JavaScript实现的--贪吃蛇
总的实现思路:
一、效果部分:
1、编写html代码,加上样式。
二、JavaScript部分:
1.利用dom方法创建一块草坪,即活动区域;
2.创建一条蛇,并设置其初始位置;
3.创建一个随机出现的食物;
4. 最后编写移动函数: 头部移动;
吃掉食物后自身长度加长;
考虑它头部遇到墙壁和头部与自身相撞的情况;
5.编写按键操作环节、给按钮加点击事件。
HTML代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>贪吃蛇</title>
</head>
<body>
<div id="container">
<!-- 活动范围 -->
<div id="ground"></div>
<!-- 控制区 -->
<div id="gameControl">
<div id="button">
<button id="start">开始</button>
<button id="pause">暂停</button>
</div>
</div>
</div>
</body>
CSS代码如下:
*{
margin:;
padding:;
}
body { background: #aaa; }
#container{
width: 1000px;
height: 550px;
border: 30px solid #003040;
margin: 11px auto;
background: #000;
}
#ground{
width: 1000px;
height: 500px;
position: relative;
}
#button{
float: right;
height: 50px;
line-height: 50px;
margin-right: 350px;
}
button{
width: 85px;
height: 40px;
cursor: pointer;
background: #2D8DDA;
color: #fff;
font-size: 15px;
border: none;
margin: 0 30px;
}
.block{
width: 20px;
height: 20px;
background: #f1f1f1;
float: left; }
.snakeBody{
width: 20px;
height: 20px;
position: absolute;
background: #000;
}
.food{
width: 20px;
height: 20px;
background: #00D936;
position: absolute;
}
JS代码如下:
var timer, diRection='right';
window.onload=function(){
//初始化
createGrass();
createSnake();
createFood();
document.getElementById('start').onclick=function(){
clearInterval(timer); //清空,防止多次点击开始
timer=setInterval(function(){
snakeMove(diRection);
},150);
snakeMove(diRection);
};
document.getElementById('pause').onclick=function(){
clearInterval(timer);
};
};
//创建草坪
function createGrass(){
var oGround=document.getElementById('ground');
var oDiv;
for(var i=0;i<50;i++){
for(var j=0;j<25;j++){
oDiv=document.createElement('div');
oDiv.className='block';
oGround.appendChild(oDiv);
}
}
}
//创建蛇 function createSnake(){
var oGround=document.getElementById('ground');
var oDiv;
for(var i=0;i<2;i++){
oDiv=document.createElement('div');
oDiv.className='snakeBody';
oDiv.style.right=(48-i)*20+'px';
oDiv.style.top='20px';
oGround.appendChild(oDiv);
snakeBody.push(oDiv);
}
} //创建食物
var snakeBody=[], oFood; function createFood(){
var flag = true; //初始化食物和蛇身不重合
var iLeft, iTop;
var oGround = document.getElementById('ground');
oFood = document.createElement('div');
oFood.className='food';
iLeft = parseInt(Math.random()*49)*20; // 为食物块出现的位置取一个随机数(取整数)。
iTop = parseInt(Math.random()*24)*20;
var len = snakeBody.length;
for(var i=0; i<len; i++){ //确定蛇身是否与出现的食物位置重合
if(snakeBody[i].offsetLeft==iLeft && snakeBody[i].offsetTop==iTop){
flag=false;
break;
}
}
if(flag==true){
oFood.style.left=iLeft+'px';
oFood.style.top=iTop+'px';
oGround.appendChild(oFood);
} else {
createFood(); //若生成的食物有重合则再次调用自身
}
}
//蛇运动
function snakeMove(direction){
var snakeHead = snakeBody[0]; //获取蛇头
diRection = direction; //用于防止比如蛇身本来往左边走,但是向右按钮仍然有效的情况
for(var i = snakeBody.length-1; i>0; i--){
snakeBody[i].style.left=snakeBody[i-1].offsetLeft+'px'; //移动蛇
snakeBody[i].style.top=snakeBody[i-1].offsetTop+'px';
}
switch (direction){ //蛇头的位置
case 'left': snakeHead.style.left = snakeHead.offsetLeft-20+'px'; break;
case 'right': snakeHead.style.left = snakeHead.offsetLeft+20+'px'; break;
case 'up': snakeHead.style.top = snakeHead.offsetTop-20+'px'; break;
case 'down': snakeHead.style.top = snakeHead.offsetTop+20+'px'; break;
} //蛇头碰到墙壁
if(snakeHead.offsetLeft == -20 || snakeHead.offsetLeft == 1000 || snakeHead.offsetTop == -20 || snakeHead.offsetTop == 500){
clearInterval(timer);
if(confirm('再来一次?')){
window.location.reload();
}
}
//蛇碰到自身
for(var j=1;j<snakeBody.length;j++){
if(snakeHead.offsetLeft == snakeBody[j].offsetLeft && snakeHead.offsetTop == snakeBody[j].offsetTop){
clearInterval(timer);
if(confirm('再来一次')){
window.location.reload();
}
}
}
//吃掉食物
if(snakeHead.offsetLeft == oFood.offsetLeft && snakeHead.offsetTop == oFood.offsetTop){
oFood.className = 'snakeBody snake-block'; //食物变成和蛇身一样的颜色
console.log(snakeBody[snakeBody.length-1].offsetTop); //console.log 用于输出普通信息
switch (direction){ //oFood的坐标采用蛇身最后一节的坐标
case 'left': oFood.style.left = snakeBody[snakeBody.length-1].offsetLeft+'px'; break;
case 'right': oFood.style.left = snakeBody[snakeBody.length-1].offsetLeft+'px'; break;
case 'up': oFood.style.top = snakeBody[snakeBody.length-1].offsetTop+'px'; break;
case 'down': oFood.style.top = snakeBody[snakeBody.length-1].offsetTop+'px'; break;
}
snakeBody.push(oFood);
//用push把吃掉的div添加到蛇尾
//不能添加到头部,因为如果食物节出现在边缘位置,那么吃掉后会超出墙范围或者直接撞墙
createFood();
}
}
/*
* onkeydown()
* 事件会在用户按下一个键盘按键时发生。
* 参数 描述
* SomeJavaScriptCode 必需。 规定该事件发生时执行的 JavaScript。
*/
//按键操作
document.onkeydown = function(e){
var event = e || window.event; //实现所有浏览器兼容,获取事件对象
var direction = event.keyCode;
switch (direction){
case 37:
if(diRection != 'right'){
snakeMove('left');
}
break; //左
case 39:
if(diRection != 'left'){
snakeMove('right');
}
break; //右
case 38:
if(diRection != 'down'){
snakeMove('up');
}
break; //上
case 40:if(diRection != 'up'){
snakeMove('down');
}
break; //下
}
}
常用的方法:
/*
* onkeydown()
* 事件会在用户按下一个键盘按键时发生。
* 参数 描述
* SomeJavaScriptCode 必需。 规定该事件发生时执行的 JavaScript。
*/
/*
*confirm(message) 方法用于显示一个带有指定消息和 OK 及取消按钮的对话框。
*
* 参数 描述
* message 要在 window 上弹出的对话框中显示的纯文本(而非 HTML 文本)
*
*如果用户点击确定按钮,则 confirm() 返回 true。如果点击取消按钮,则 confirm() 返回 false。
*
*在用户点击确定按钮或取消按钮把对话框关闭之前,它将阻止用户对浏览器的所有输入。在调用 confirm() 时,
*将暂停对 JavaScript 代码的执行,在用户作出响应之前,不会执行下一条语句。
*
*/
/* offsetLeft属性 :
* 此属性可以返回当前元素距离某个父辈元素左边缘的距离,当然这个父辈元素也是有讲究的。
* 1.如果父辈元素中有定位的元素,那么就返回距离当前元素最近的定位元素边缘的距离。
* 2.如果父辈元素中没有定位元素,那么就返回相对于body左边缘距离。
效果图:
*/
JavaScript实现的--贪吃蛇的更多相关文章
- javascript 编写的贪吃蛇
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaScript 小游戏 贪吃蛇
贪吃蛇 代码: <!DOCTYPE html><html><head> <meta charset="UTF-8"> <met ...
- JavaScript新手入门 贪吃蛇
从小就在玩贪吃蛇,但是知道今天自己做了一遍才知道原理的具体的实现步骤. 刚进入界面时显示开始游戏(不重要,本人比较喜欢吹毛求疵) 中间黑色部分为游戏的主要展示部分 主要步骤及源码: body中代码,红 ...
- javascript实现游戏贪吃蛇
1.设计蛇:属性有宽.高.方向.状态(有多少节),方法:显示,跑 2.设计食物:属性宽.高 3.显示蛇:根据状态向地图里加元素 4.蛇跑起来:下一节到前一节的位置,蛇头根据方向变,删除原来的蛇,新建蛇 ...
- 原生JavaScript实现的贪吃蛇
github代码地址:https://github.com/McRayFE/snake 涉及到的知识点: 键盘事件 setInterval()定时器 javascript中数组的使用 碰撞的检测 of ...
- JavaScript 面向对象思想 贪吃蛇游戏
js代码: 游戏的对象 ,食物,蛇 ,游戏控制思路如下 (完整代码在https://github.com/774044859yf/ObjectSnakeGame下载) var snake = { aS ...
- JavaScript与html5写的贪吃蛇完整代码
JavaScript与html5写的贪吃蛇完整代码 查看运行效果可访问http://www.codesocang.com/texiao/youxitexiao/2014/0402/7045.html# ...
- javascript实现贪吃蛇
<html> <head> <style> body { background:#444; } .rect { border:1px solid #94F; wid ...
- JavaScript版—贪吃蛇小组件
最近在学习JavaScript,利用2周的时间看完了<JavaScript高级编程>,了解了Js是一门面向原型编程的语言,没有像C#语言中的class,也没有私有.公有.保护等访问限制的级 ...
随机推荐
- RabbitMQ系列教程之四:路由(Routing)
(使用Net客户端)在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息.在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例如, ...
- AppDelegate减负之常用三方封装 - 友盟推送篇
之前分享过集成友盟推送的方法, 需要的朋友可以查看一下链接: http://www.cnblogs.com/zhouxihi/p/6533058.html 一般开发中我们比较多使用的三方有友盟推送, ...
- Linux常见命令(三)
今天我们来介绍第三个命令:pwd. Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来 ...
- [Android FrameWork 6.0源码学习] ViewGroup的addView函数分析
Android中整个的View的组装是采用组合模式. ViewGroup就相当与树根,各种Layout就相当于枝干,各种子View,就相当于树叶. 至于View类.我们就当它是个种子吧.哈哈! Vie ...
- 一张图告诉你angular2所有知识点
忙活了半年,从angular2.0到现在angular4.2.从没AOT到有AOT.我想说,angular2的学习曲线真的有点陡峭.只能说,angular2是一个比较完整的框架,框架就是这样,一大堆条 ...
- VMvare虚拟机的安装及新建虚拟机.
一.VMvare虚拟机的安装 1.首先双击--你下载的安装包,这里我分享百度云盘,供大家下载:http://pan.baidu.com/s/1jImQSZG 2.VMware Workstation ...
- spring +springmvc+mybatis组合总结
springmvc+spring+mybatis整合:1. 拷贝所需jar2. 创建spring配置文件(beans.xml)3. 配置数据源 <bean id="dataSource ...
- MySQL学习笔记(三)
--回顾 字段类型(列类型):数值型,时间日期型和字符串类型 数值型:整型和小数型(浮点型和定点型) 时间日期型:datetime,date,time,timestamp,year 字符串类型:定长, ...
- multipath多路径实验01-构建iscsi模拟环境
multipath多路径实验01-构建iscsi模拟环境 前几天跟同事网上闲聊技术,吐槽之前自己没有配置过多路径的经历,虽然多路径的配置过程很简单,职责划分也应是主机或存储工程师来搞定,DBA只需要直 ...
- lombok的简单介绍和使用方法
这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...