css代码

*{
margin:;
padding:;
}
td{
width: 4px;
height: 4px;
background: #ccc;
border: 2px solid #ccc;
}
table{
margin: 60px auto 0;
border: 10px solid #333;
background: #ccc;
}

js代码

window.onload = function(){
snake();
}; function snake(){
//<table><tbody><tr><td></td><td></td><td></td></tr></tbody></table>
//创建表格的外层,并存入变量
var oTa = document.createElement('table');
var oTb = document.createElement('tbody');
//循环生成40*40的表格
for(var i=0; i<40; i++){
var oTr = document.createElement('tr');
//需要生成td
for(var j=0; j<40; j++){
var oTd = document.createElement('td');
//oTd.style = "background:#ccc";
oTr.appendChild(oTd);
}
//将tr放到tbody中
oTb.appendChild(oTr);
} //将tbody放入table中
oTa.appendChild(oTb);
oTa.cellSpacing = '1';
document.body.appendChild(oTa); //约定一下所有的颜色 黑边框#333 大背景#ccc 红点背景red #555蛇身的颜色 #eee蛇头的颜色
//随机一个红点,先获取所有的td存起来,以便后续使用
var aTd = document.getElementsByTagName("td");
fruit();
function fruit(){
var num = Math.floor( Math.random()*aTd.length ); //判断是否和蛇重复了
if(aTd[num].style.backgroundColor != 'rgb(238, 238, 238)' && aTd[num].style.backgroundColor != 'rgb(85, 85, 85)'){
aTd[num].style = 'background:red;border:2px solid #333';
}else{
fruit();
} } //初始化蛇的位置
var arr = [[19,20]];
var rows = oTb.rows;
var timer = null;
var keyTimer = null;
var directionCode = "";
var snakeMove ="";
snakeColor();
function snakeColor(){
//蛇身的颜色需要设置
//通过tbody的rows属性可以找到下面的所有tr ,通过tr的cells属性可以找到下面所有td
for(var i=0; i<arr.length; i++){
rows[arr[i][0]].cells[arr[i][1]].style = 'background:#555;border:2px solid #333';
}
rows[arr[0][0]].cells[arr[0][1]].style = 'background:#eee;border:2px solid #333'; //19 = arr[0][0] 20 = arr[0][1]
} //检测键盘事件
document.onkeydown = function(e){
e = e || window.event;
//console.log(e.keyCode);
clearTimeout(keyTimer);
keyTimer = null;
keyTimer = setTimeout(function(){
doKeyAction(e.keyCode);
},20) function doKeyAction(keyCo){
if( keyCo==37||keyCo==38||keyCo==39||keyCo==40 ){
if(Math.abs(directionCode-keyCo) == 2 || directionCode == keyCo){
return;
}else{
directionCode = keyCo;
}
} //37 38 39 40 左上右下 32空格 enter 13
switch (keyCo){
case 37:
//需要执行的代码
snakeTimer(0,-1);
break;
case 38:
//上需要执行的代码
snakeTimer(-1,0);
break;
case 39:
//右需要执行的代码
snakeTimer(0,1);
break;
case 40:
//下需要执行的代码
snakeTimer(1,0);
break;
case 32:
//空格需要执行的代码 暂停 继续
//snakeTimer(0,-1);
if(timer){
clearInterval(timer);
timer = null;
}else{
snakeMove && snakeMove(); // || && a || b 如果a为真,就不会执行b a && b 如果a为真才会执行b
}
break;
}
} //运动的timer
function snakeTimer(y,x){
snakeMove = function(){
snakeTimer(y,x);
};
clearInterval(timer); //TUDO这里的清除timer只是暂时处理
timer = setInterval(function(){
//console.log( [arr[0][0],arr[0][1]-1] ); //当达到25个的时候,进入下一关
if(arr.length >=25){
clearInterval(timer);
alert("恭喜,进入下一关");
window.snakeSpeed = window.snakeSpeed*0.8;
document.body.removeChild(oTa);
snake();
} //检测是否碰到边缘了
if(arr[0][0]+y<0 || arr[0][0]+y>39 || arr[0][1]+x<0 || arr[0][1]+x>39){
fail();
return;
} //检测是否撞到自己了
for(var i=1; i<arr.length; i++){
if(arr[0][0]+y == arr[i][0] && arr[0][1]+x == arr[i][1]){
fail();
return;
}
} arr.unshift( [arr[0][0]+y,arr[0][1]+x] ); //arr.unshift(新值),在arr最前面插入一个(新值)
//是否遇到红色的块了
if(rows[arr[0][0]].cells[arr[0][1]].style.backgroundColor == 'red'){
//console.log("已经迟到水果了");
//重新去生成以红点
fruit();
//console.log(arr);
}else{
rows[arr[arr.length-1][0]].cells[arr[arr.length-1][1]].style = 'background:#ccc;border:2px solid #ccc'; //如何寻找数组的最后一个,arr[arr.length-1]
arr.pop();
}
snakeColor(); },window.snakeSpeed);
} function fail(){
clearInterval(timer);
alert("任务失败");
//TODO:任务失败后重新加载游戏
document.body.removeChild(oTa);
snake();
} }; if(!window.snakeSpeed){
alert("点击方向键开始游戏,点击空格暂停");
window.snakeSpeed = 100;
} }

