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

How do I make an AI move in a human-like way

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("Your size is " + playerSize, 20, 20);
}

我如何让编程的单元以类似人类的方式移动,现在,我坚持让它移动,我认为一种方法是使用 Perlin 噪音,但那可能继续强迫它总是一个方向,我可以使用随机,并将该值映射到 degrees/radians,然后使用 trigonometry 找到路径。尽管如果我不确定 trigonometry 解决方案是什么。

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

你的问题有点含糊,但听起来你想做的是给 AI 一个目标 I.E.它想去的某个地方,然后使用一个简单的探路程序让它找出最佳的移动方向

让某物像人一样移动是一项相当复杂的任务!我知道你只是想给一些运动一个自然的外观。 P5的噪音功能是实现这一点最简单的方法。

P5的噪声函数returns一个0到1之间的浮点数,如果直接作用于一个物体的位置,只能使它向正方向移动。尝试使用 map 函数将此输出标准化为 -1 和 1:

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

将此应用于某种转换,您的智能体将在正向和负向两个方向上移动。

因此,要在 x 轴上移动代理,您可以按照以下方式进行操作:

let amp = 20; // how much you want the agent to move
let offsetX = map(noise, 0, 1, -1, 1) * amp;
ellipse(200 + offsetX, 200, 10, 10);