如何让AI以类似人类的方式移动

var playerX;var playerY;var playerSize = 15;var playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10;var Newcelltimer = 0;var cell = []var cellEaten = 0;var celliseaten = false;var eaten = false;var zoom = 1;var n = 0;var Xgrid = 600;var Ygrid = 600;var cpu = [];function setup() {  frameRate(999)  createCanvas(600, 450);  playerX = Xgrid / 2  playerY = Ygrid / 2;}function draw() {  background(220);  push();  var Newzoom = 10 / playerSize  let newnewZoom = 1.3 * lerp(0.9, 10 / playerSize, 0.5)  Newzoom = lerp(zoom, Newzoom, 0.3)  translate(Xgrid / 2, Ygrid / 2 - 50);  scale(newnewZoom)  translate(-playerX, -playerY);  playerSpeed = (playerSize / Math.pow(playerSize, 1.44)) * 10  Newcelltimer++;  for (var i = 0; i < cell.length / 2; i++) {    let d = int(dist(cell[i * 2], cell[i * 2 + 1], playerX, playerY))    if (d <= playerSize / 2) {      playerSize += 5;      cell.splice(i * 2, 2)      celliseaten = true;    }  }  if (keyIsDown(UP_ARROW)) {    playerY -= playerSpeed;  }  if (keyIsDown(RIGHT_ARROW)) {    playerX += playerSpeed;  }  if (keyIsDown(DOWN_ARROW)) {    playerY += playerSpeed;  }  if (keyIsDown(LEFT_ARROW)) {    playerX -= playerSpeed;  }  if (playerX < playerSize / 2 - Xgrid) {    playerX = playerSize / 2 - Xgrid  }  if (playerY < playerSize / 2 - Ygrid) {    playerY = playerSize / 2 - Ygrid  }  if (playerY > 2 * Ygrid - (playerSize / 2)) {    playerY = 2 * Ygrid - (playerSize / 2)  }  if (playerX > 2 * Xgrid - (playerSize / 2)) {    playerX = 2 * Xgrid - (playerSize / 2)  }  if (Newcelltimer % 30 == 0) {    cell.push(ceil(random(0 - Xgrid, 2 * Xgrid)),      ceil(random(0 - Ygrid, 2 * Ygrid)))  }  if (Newcelltimer % 100 == 0) {    cpu.push(random(-Xgrid, 2 * Xgrid), random(-Ygrid, 2 * Ygrid), 20)  }  for (var j = 0; j < cpu.length / 3; j++) {    fill(0, 255, 0, 100);    circle(NewposX,NewposY, cpu[j * 3 + 2])  }  for (var k = 0; k < cell.length / 2; k++) {    fill(0, 255, 255, 100)    circle(cell[k * 2], cell[k * 2 + 1], 7)  }  stroke(0)  fill(255,255,0)  circle(playerX,playerY,playerSize);  if (playerSize >= 3 * Xgrid | playerSize >= 3 * Ygrid) {    if (Xgrid > Ygrid) {      playerSize = 3 * Ygrid;    } else {      playerSize = 3 * Xgrid;    }  }  noFill();  stroke(0, 0, 0)  rect(0 - Xgrid, 0 - Ygrid, 3 * Xgrid, 3 * Ygrid)  pop();  text("您的尺寸是 " + playerSize, 20, 20);}

我该如何让编程单元以类似人类的方式移动?目前,我卡在让它移动上,我想到的一种方法是使用Perlin噪声,但这可能会一直迫使它朝一个方向移动,我可以使用随机数,并将该值映射到度数/弧度,然后使用三角函数来找到路径。尽管我还不确定三角函数的解决方案是什么。

编辑:当我说“以更像人类的方式”时,我并不是在说任何复杂的事情,只是AI的移动方式不像:右,左,右,上,下,左


回答:

让某物体像人类一样移动是一项相当复杂的任务!我理解你只是希望赋予某种移动以自然的外观。P5的噪声函数是实现这一目标的最简单方法。

P5的噪声函数返回一个0到1之间的浮点数,如果直接应用于对象的位置,只能使其朝正方向移动。尝试使用map函数将此输出标准化为-1到1之间:

map(noise(x, y, z), 0, 1, -1, 1)

将此应用于某种变换,你的代理将在正负方向上移动。

因此,要在x轴上移动一个代理,你可以这样做:

let amp = 20; // 你希望代理移动的幅度let offsetX = map(noise, 0, 1, -1, 1) * amp;ellipse(200 + offsetX, 200, 10, 10);

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注