0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用javascript制作一个网页端3D贪吃蛇游戏(附源码)

图扑-数字孪生 来源:物联网袋鼠 作者:物联网袋鼠 2023-09-01 12:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

3D 网页版贪吃蛇游戏!下面来具体讲一下如何实现。

该游戏使用 Hightopo 的 SDK 制作,总共 100 多行代码,没有 WebG L基础的同学们也可很快掌握。

场景初始化

首先,我们对页面进行初始化,包括初始化3D场景,设置地面网格,以及开启事件监听等。主要代码及注释如下:

w = 40; // 网格间距
m = 20; // 网格行列数
d = w * m / 2;
food = null;
dm = new ht.DataModel();
g3d = new ht.graph3d.Graph3dView(dm); // 初始化一个3d场景
// 配置网格
g3d.setGridVisible(true);
g3d.setGridColor('#29B098');
g3d.setGridSize(m);
g3d.setGridGap(w);
// 将3D场景添加到body下面
view = g3d.getView();
view.className = 'main';
document.body.appendChild(view);
// 开启事件监听
window.addEventListener('resize', function (e) { g3d.invalidate(); }, false);
g3d.sm().setSelectionMode('none');
view.addEventListener(ht.Default.isTouchable ? 'touchstart' : 'mousedown', function(e){
if(isRunning){
var p = g3d.getHitPosition(e); // 获取当前鼠标点击点在3D场景中的位置
// 根据点击点x,z轴坐标,计算贪吃蛇前进方向
if(Math.abs(p[0]) < d && Math.abs(p[2]) < d){
if(direction === 'up' || direction === 'down'){
direction = p[0] > snake[0].p3()[0] ? 'right' : 'left';
}
else if(direction === 'left' || direction === 'right'){
direction = p[2] > snake[0].p3()[2] ? 'down' : 'up';
}
}
}else if(ht.Default.isDoubleClick(e)){
start(); // 双击启动游戏
}
}, false);
start();
setInterval(function(){ if(isRunning){ isRunning = next(); } }, 200); // 每间隔200ms贪吃蛇往前走一步

创建食物

贪吃蛇每次吃完一个食物,其身体就会增长一段。此时需要创建新的食物并随机放到一个新的位置。创建食物时,其位置不能与上一个位置重合,也不能与当前贪吃蛇身体重复。

/**
* 创建食物,并摆放到随机位置。
* 食物不能放到贪吃蛇身上,也不能放到上一个食物的位置
*
*/
function createFood(){
var x = getRandom(), y = getRandom();
// 确保新创建的食物不与贪吃蛇重叠,也不与上一个食物的位置重叠
while(touchFood(x, y) || touchSnake(x, y)){ x = getRandom(); y = getRandom(); }
if(food) dm.remove(food);
food = createNode(x, y);
food.s({'shape3d': 'sphere', 'shape3d.color': 'red'});
}
/**
* x, y是否与snake身体重叠
*
* @param {*} x
* @param {*} y
* @return {*}
*/
function touchSnake(x, y){
for(var i=0; i< snake.length; i++){
if(snake[i].a('x') === x && snake[i].a('y') === y){ return true; }
}
return false;
}
/**
* x, y是否与食物身体重叠
*
* @param {*} x
* @param {*} y
* @return {*}
*/
function touchFood(x, y){
return food && food.a('x') === x && food.a('y') === y;
}
function getRandom(){
return parseInt(Math.random() * m);
}
/**
* 创建一个节点,调整其位置和大小
*
* @param {*} x
* @param {*} y
* @return {*}
*/
function createNode(x, y){
var node = new ht.Node();
node.a({ x: x, y: y });
node.s3(w*0.9, w*0.9, w*0.9);
node.p3(-w*m/2+w*x+w/2, w/2, -w*m/2+w*y+w/2);
dm.add(node);
return node;
}

创建贪吃蛇及四周围墙

