<!DOCTYPE html>
<html> <head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>JS贪吃蛇游戏</title>
<style>
* {
margin: 0;
padding: 0;
} .box {
width: 482px;
margin: 0 auto;
} .box .main {
float: left;
border: 1px solid #ccc;
} .box .info {
line-height: 60px;
} .box .info p {
float: left;
margin-right: 20px;
} .main .row {
overflow: hidden;
} .main .col,
.main .active {
float: left;
width: 20px;
height: 20px;
} .main .active {
background: red;
}
</style>
<script>
// 模仿jquery获取元素
function $(selector, content) { content = content || document; var sTag = selector.charAt(),
arr = [],
allName = content.getElementsByTagName('*'); if (sTag === '#') { selector = selector.substring(1); // console.log(selector);
return content.getElementById(selector); } else if (sTag === '.') { selector = selector.substring(1); for (var i = 0; i < allName.length; i++) {
var sstr = allName[i].className.indexOf(selector); if (sstr != -1) {
arr.push(allName[i]);
};
}; // console.log(arr);
return arr; } else {
return content.getElementsByTagName(selector);
};
} window.onload = function() {
var oMap = $('#map');
oMap.innerHTML = ''; var nRow = 20, //行
nCol = 20, //列
g = 3, //蛇默认蛇身长度
x = 0, //蛇头在哪一行
y = g - 1, //蛇头在那一列
foodX = 0,
foodY = 0; //食物的x,y轴位置 // 蛇的长度
var aSnakes = new Array();
var timer = null;
var score = 0;
var speed = 200; //默认初始速度
// 添加地图布局
var AllCols = new Array();
for (var i = 0; i < nRow; i++) {
var row = document.createElement('div');
row.className = 'row'; var aRow = new Array();
for (var j = 0; j < nCol; j++) {
var col = document.createElement('div');
col.className = 'col'; row.appendChild(col) aRow[j] = col; //添加col到数组中
}; // 把所有row的col 添加到数组中
AllCols[i] = aRow;
oMap.appendChild(row)
}; // 循环蛇长度
for (var k = 0; k < g; k++) {
AllCols[0][k].className = 'col active';
aSnakes[k] = AllCols[0][k];
}; // 第一个蛇隐藏
function firstHide(obj) {
obj[0].className = 'col';
} // 最后一个蛇,往前挪动
function lastShow(obj) {
obj[obj.length - 1].className = 'col active';
} // 控制键盘方向
var dir = 'right',
oldDir = dir;
var fa = false;
document.onkeydown = function(ev) {
var ev = ev || event; // 保存上一个值
oldDir = dir; dir = ev.keyCode; // 排除所有非方向箭
if (dir>40 || dir<37) {
dir = oldDir;
}; // 排除相反方向,如果正在向下移动,按上则无效
if (dir == 38 && oldDir == 'bottom') {
dir = 'bottom';
} else if (dir == 39 && oldDir == 'left') {
dir = 'left'
} else if (dir == 40 && oldDir == 'top') {
dir = 'top'
} else if (dir == 37 && oldDir == 'right') {
dir = 'right'
}; // 正常行走
if (dir == 39) {
dir = 'right';
} else if (dir == 38) {
dir = 'top'; } else if (dir == 37) {
dir = 'left'; } else if (dir == 40) {
dir = 'bottom';
} }; // 生成食物坐标
function food() {
foodX = Math.floor(Math.random() * nRow) //食物在哪一行
foodY = Math.floor(Math.random() * nCol) //食物在哪一列 // 排除在自己身上
if (AllCols[foodX][foodY].className == 'col active') {
food();
} else {
AllCols[foodX][foodY].className = 'col active';
}; };
food(); // 蛇吃到虫子新增长度
function addSnake() {
aSnakes[aSnakes.length] = AllCols[foodX][foodY];
g += 1;
score += 1; if (speed == 100) {
speed -= 10
} else if (speed == 50) {
speed -= 5
} else {
speed -= 20;
}; document.getElementById('score').innerHTML = score;
food();
} // 游戏结束
function gameOver() {
alert('游戏结束!');
clearTimeout(timer);
}; // 检测是否碰到自身
function checkMe(arr) {
var bflag = true; for (var i = 0; i < aSnakes.length; i++) {
if (aSnakes[i] == arr) {
bflag = false;
};
}; return bflag;
}; // 游戏开始
function start() { switch (dir) {
case 'left': // 是否撞到墙
if (y - 1 >= 0) { // 是否吃到自身
if (checkMe(AllCols[x][y - 1])) { // 蛇尾隐藏
firstHide(aSnakes) if (x == foodX && y - 1 == foodY) {
addSnake(); } else {
for (var i = 0; i < aSnakes.length - 1; i++) {
aSnakes[i] = aSnakes[i + 1]
};
aSnakes[g - 1] = AllCols[x][y - 1];
}; // 新蛇头显示
lastShow(aSnakes) y -= 1; timer = setTimeout(start, speed); } else {
gameOver(); }; } else {
gameOver();
}; break; case 'top': // 是否撞到墙
if (x - 1 >= 0) { // 是否吃到自身
if (checkMe(AllCols[x - 1][y])) { // 蛇尾隐藏
firstHide(aSnakes) if (x - 1 == foodX && y == foodY) {
addSnake();
} else {
for (var i = 0; i < aSnakes.length - 1; i++) {
aSnakes[i] = aSnakes[i + 1]
};
aSnakes[g - 1] = AllCols[x - 1][y];
}; // 新蛇头显示
lastShow(aSnakes) x -= 1; timer = setTimeout(start, speed); } else {
gameOver(); }; } else {
gameOver();
}; break; case 'right': // 是否撞到墙
if (y + 1 < nCol) {
// 是否吃到自身
if (checkMe(AllCols[x][y + 1])) { // 蛇尾隐藏
firstHide(aSnakes) if (x == foodX && y + 1 == foodY) {
addSnake();
} else {
for (var i = 0; i < aSnakes.length - 1; i++) {
aSnakes[i] = aSnakes[i + 1]
};
aSnakes[g - 1] = AllCols[x][y + 1];
}; // 新蛇头显示
lastShow(aSnakes) // aSnakes[g - 1] = AllCols[x][y-1]; //倒数第二个
// console.log(aSnakes[g - 1],AllCols[x][y - 1]); y += 1; timer = setTimeout(start, speed); } else {
gameOver(); }; } else {
gameOver();
}; break; case 'bottom':
// console.log(aSnakes[g - 1]); // 是否撞到墙
if (x + 1 < nRow) { // 是否吃到自身
if (checkMe(AllCols[x + 1][y])) { // 蛇尾隐藏
firstHide(aSnakes) if (x + 1 == foodX && y == foodY) {
addSnake();
} else {
for (var i = 0; i < aSnakes.length - 1; i++) {
aSnakes[i] = aSnakes[i + 1]
};
aSnakes[g - 1] = AllCols[x + 1][y]; }; // 新蛇头显示
lastShow(aSnakes) x += 1; timer = setTimeout(start, speed); } else {
gameOver(); }; } else {
gameOver();
};
break;
} // console.log(aSnakes); } var oStart = document.getElementById("start");
oStart.onclick = function() {
start();
};
};
</script>
</head> <body>
<div class="box">
<h1>JS贪吃蛇游戏</h1>
<div class="info">
<p class="text">您的分数:<span id="score">0</span>分</p>
<p>按[上下左右]方向键吃虫</p>
<input id="start" type="button" value="开始游戏" />
</div>
<div class="main" id="map"></div>
</div>
</body> </html>

JS贪吃蛇游戏的更多相关文章

  1. 原生Js贪吃蛇游戏实战开发笔记

    前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...

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

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

  3. 一个原生JS实现的不太成熟的贪吃蛇游戏

    一个初初初初级前端民工 主要是记录一下写过的东西,复习用 大佬们如果看到代码哪里不符合规范,或者有更好写法的,欢迎各位批评指正 十分感谢 实现一个贪吃蛇游戏需要几步? 1.有地图 2.有蛇 3.有食物 ...

  4. WebGL实现HTML5的3D贪吃蛇游戏

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

  5. H5实现的可自定义贪吃蛇游戏

    原创游戏,使用lufylegend.js开发 用canvas实现的贪吃蛇游戏,与一般的贪吃蛇游戏不同,图片经过美工设计,代码设计支持扩展和自定义. 游戏元素丰富,包括障碍物(仙人掌),金币(奖励),苹 ...

  6. 使用electron为贪吃蛇游戏创建全局快捷键

    上图就是我们的简体版贪吃蛇游戏,我们可以看到使用键盘上面的上下左右可以对贪吃蛇进行控制. The picture above is our simplified version of Snake Ea ...

  7. Android快乐贪吃蛇游戏实战项目开发教程-01项目概述与目录

    一.项目简介 贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏. 我已经将做好的案例上传到了应用宝,无病毒.无广告,大家可以放心下载下来把玩一下.应用宝 ...

  8. 用C++实现的贪吃蛇游戏

    我是一个C++初学者,控制台实现了一个贪吃蛇游戏. 代码如下: //"贪吃蛇游戏"V1.0 //李国良于2016年12月29日编写完成 #include <iostream& ...

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

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

随机推荐

  1. tar linux 打包 压缩 gzip 命令说明

    参数:-c  :建立一个压缩档案的参数指令(create 的意思):-x  :解开一个压缩档案的参数指令!-t  :查看 tarfile 里面的档案!      特别注意,在参数的下达中, c/x/t ...

  2. 读书笔记-HBase in Action-第二部分Advanced concepts-(1)HBase table design

    本章以山寨版Twitter为例介绍HBase Schema设计模式.广义的HBase Schema设计不仅仅包含创建表时指定项,还应该综合考虑Column families/Column qualif ...

  3. Run-Time Check Failure #2 - Stack around the variable 'ucPriKey' was corrupt

    Run-Time    Check    Failure    #2        一般是栈被破坏,你的代码可能有缓冲区溢出一类的问题. Run-Time Check Failure #2 - Sta ...

  4. HDU 1242 rescue and 优先级队列的条目

    Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is ...

  5. Ebean Demo

    ebean  orm框架,其作者觉得hibernate的bean管理会话管理.难以在短时间明确,就自己搞了一套,就成了如今的ebean. ebean被一些开发人员这觉得是一把瑞士军刀.能够看出一些程序 ...

  6. java 集合排序(转)

    Java API针对集合类型排序提供了两种支持:java.util.Collections.sort(java.util.List)java.util.Collections.sort(java.ut ...

  7. android.util.Log说明和android 像素说明

    1. android.util.Log常用的方法有以下5个:Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母对应VERBOSE,DEBUG,INFO, ...

  8. chrome vim插件vimnum快捷键与使用

    Navigating the page j : Scroll down (scrollDown) k : Scroll up (scrollUp) h : Scroll left (scrollLef ...

  9. Powerdesigner中如何生成测试数据

    设计表完成以后,我们需要生成一些测试数据,可以直接更新到数据库中,下面我们就来试试: 第一步:建立需要的Profiles测试文件,[Model]--[Test Data Profiles],如图所示: ...

  10. day-9

    /* 考前第9天 区间*的线段树居然卡住了23333 明天再搞搞 今天针对考试复习了几个板子 手动堆都打了 实测比priority快 下午考试成了炮灰233333 晚上复习矩阵乘法 手推9*9矩阵 可 ...