我正在参与一个游戏,需要编程AI并与其他程序员竞争。这个游戏是一场比赛,你的飞船必须按顺序通过一些检查点。
你可以使用以下输入参数来编写算法:
nextCheckpoint (x,y) -> nX,nYlastCheckpoint (x,y) -> lnX,lnYcurrentposition (x,y) -> x,y
代码的输出是方向和推力。
int pod::errorX(){ int R[2]; int X1; float b; int DeltaX; //检查点之间的线的向量 R[0] = nX-lnX; R[1] = nY-lnY; //计算飞船与线在X轴上的距离 b =(R[0]*(lnX-x) + R[1]*(lnY-y))/((-pow(R[0],2))-(pow(R[1],2))); X1 = lnY + b*R[0]; DeltaX = x-X1; cerr<<"Dx: "<<DeltaX<<endl; return DeltaX;}
我也有对应的pod::errorY()
最后:
DirectionX = nX-errorX();DirectionY = nY-errorY();
这是我正在做的事情的一些图片:
我想这样做是因为大多数时候惯性会使我的飞船绕着检查点旋转,这会消耗很多时间并使我输掉比赛。
好吧,现在让我们面对这个问题,有时它能工作,有时却完全不接近。
当输入较小时,比如:
nX= 2;nY= 2;lnX=0;lnY=0;x=0;y=0;
输出是:
directionX = 3directionY = 1
但当它们较大时:
nX= 6553;nY= 7817;lnX=13044;lnY=1908;x=13921;y=3530;
输出是:
DirectionX=6940;DirectionY=1907;
我不知道发生了什么。可能是由于b是小数吗?有没有我没看到的错误?
也许这段代码更适合测试,因为你不需要游戏:
#include <iostream>#include <string>#include <cmath>using namespace std;int main(){ int lnX = 13044; int lnY = 7817; int nX = 13044; int nY = 1908; int x = 13921; int y = 3530; int R[2]={}; //检查点之间的线的向量 R[0] = nX-lnX; R[1] = nY-lnY; //纯代数,用于计算X的偏移 int X1,DeltaX; long double b; b =(R[0]*(lnX-x) + R[1]*(lnY-y))/((-pow(R[0],2))-(pow(R[1],2))); X1 = lnY + b*R[0]; DeltaX = x-X1; //Y的偏移 int Y1,DeltaY; Y1 = lnY+b*R[1]; DeltaY = y-Y1; //方向 int DirectionX; int DirectionY; DirectionX = nX-DeltaX; DirectionY = nY-DeltaY; cout<<X1<<" "<<Y1<<endl; cout<<DeltaX<<" "<<DeltaY<<endl; cout<<b<<" "<<DirectionX<< " "<<DirectionY<<endl;
回答:
这行代码对吗?X1 = lnY + b*R[0];
还是应该这样写X1 = lnX + b*R[0];