在第一步初始化时,我们设置了网格大小及间距。这样也就确定了整个网格的长宽以及贪吃蛇每个块的大小。在这一步,我们为网格增加边界,同时生成贪吃蛇。

/**
* 清空场景。创建贪吃蛇及四周围墙。
*
*/
function start(){
dm.clear(); snake = []; score = 0; direction = 'up'; isRunning = true;
// 四周围墙
shape = new ht.Shape();
shape.setPoints(new ht.List([
{x: -d, y: d},
{x: d, y: d},
{x: d, y: -d},
{x: -d, y: -d},
{x: -d, y: d}
]));
shape.setThickness(4);
shape.setTall(w);
shape.setElevation(w/2);
shape.s({'all.color': 'rgba(20, 120, 120, 0.5)', 'all.transparent': true, 'all.reverse.cull': true});
dm.add(shape);
// 创建贪吃蛇的身体
for(var i=0; i< m/2; i++) { snake.push(createNode(m/2 + i, m/2)); }
createFood();
}

处理贪吃蛇行走逻辑

有了贪吃蛇和食物后,下一步就是处理贪吃蛇行走逻辑。包括:

* 1. 检测到达边界或接触自己身体,则游戏结束

* 2. 如果吃到食物,则身体增加一段

* 3. 否则,继续往前走

/**

* 根据direction计算下一个位置。同时:

* 1. 检测到达边界或接触自己身体,则游戏结束

* 2. 如果吃到食物,则身体增加一段

* 3. 继续往前走

*
* @return {*}
*/
function next(){
var node = snake[0], x = node.a('x'), y = node.a('y');
if(direction === 'up') y--;
if(direction === 'down') y++;
if(direction === 'left') x--;
if(direction === 'right') x++;
if(x < 0 || x >= m || y < 0 || y >= m || touchSnake(x, y)){ return false; }
if(touchFood(x, y)){
score++;
snake.splice(0, 0, createNode(x, y));
createFood();
}else{
snake.splice(0, 0, createNode(x, y));
dm.remove(snake.pop());
}
return true;
}

