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

    文章

    2989

    浏览量

    113779
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115627
  • 源码
    +关注

    关注

    8

    文章

    682

    浏览量

    31082
  • javascript
    +关注

    关注

    0

    文章

    525

    浏览量

    55983
  • javascript编程

    关注

    0

    文章

    2

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    玩转 KiCad 3D模型的使用

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

    AD 3D封装库资料

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

    3D打印能用哪些材质?

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

    3D AD库文件

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

    3D闪存的制造工艺与挑战

    3D闪存有着更大容量、更低成本和更高性能的优势,本文介绍了3D闪存的制造工艺与挑战。
    的头像 发表于 04-08 14:38 1805次阅读
    <b class='flag-5'>3D</b>闪存的制造工艺与挑战

    开源项目!如何制作手机用的电动3D扫描转盘

    这个项目里,作者会教你怎么做一个简单的电动3D扫描转盘,主要是给手机用的。整个装置分为三部分:顶板、齿轮板和底座。顶板是固定的平台,用来放置你要扫描的物体。 中间的齿轮板是整个装
    发表于 03-25 13:45

    让人欲罢不能树莓派贪吃蛇掌机!

    经典游戏贪吃蛇》的掌机,并为其设计了定制的3D打印外壳。这款掌机基于配备RP2350处理器的最新型号RaspberryPiPico2打造。与常规LCD或OLED
    的头像 发表于 03-25 09:21 531次阅读
    让人欲罢不能树莓派<b class='flag-5'>贪吃蛇</b>掌机!

    种以图像为中心的3D感知模型BIP3D

    在具身智能系统中,3D感知算法是关键组件,它在侧帮助可以帮助智能体理解环境信息,在云端可以用来辅助生成3D场景和
    的头像 发表于 03-17 13:44 954次阅读
    <b class='flag-5'>一</b>种以图像为中心的<b class='flag-5'>3D</b>感知模型BIP<b class='flag-5'>3D</b>

    3D打印可以打印那种柔韧性好,能随意变形的模型吗?

    3D打印) 显然,TPU打印的模型在经历了多次扭曲后仍能保持结构完整性,虽然在过程中出现了些变形,也很快就能恢复原状。所以说,3D打印是能够用来制作像鞋垫、手机壳、护腕这样的产品,是
    发表于 03-13 11:41

    EPLAN 2.6 3D制作与使用

    电子发烧友网站提供《EPLAN 2.6 3D制作与使用.pdf》资料免费下载
    发表于 03-11 15:53 1次下载

    英伦科技裸眼3D便携屏有哪些特点?

    英伦科技裸眼3D便携屏采用了领先的光场裸眼3D技术,无需佩戴3D眼镜即可观看,给用户带来裸眼看3D视频的体验,为用户带来更加便捷和自由的视觉享受。
    的头像 发表于 02-06 14:20 795次阅读
    英伦科技裸眼<b class='flag-5'>3D</b>便携屏有哪些特点?

    SciChart 3D for WPF图表库

    SciChart 3D for WPF 是实时、高性能的 WPF 3D 图表库,专为金融、医疗和科学应用程序而设计。非常适合需要极致性能和丰富的交互式
    的头像 发表于 01-23 13:49 1243次阅读
    SciChart <b class='flag-5'>3D</b> for WPF图表库

    腾讯混元3D AI创作引擎正式发布

    近日,腾讯公司宣布其自主研发的混元3D AI创作引擎已正式上线。这创新性的创作工具将为用户带来前所未有的3D内容创作体验,标志着腾讯在AI技术领域的又重大突破。 混元
    的头像 发表于 01-23 10:33 972次阅读

    腾讯混元3D AI创作引擎正式上线

    近日,腾讯公司宣布其自主研发的混元3D AI创作引擎已正式上线。这创新性的创作工具,标志着腾讯在3D内容生成领域迈出了重要步。 混元3D
    的头像 发表于 01-22 10:26 946次阅读