JavaScript 实现简易贪吃蛇游戏完整代码
作者:小括号时间:2026-10-23 21:01:59浏览:120
本文提供基于 JavaScript 和 HTML5 Canvas 的简易贪吃蛇游戏完整实现方案。内容涵盖游戏画布布局、蛇身移动逻辑、食物生成机制及键盘事件监听。通过解析核心代码结构,帮助开发者快速理解前端小游戏开发流程,可直接参考示例代码进行学习与二次开发。
JavaScript 贪吃蛇游戏实现概述
本文分享了使用 JavaScript 开发简易贪吃蛇游戏的完整代码示例,供读者参考学习。
游戏界面与核心逻辑代码
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="utf-8">
<style type="text/css">
#body{
width: 900px;/*长宽最好是obj的倍数*/
height: 600px;
border-width: 10px;
border-style: solid;
border-color: blue;
line-height:600px;/*文本垂直居中*/
text-align: center;/*文本水平居中*/
position: relative;/*相对定位*/
left: 0px;
top: 0px;
}
#obj{
width: 30px;
height: 30px;
background-color: red;
position: absolute;/*绝对定位*/
left: 0px;
top: 0px;
z-index: 1;/*头部在上层显示*/
}
div{
text-align: center;
line-height:30px;
}
</style>
</head>
<body id='body'>
<!--内容-->
按awsd移动
<div id='obj'></div>
<select id='speed' onclick="setspeed(this)">
<option value="100">快速</option>
<option value="500">中速</option>
<option value="1000" selected>慢速</option>
</select>
| <button onclick="lenbodyadd()">身体+1</button>
| <button onclick="stopspeed()">暂停</button>
<div class="div"></div>
</body>
</html>
<script>
var val={key:"d"};//默认向右移动
var key = document.getElementById("body");
key.onkeydown =f; //注册keydown事件处理函数
var divnum=1;//身体每节编号
var lenbody=5;//默认身体长度
var speed=1000;//默认速度
var obj=document.getElementById('obj');
var myWidth=parseInt(getComputedStyle(obj,null).getPropertyValue('width'));
var myHeight=parseInt(getComputedStyle(obj,null).getPropertyValue('height'));
var clientH= document.body.clientHeight;//获取body高
var clientW= document.body.clientWidth;//获取body宽
var foodLeft=0;//食物x坐标
var foodTop=0;//食物y坐标
function f (va) {
var e = e || window.event; //标准化事件处理
let s = '';//val.type + " " + val.key; //获取键盘事件类型和按下的值
let key=val.key;
val=va;
var myTop=parseInt(getComputedStyle(obj,null).getPropertyValue('top'));//获取精灵y坐标 parseInt(obj.style.top);
var myLeft=parseInt(getComputedStyle(obj,null).getPropertyValue('left'));//获取精灵x坐标 parseInt(obj.style.left);
var movePx=myWidth;//每次移动的距离
var move=0;
if(key=='w'){
move=myTop-movePx;//每次移动10
if(move<0 || move>clientH){
return false;//不能超过边界
}
obj.style.top=move+'px';
s='上';
}
if(key=='s'){
move=myTop+movePx;
if(move<0 || move>clientH-myHeight){
return false;
}
obj.style.top=move+'px';
s='下';
}
if(key=='a'){
move=myLeft-movePx;
if(move<0 || move>clientW){
return false;
}
obj.style.left=move+'px';
s='左';
}
if(key=='d'){
move=myLeft+movePx;
if(move<0 || move>clientW-myWidth){
return false;
}
obj.style.left=move+'px';
s='右';
}
obj.innerText=s;//设置文本 & 清楚之前的元素
console.log(move+' top:'+myTop+' left:'+myLeft);
//移除之前的身体元素,使有头有尾
if(document.getElementsByClassName('div').length>=lenbody){
document.getElementsByClassName('div')[0].parentNode.removeChild(document.getElementsByClassName('div')[0]);
}
//div身体元素随后移动
let newMyMoveWidth=myLeft;
let newMyMoveHeight=myTop;
let div=document.createElement('div');
div.className ='div';
div.style.width = myWidth + 'px';
div.style.height = myHeight + 'px';
div.style.position = 'absolute';
div.style.left=newMyMoveWidth + 'px';
div.style.top=newMyMoveHeight + 'px';
div.style.backgroundColor='blue';
div.innerHTML=divnum;//设置文字|方便识别div顺序
obj.parentNode.appendChild(div);
console.log('newMyMoveWidth:'+newMyMoveWidth+' newMyMoveHeight:'+newMyMoveHeight);
divnum++;
ifeatfood(myLeft,myTop);
} /*f() end--*/
//生成食物
function setfood(){
foodLeft=parseInt(Math.random()*clientW);
foodTop=parseInt(Math.random()*clientH);
let div=document.createElement('div');
div.id ='food';
div.style.width = myWidth + 'px';
div.style.height = myHeight + 'px';
div.style.position = 'absolute';
div.style.left= foodLeft + 'px';
div.style.top= foodTop + 'px';
div.style.backgroundColor='pink';
div.innerHTML='吃';//设置文字|方便识别div顺序
document.body.appendChild(div);
}
setfood();
//判断吃到食物
function ifeatfood(myLeft,myTop){
//判断是否吃到食物
if(Math.abs(foodLeft-myLeft)<myWidth && Math.abs(foodTop-myTop)<myHeight){
lenbodyadd();//长度+1
//删除旧food,生成新food
document.getElementById('food').parentNode.removeChild(document.getElementById('food'));
setfood();
}
}
//吃到食物身体加1
function lenbodyadd(){
lenbody++;
}
//保持移动
var setinter=setInterval((function move(){
f(val);
}),speed);
//设置移动速度
function setspeed(obj){
speed=obj.options[obj.options.selectedIndex].value;
stopspeed();
setinter=setInterval((function move(){
f(val);
}),speed);
}
//停止移动
function stopspeed(){
clearInterval(setinter);
}
//窗口改变时跳转-防f12
window.onresize = ()=>{
console.log(window.innerWidth,window.innerHeight);
//window.location.href='https://www.baidu.com';
}
</script>
此外,本站还提供了更多经典小游戏的开发专题,感兴趣的用户可以查阅以下相关资源:
C++ 语言经典小游戏合集
Python 语言经典小游戏合集
Python 实现的俄罗斯方块游戏集合
JavaScript 经典游戏系列,持续更新中
Java 语言经典小游戏合集
JavaScript 经典小游戏汇总专区
以上就是本文的全部内容,希望这些代码示例能对您的学习有所帮助。如果您觉得有用,欢迎继续支持本站。
作者最新文章
JS语法错误会阻止加载吗?区分SyntaxError与资源加载失败
2026-11-05 16:08:46
JavaScript常见SyntaxError语法错误排查与修复方法
2026-11-05 13:58:44
JS中slice、substring和substr截取字符串的区别
2026-11-05 13:43:47
JS 转 TS 手动迁移最佳实践:从配置 tsconfig 到消除 any 类型
2026-11-05 11:53:32
为什么JS数组push后得到的是数字而不是数组?
2026-11-05 09:59:18