到这里,整个贪吃蛇游戏就完成了。双击场景即可启动游戏。点击场景可改变贪吃蛇运动方向。


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 3D
    3D
    +关注

    关注

    9

    文章

    3023

    浏览量

    115577
  • JAVA
    +关注

    关注

    20

    文章

    3006

    浏览量

    116835
  • 源码
    +关注

    关注

    8

    文章

    689

    浏览量

    31514
  • javascript
    +关注

    关注

    0

    文章

    526

    浏览量

    56530
  • javascript编程

    关注

    0

    文章

    2

    浏览量

    1986
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    使用MoonBit和Raylib构建原生移动游戏

    当你想做一个简单的手机游戏,比如 Flappy Bird、2048、贪吃蛇——你的第反应可能是打开 Unity 或者 Godot。但你有没有想过:对于
    的头像 发表于 03-14 11:21 833次阅读
    使用MoonBit和Raylib构建原生移动<b class='flag-5'>端</b><b class='flag-5'>游戏</b>

    常见3D打印材料介绍及应用场景分析

    3D打印材料种类丰富,不同材料性能差异明显。本文介绍PLA、ABS、PETG等常见3D打印材料的特点与应用场景,帮助读者了解3D打印用什么材料更合适,为选材提供基础参考。
    的头像 发表于 12-29 14:52 907次阅读
    常见<b class='flag-5'>3D</b>打印材料介绍及应用场景分析

    探索TLE493D-P3XX-MS2GO 3D 2Go套件:开启3D磁传感器评估之旅

    )的TLE493D-P3XX-MS2GO 3D 2Go套件为我们提供了便捷、高效的解决方案。今天,我们就来深入了解下这个套件,看看它能
    的头像 发表于 12-18 17:15 1323次阅读

    技术解析:超声切割在3D打印后处理与手工制作中的应用

    对于许多3D打印爱好者和手工制作者来说,模型支撑去除或材料切割是创作中既关键又令人头疼的环节。使用美工刀容易留下划痕,而传统切割方式可能导致材料边缘发黑或产生毛边。种基于高频振动原理的切割技术,为
    的头像 发表于 12-17 16:45 685次阅读
    技术解析:超声切割在<b class='flag-5'>3D</b>打印后处理与手工<b class='flag-5'>制作</b>中的应用

    iDS iToF Nion 3D相机,开启高性价比3D视觉新纪元!

    、友思特新品 友思特 iDS uEye Nion iTof 3D相机将 120 万像素的卓越空间分辨率与可靠的深度精度相结合—即使在极具挑战性的环境中也能确保获取精细的 3D 数据。 其外壳达到
    的头像 发表于 12-15 14:59 556次阅读
    iDS iToF Nion <b class='flag-5'>3D</b>相机,开启高性价比<b class='flag-5'>3D</b>视觉新纪元!

    微纳尺度的神笔——双光子聚合3D打印 #微纳3D打印

    3D打印
    杨明远
    发布于 :2025年10月25日 13:09:29

    技术资讯 I 图文详解 Allegro X PCB Designer 中的 3D 模型映射

    本文要点面对市面上的切要将PCB板放进盒子里的产品的设计都离不开3D模型映射这个功能,3D协同设计保证了产品的超薄化、高集成度的生命线
    的头像 发表于 10-17 16:16 1999次阅读
    技术资讯 I 图文详解 Allegro X PCB Designer 中的 <b class='flag-5'>3D</b> 模型映射

    玩转 KiCad 3D模型的使用

    时间都在与 2D 的焊盘、走线和丝印打交道。但完整的产品,终究是要走向物理世界的。元器件的高度、接插件的朝向、与外壳的配合,这些都是 2D 视图难以表达的。 幸运的是,KiCad
    的头像 发表于 09-16 19:21 1.2w次阅读
    玩转 KiCad <b class='flag-5'>3D</b>模型的使用

    季丰电子邀您相约2025国际3D视觉感知与应用大会

    9月20日 - 21日,国际3D视觉感知与应用大会将在苏州太湖国际会议中心盛大启幕,大会议题涵盖3D成像与测量、3D视觉、3D显示、3D应用
    的头像 发表于 09-08 15:03 1201次阅读

    AD 3D封装库资料

     AD  PCB 3D封装
    发表于 08-27 16:24 8次下载

    3D打印能用哪些材质?

    3D打印的材质有哪些?不同材料决定了打印效果、强度、用途乃至安全性,本文将介绍目前主流的3D打印材质,帮助你找到最适合自己需求的材料。
    的头像 发表于 07-28 10:58 4443次阅读
    <b class='flag-5'>3D</b>打印能用哪些材质?

    英伦科技10.1英寸裸眼3D数码相框升级了,玩转AI文生图太cool了!

    此次升级将AI内容生成与裸眼3D显示深度结合,解决了传统3D内容制作成本高的痛点,使普通用户也能轻松创作个性化立体图像。配合无线传输、智能转化等成熟功能,该产品已成为集科技、艺术与情感于
    的头像 发表于 07-03 11:31 13.5w次阅读
    英伦科技10.1英寸裸眼<b class='flag-5'>3D</b>数码相框升级了,玩转AI文生图太cool了!

    基于树莓派的工业级 3D 打印机!

    基于计算模4的3D打印机功能强大、可靠且易于使用!Formlabs采用树莓派计算模块4为其最新款3D打印机Form4提供动力,提升了其旗舰系列打印机的速度、质量和成功率,为工业和商业客户提供了
    的头像 发表于 06-29 08:22 1414次阅读
    基于树莓派的工业级 <b class='flag-5'>3D</b> 打印机!

    3D AD库文件

    3D库文件
    发表于 05-28 13:57 6次下载

    2025年3D工业相机选型及推荐

    3D工业相机的选型
    的头像 发表于 05-21 16:49 2093次阅读
    2025年<b class='flag-5'>3D</b>工业相机选型及推荐