js编写简单的贪吃蛇游戏的更多相关文章

  1. d3.js 制作简单的贪吃蛇

    d3.js是一个不错的可视化框架,同时对于操作dom也是十分方便的.今天我们使用d3.js配合es6的类来制作一个童年小游戏–贪吃蛇.话不多说先上图片. 1. js snaker类 class Sna ...

  2. 用最少的JS代码写出贪吃蛇游戏---迷你版

    游戏进行页面展示 GAME  OVER 页面展示  代码如下: <!doctype html> <html>   <body>   <canvas id=&q ...

  3. 用OpenGL简单编写的一个最简单贪吃蛇游戏

    刚学OpenGL的时候,写的一个最简单的贪吃蛇游戏代码 如下: //贪吃蛇游戏 #include<stdio.h> #include<stdlib.h> #include< ...

  4. Qt 学习之路 2(34):贪吃蛇游戏(4)

    Qt 学习之路 2(34):贪吃蛇游戏(4) 豆子 2012年12月30日 Qt 学习之路 2 73条评论 这将是我们这个稍大一些的示例程序的最后一部分.在本章中,我们将完成GameControlle ...

  5. Linux平台下贪吃蛇游戏的运行

    1.参考资料说明: 这是一个在Linux系统下实现的简单的贪吃蛇游戏,同学找帮忙,我就直接在Red Hat中调试了一下,参考的是百度文库中"maosuhan"仁兄的文章,结合自己的 ...

  6. 使用Love2D引擎开发贪吃蛇游戏

    今天来介绍博主近期捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章其中我们将会涉及到贪吃蛇的基本算 ...

  7. 100行JS实现HTML5的3D贪吃蛇游戏

    js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型, ...

  8. JS贪吃蛇游戏

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

  9. JavaScript实践-简单的贪吃蛇小游戏

    实现逻辑: //获取Html中的格子(行,列) //建立数组存储所有格子(x,y) //建立数组用于存储蛇身(x,y) //生成随机坐标(x,y)的函数 //随机创建蛇身并存储到蛇身数组 //创建食物 ...

随机推荐

  1. spring 动态创建数据源

    项目需求如下,公司对外提供服务,公司本身有个主库,另外公司会为每个新客户创建一个数据库,客户的数据库地址,用户名,密码,都保存在主数据库中.由于不断有新的客户加入,所以要求,项目根据主数据库中的信息, ...

  2. stm32之USART学习

    首先,我是看着这位博主的文章受到的启发,进而加深了自己对USART的理解.下面是自己改装并实验过的程序. 原文:http://www.cnblogs.com/greatwgb/archive/2011 ...

  3. XtraBackup 原理与安装

    简介 XtraBackup(PXB) 工具是 Percona 公司用 perl 语言开发的一个用于 MySQL 数据库物理热备的备份工具,支持 MySQl(Oracle).Percona Server ...

  4. 在jquery中each循环中,要用return false代替break,return true代替continue。

    在jquery中each循环中,要用return false代替break,return true代替continue. $.each(data, function (n, value) { if(v ...

  5. AOJ/数据结构习题集

    ALDS1_3_A-Stack. Description: Write a program which reads an expression in the Reverse Polish notati ...

  6. Roguelike元素对游戏设计的影响

    Roguelike game自1980年以来,就占据着游戏市场中很大的份额,而现如今的很多游戏中,也加入了Roguelike元素来起到更好的效果.我们知道Roguelike game中有着一些看似任性 ...

  7. 从性能角度看react组件拆分的重要性

    React是一个UI层面的库,它采用虚拟DOM技术减少Javascript与真正DOM的交互,提升了前端性能:采用单向数据流机制,父组件通过props将数据传递给子组件,这样让数据流向一目了然.一旦组 ...

  8. AngularJS的相关应用

    一.[AngularJS常用指令]        1.ng-app:声明Angular所管辖的区域.一般写在body或html上,原则上一个页面只有一个:           <body ng- ...

  9. 产品经理学Python:for循环、while循环

    Python中有两种循环,分别为:for循环和while循环. 1. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次).for循环的 ...

  10. Jquery datatable 动态隐藏列(根据有无值)

    一场景: 前端利用datatable初始化的时候会向后端调用数据,需求是 要动态的使某一列根据传回来的一个标志位是否有值来决定显示与否 这是当前传回值有活动优惠幅度的情况下 这是没有活动优惠的情况下 ...