让AI来告诉你什么叫幽灵堵车

2023-11-02

使用环境参考

CocosCreator v3.7.2
ChatGPT

正文

什么是幽灵堵车

堵车,大家都不陌生!

堵车时我就思维发散,用 CocosCreator 模拟下堵车应该挺好玩,网上总说高速上最前面如果有个龟速的车,后面能堵车堵个两三公里。查了一下这叫“幽灵堵车”。问下 ChatGPT:

然后我就新建了个项目,从官方商城搞个车过来:

让 AI 帮你打代码

接下来就是让 AI 来敲代码的过程,要想让 AI 明白你的意思,你得尽可能详细的描述当前的环境以及你想要的东西!!

接下来是我们长长的长长的长长的对话:

参数的修改

代码终于成功跑起来了,然后速度过快,最大最小速度缩小了 50 倍左右,效果如下:

给出代码

import { _decorator, Component, Node, Prefab, instantiate, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("Main")
export class Main extends Component {
  @property(Prefab)
  carPrefab: Prefab = null!;

  private carList: { speed: number; carNode: Node }[] = [];
  private time: number = 0;
  private interval: number = 3;

  start() {
    this.addCar();
  }

  update(dt: number) {
    this.time += dt;
    if (this.time > this.interval) {
      this.addCar();
      this.time = 0;
    }

    this.moveCars(dt);
  }

  private addCar() {
    const carNode = instantiate(this.carPrefab);
    carNode.parent = this.node;
    const car = { speed: 1, carNode: carNode };
    this.carList.push(car);
  }

  private moveCars(dt: number) {
    for (let i = 0; i < this.carList.length; i++) {
      const car = this.carList[i];
      const carPosition = car.carNode.position;

      // 如果不是第一辆车,则判断与前一辆车的距离是否大于安全距离
      if (i > 0) {
        const frontCar = this.carList[i - 1];
        const frontCarPosition = frontCar.carNode.position;
        const distance = frontCarPosition.x - carPosition.x;
        if (distance < 4) {
          car.speed = Math.max(0, frontCar.speed - 1);
        } else {
          car.speed = Math.min(1, frontCar.speed + 1);
        }
      }

      const newCarPosition = carPosition.add(new Vec3(car.speed * dt, 0, 0));
      car.carNode.setPosition(newCarPosition);
    }
  }
}

让 AI 赋予小车加速度

一拍大腿,加速度给忘了,我说走的这么立正!!

接下来通过对话让 ai 给代码加上加速度,然后再写一个摄像机控制逻辑:

效果如图:

当车辆数量到达 40 左右时,就已经出现两段长时间的拥堵了,幽灵堵车-可视化 okk!!

当车辆 200+ 时,车辆会以 10 个左右为一组,组团摇摆,这还是大家反应力 MAX 理想情况!

最终代码:

// 挂载 root 空节点
import { _decorator, Component, Node, Prefab, instantiate, Vec3 } from "cc";
const { ccclass, property } = _decorator;

@ccclass("Main")
export class Main extends Component {
  @property(Prefab)
  carPrefab: Prefab = null!;

  private carList: { speed: number; carNode: Node }[] = [];
  private time: number = 0;
  private interval: number = 3;

  start() {
    this.addCar();
  }

  update(dt: number) {
    this.time += dt;
    if (this.time > this.interval) {
      this.addCar();
      this.time = 0;
    }

    this.moveCars(dt);
  }

  private addCar() {
    const carNode = instantiate(this.carPrefab);
    carNode.parent = this.node;
    const car = { speed: 5, carNode: carNode };
    this.carList.push(car);
  }

  private moveCars(dt: number) {
    const acceleration = 0.35; // 加速度
    const drag = 0.05; // 阻力系数

    for (let i = 0; i < this.carList.length; i++) {
      const car = this.carList[i];
      const carPosition = car.carNode.position;

      // 如果不是第一辆车,则判断与前一辆车的距离是否大于安全距离
      if (i > 0) {
        const frontCar = this.carList[i - 1];
        const frontCarPosition = frontCar.carNode.position;
        const distance = frontCarPosition.x - carPosition.x;
        if (distance < 5) {
          car.speed = Math.max(0, car.speed - acceleration - drag);
        } else {
          car.speed = Math.min(10, car.speed + acceleration - drag);
        }
      } else {
        // 第一辆车匀速低速行驶
        car.speed = Math.min(2, car.speed + acceleration - drag);
      }

      const newCarPosition = carPosition.add(new Vec3(car.speed * dt, 0, 0));
      car.carNode.setPosition(newCarPosition);
    }
  }
}

// 挂载 camera 摄像机节点
import {
  _decorator,
  Component,
  Vec3,
  systemEvent,
  SystemEvent,
  EventKeyboard,
  KeyCode,
} from "cc";

const { ccclass, property } = _decorator;

@ccclass("Camera")
export class Camera extends Component {
  @property({ type: Number })
  moveSpeed: number = 5;

  private _isMovingLeft: boolean = false;
  private _isMovingRight: boolean = false;

  start() {
    systemEvent.on(SystemEvent.EventType.KEY_DOWN, this.onKeyDown, this);
    systemEvent.on(SystemEvent.EventType.KEY_UP, this.onKeyUp, this);
  }

  update(deltaTime: number) {
    let deltaMove = new Vec3();
    if (this._isMovingLeft) {
      deltaMove.x -= this.moveSpeed * deltaTime;
    }
    if (this._isMovingRight) {
      deltaMove.x += this.moveSpeed * deltaTime;
    }
    this.node.translate(deltaMove);
  }

  private onKeyDown(event: EventKeyboard) {
    switch (event.keyCode) {
      case KeyCode.KEY_A:
        this._isMovingLeft = true;
        break;
      case KeyCode.KEY_D:
        this._isMovingRight = true;
        break;
    }
  }

  private onKeyUp(event: EventKeyboard) {
    switch (event.keyCode) {
      case KeyCode.KEY_A:
        this._isMovingLeft = false;
        break;
      case KeyCode.KEY_D:
        this._isMovingRight = false;
        break;
    }
  }
}

AI 总结

最后,让 AI 做个总结吧!

Emmmmm… 就喜欢它时而牛逼时而智障的样子!!

我是 kuokuo,个人网站:www.kuokuo666.com

2023!Day Day Up!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

让AI来告诉你什么叫幽灵堵车 的相关文章

随机推荐

  • STM32实战项目:HAL_RCC_OscConfig中程序卡死问题解决办法

    STM32实战项目经验 HAL RCC OscConfig中程序卡死问题解决办法 工程环境 STM32CUBEIDE STM32F405VG 现象复现 项目中一个是IAP程序 另一个是APP程序 两个程序都是使用STM32CubeIDE生成
  • 搜索题目综合

    BFS 1 小X学游泳 题解 枚举每一个点作为连通块的起点 求得连通块大小 然后打擂台求最值即可 参考代码 include
  • element-ui和element-plus的自定义列表格用法

    前言 element plus 这个 UI 组件库 虽说基本和 vue2 element ui 差不多 但还是有点区别 以至于按emenent ui的写法来写会发现报错 下面我将讲解一下element ui和element plus的自定义
  • 一文彻底讲清Linux tty子系统架构及编程实例

    摘要 本文详细解读了linux系统下的tty子系统的深层次原理和架构 并参考了LDD3中的代码实例讲述了无硬件下实现一个简单的tty设备驱动模块的编写 对了解tty子系统及下部串口驱动模块的学习有较好的参考价值 1 tty设备简介 tty一
  • 抖音广告IOS/Android接入笔记:

    一 抖音广告接入 Android接入 注意 内容输出对接中已包含广告对接 建议使用广告4 6 0 7版本 如使用其他广告版本建议做好自测 2600及以上版本 需要使用如下Maven命令 火山引擎maven仓库地址 maven url htt
  • 红帽系统服务器格式化,Redhat Linux默认的文件系统是什么格式?

    满意答案 现在Redhat Linux默认的文件系统格式是ext4 可以通过如下多种方法查询文件系统类型 1 mount mount dev sda1 on type ext4 rw errors remount ro user xattr
  • 第五周总结

    已知字符串 this is a test of java 按要求执行以下操作 统计该字符串中字母s出现的次数 统计该字符串中子串 is 出现的次数 统计该字符串中单词 is 出现的次数 实现该字符串的倒序输出 public class da
  • MySQL之常见的CRUD面试题【下】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 Welcome Huihui s Code World 导读 一 MySQL常见的内置函数 1 字符串函数 2 数值函数
  • 测绘地理信息标准规范汇总下载

    经常 我们要下载一些相关的规范来指导作业 每次都在网上找 这里一次性全部整理好 欢迎大家来下载 打包下载 链接 百度网盘地址 分页下载 一 国家测绘局制定的测绘地理信息国家标准 专题地图信息分类与代码 GBT 18317 2001 被GBT
  • 4-C语言-冒泡排序以及数组名的使用

    问题 给数组进行从小到大的升序排序 思想 一般给冒泡排序 进行封装 写成一个函数 这就需要让数组传进去 而传数组 实际传的数组的首元素的地址 因此如果在冒泡内部 进行数组数据个数的计算 用sizeof a sizeof a 0 实际上为1
  • Braft--工作日记

    建议在阅读本笔记之前先观看此网址的动画Raft 分布式共识算法动画演示 首先bRaft是实现分布式共识的协议 一个节点可以处于三种状态 Follower跟随者状态 Candidate候选者状态 Leader领导者状态 而所有的节点都以跟随者
  • 计算机毕业设计SSM大型零售电商平台——购物车管理子系统【附源码数据库】

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • softmax函数的定义及求导

    本文中 x0 x1 xm x 0 x 1 x m 代表一个向量 也就是一个 m m行1列的矩阵 在监督式的深度学习中 输入通常是一个向量 用xx表示 输出 y y则可以分为多种情况 标量 yy表示输入 x x属于某一类别的概率 向量 此时输
  • AutoDev 1.1.3 登场,个性化 AI 辅助:私有化大模型、自主设计 prompt、定义独特规则...

    在过去的半个月里 我们为开源辅助编程工具 AutoDev 添加了更强大的自定义能力 现在你可以 使用自己部署的开源大模型 自己配置 Intellij IDEA 中的行为 自定义开发过程中的规范 当然了 如果您自身拥有开发能力的话 建议您自己
  • 绕过身份检测,破解Android SU

    http www 61ic com Mobile Android 201207 43661 html 由于Android底层是Linux内核 故了解了Linux的权限管理后就可以知道ROOT的原理 具体可以访问 Android系统权限和ro
  • js基础-语句

    语句 表达式在JavaScript中是短语 而语句 statement 就是JavaScript整句或命令 JavaScript语句是以分号结束 默认情况下 JavaScript解释器依照语句的编写顺序依次执行 1 表达式语句 1 复合语句
  • linux服务器部署docker版nginx(nginx容器化)

    为了服务器安全 nginx端口不直接暴漏在外 现在服务器使用了docker版nginx 记录下使用步骤 docker安装就不再叙述 之前有写 分为2种适用于服务器能上网和不能上网的情况 这里写的一个sh文件和dockerfile文件 用于d
  • 最强大的布局——约束布局(ConstraintLayout)的一些技巧

    一 使用viewBinding 1 想开启那个模块的viewBinding就进入对应模块的build gradle 2 进入app的build gradle 开启viewbinding viewBinding enabled true 3
  • 基于HAL库stm32f1的DS18B20温度传感器

    由于做比赛 所以写了温度传感器 记录一下 一 介绍 DS18B20是常用的数字温度传感器 其输出的是数字信号 具有体积小 硬件开销低 抗干扰能力强 精度高的特点 1 DS18B20数字温度传感器接线方便 封装成后可应用于多种场合 如管道式
  • 让AI来告诉你什么叫幽灵堵车

    使用环境参考 CocosCreator v3 7 2 ChatGPT 正文 什么是幽灵堵车 堵车 大家都不陌生 堵车时我就思维发散 用 CocosCreator 模拟下堵车应该挺好玩 网上总说高速上最前面如果有个龟速的车 后面能堵车堵个两三