如何让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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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