话不多说,请看代码:
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇</title> <link rel="stylesheet" href="style.css"> <script src="style.js" ></script> </head> <body> <div id="container"></div> </body> </html>
第一步:初始化地图,创建蛇圈。
第二步:创建蛇,随机生产食物。
第三步:让蛇移动起来。
第四步:通过js绑定键盘事件,控制蛇移动方向。
var box={width:50,height:50};//每一个方块的高度
var snake=[];//保存蛇每一节身体对应的span
var DIR={
DIR_RIGHT:1,
DIR_LEFT:2,
DIR_TOP:3,
DIR_BOTTOM:4
};
var dir=DIR.DIR_BOTTOM;
var food=null; //始终记录当前的食物
window.onload=function(){
//1.初始化地图
initMap();
//2.创建蛇
//2.5随机显示食物
showFood();
createSnake();
//3.让蛇动起来
setInterval(snakeMove,100);
//4.控制蛇移动
document.onkeyup=function(e){
switch(e.keyCode){
case 37:dir=DIR.DIR_LEFT;break;
case 38:dir=DIR.DIR_TOP;break;
case 39:dir=DIR.DIR_RIGHT;break;
case 40:dir=DIR.DIR_BOTTOM;break;
}
}
};
function isInSnakeBody(left,top){
for(var i=0;i<snake.length;i++){
if(snake[i].offsetTop==top&&snake[i].offsetLeft==left){
return true;
}
}
}
//这种随机生成食物的方法效率低---随着蛇身体的增长,随机生成食物的时间会变慢。
function showFood(){
var con=document.getElementById("container");
food=document.createElement("span");
food.className="food";
food.style.width=box.width+"px";
food.style.height=box.height+"px";
var left,top;
do{
left=Math.floor((con.offsetWidth-2)/box.width*Math.random())*box.width;
top=Math.floor((con.offsetHeight-2)/box.height*Math.random())*box.height;
}while(isInSnakeBody(left,top));
food.style.left=left+"px";
food.style.top=top+"px";
con.appendChild(food);
}
function initMap(){
var con=document.getElementById("container");
var row=Math.floor(con.offsetWidth/box.width);
var rol=Math.floor(con.offsetHeight/box.height);
var num=row*rol;
var newSpan=null;
for(var i=1;i<=num;i++){
newSpan=document.createElement("span");
newSpan.style.width=box.width+"px";
newSpan.style.height=box.height+"px";
con.appendChild(newSpan);
}
}
function createSnake(){
var newBody=null;
var con=document.getElementById("container");
for(var i=1;i<=5;i++){
newBody=document.createElement("span");
newBody.style.width=box.width+"px";
newBody.style.height=box.height+"px";
newBody.style.left=(i-1)*box.width+"px";
newBody.style.top="0px";
newBody.className="snake";
con.appendChild(newBody);
snake.push(newBody);
}
}
function snakeMove(){
var con=document.getElementById("container");
//蛇头移动
var head=snake[snake.length-1];
var newTop=head.offsetTop,newLeft=head.offsetLeft;
switch(dir){
case DIR.DIR_LEFT:newLeft-=box.width; break;
case DIR.DIR_RIGHT:newLeft+=box.width; break;
case DIR.DIR_TOP:newTop-=box.height; break;
case DIR.DIR_BOTTOM:newTop+=box.height; break;
default:break;
}
//如果超出边界,计算蛇头下一个位置的坐标
if(newLeft>con.offsetWidth-2-1){newLeft=0;}
if(newLeft<0){newLeft=con.offsetWidth-2-box.width;}
if(newTop<0){newTop=con.offsetHeight-2-box.height;}
if(newTop>con.offsetHeight-2-1){newTop=0;}
//判断新蛇头的位置是不是在蛇身体里面
//for(var i=0;i<snake.length-1;i++){
// if(snake[i].offsetLeft==newLeft&&snake[i].offsetTop==newTop){
// alert("Game over!!");
// window.location.href=window.location.href;
// }
//}
//1.如果吃到食物
if(newLeft==food.offsetLeft&&newTop==food.offsetTop){
food.className="snake";
snake.push(food);
showFood();
return;
}
//2.如果没吃到
//除蛇头外身体移动
for(var i=0;i<snake.length-1;i++){
snake[i].style.top=snake[i+1].offsetTop+"px";
snake[i].style.left=snake[i+1].offsetLeft+"px";
}
head.style.left=newLeft+"px";
head.style.top=newTop=newTop+"px";
}
*{
padding:0;
margin:0;
}
html,body{
width:100%;
height:100%;
}
body{
position:relative;
}
div#container{
position:absolute;
top:0;
bottom:0;
left:0;
right:0;
margin:auto;
width:800px;
height:500px;
border:1px solid black;
font-size:0px;
}
span{
display:inline-block;
border:1px solid black;
box-sizing:border-box;
}
span.snake{
position:absolute;
background-color:red;
}
span.food{
position:absolute;
background-color:blue;
}
最后的效果图如下:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# js
# 贪吃蛇
# JS写的贪吃蛇游戏(个人练习)
# javascript贪吃蛇完整版(源码)
# JS实现的贪吃蛇游戏完整实例
# 20行js代码实现的贪吃蛇小游戏
# js编写贪吃蛇的小游戏
# js贪吃蛇游戏实现思路和源码
# javascript 贪吃蛇实现代码
# javascript实现简单的贪吃蛇游戏
# 原生js实现的贪吃蛇网页版游戏完整实例
# js手写贪吃蛇游戏实例源码
# 吃到
# 多说
# 第二步
# 绑定
# 第三步
# 变慢
# 第四步
# DIR_RIGHT
# span
# DIR
# DIR_BOTTOM
# DIR_LEFT
# DIR_TOP
# box
# null
# var
# height
# snake
# width
相关文章:
php json中文编码为null的解决办法
大型企业网站制作流程,做网站需要注册公司吗?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何在万网ECS上快速搭建专属网站?
如何配置支付宝与微信支付功能?
金*站制作公司有哪些,金华教育集团官网?
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
红河网站制作公司,红河事业单位身份证如何上传?
如何在宝塔面板中创建新站点?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
简历在线制作网站免费版,如何创建个人简历?
建站之星免费版是否永久可用?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
如何通过FTP服务器快速搭建网站?
如何在阿里云ECS服务器部署织梦CMS网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
常州自助建站费用包含哪些项目?
昆明网站制作哪家好,昆明公租房申请网上登录入口?
如何选择高效便捷的WAP商城建站系统?
建站之星安装路径如何正确选择及配置?
如何选择高效响应式自助建站源码系统?
公司网站设计制作厂家,怎么创建自己的一个网站?
如何配置FTP站点权限与安全设置?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
如何快速查询网站的真实建站时间?
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
在线教育网站制作平台,山西立德教育官网?
如何用PHP快速搭建CMS系统?
如何选择PHP开源工具快速搭建网站?
如何通过服务器快速搭建网站?完整步骤解析
香港服务器租用每月最低只需15元?
微信推文制作网站有哪些,怎么做微信推文,急?
企业网站制作公司网页,推荐几家专业的天津网站制作公司?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
如何零成本快速生成个人自助网站?
建站之星如何配置系统实现高效建站?
如何通过商城免费建站系统源码自定义网站主题?
建站与域名管理如何高效结合?
宝塔建站后网页无法访问如何解决?
移民网站制作流程,怎么看加拿大移民官网?
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
如何在宝塔面板中修改默认建站目录?
济南网站制作的价格,历城一职专官方网站?
Android使用GridView实现日历的简单功能
如何在Windows虚拟主机上快速搭建网站?
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
如何通过NAT技术实现内网高效建站?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。