Я пытаюсь переместить объект в матрице (массив с [x, y]) с использованием алгоритма рисования линии, чтобы помочь вам понять, что я имею в виду. пытаюсь сделать объект двигаться так:Попытка перемещения объекта в матрице с использованием алгоритма рисования линии
Но вместо того, чтобы идти „в линию“, это выглядит следующим образом:
я открыл еще один вопрос об этой проблеме здесь , и ты мне сказал мне e алгоритм рисования линии, который я сделал, но я все еще не могу заставить его двигаться в этом порядке.
Немного о коде (я даю вам «фон», поэтому вы не будете путать): переменная Location
содержит местоположение на матрице, оно имеет x и y, к которым можно получить доступ, например это:
Location loc = new Location(x,y);//Declaring a new location
int row = loc.Row;//Gets the x value (Row)
int col = loc.Col;//Gets the y value (Column)
Direction
переменная содержит направление, есть 5 направлений:
Direction.NORTH;
Direction.SOUTH;
Direction.EAST;
Direction.WEST;
Direction.NOTHING; //This direction means to stay at the same place, or not move
Я думаю, это очевидно, что каждый из них означает.
Команда game.Destination(myPirate, direction);
вычисляет, где объект заканчивается на следующем повороте (возвращает местоположение).
Теперь вот код, который я получил:
public static Direction NextDirection(Game game,Pirate myPirate,Location EndLocation)
{
List<Direction> westEast = new List<Direction>() { Direction.EAST, Direction.WEST };
List<Direction> northSouth = new List<Direction>() { Direction.NORTH, Direction.SOUTH };
int startX = myPirate.Loc.Row;
int startY = myPirate.Loc.Col;
int endX = EndLocation.Row;
int endY = EndLocation.Col;
if (startX == endX && startY == endY) return Direction.NOTHING; //If its alredy on spot return the location of the pirate;
int dx = endX - startX;
int dy = endY - startY;
if (dx == 0) //The X of the end is the same as the x of the start, need to move only on the y axis;
{
return MyBot.GetBestDirection(game, myPirate, EndLocation);
}
if (dy==0) //The Y of the end is the same as the y of the start, need to move only on the x axis;
{
return MyBot.GetBestDirection(game, myPirate, EndLocation);
}
int slope = dy/dx;
Location destination;
double distance = MyBot.Distance(myPirate.Loc, EndLocation);
if (slope > 1 || slope < -1)
{
double distance2;
foreach (Direction dir in northSouth) //In here the algoritem decides whats the best direction (north or south);
{
destination = game.Destination(myPirate, dir);
distance2 = MyBot.Distance(destination, EndLocation);
if (distance2 < distance) return dir;
}
game.Debug("Couldnt find a good direction, going by the default dirction algorithem.");
return MyBot.GetBestDirection(game, myPirate, EndLocation);
}
else
{
double distance2;
foreach (Direction dir in westEast)//In here the algoritem decides whats the best direction (west or east);
{
destination = game.Destination(myPirate, dir);
distance2 = MyBot.Distance(destination, EndLocation);
if (distance2 < distance) return dir;
}
game.Debug("Couldnt find a good direction, going by the default dirction algorithem.");
return MyBot.GetBestDirection(game, myPirate, EndLocation);
}
}
На некоторых участках в коде выше я также с использованием деталей из MyBot
класса, вот эти части:
public static Direction GetBestDirection(Game game, Pirate myPirate, Location loc)//ADD: If the destination is not passable get another direction;
{
double distance = Distance(myPirate.Loc, loc);
List<Direction> allDirections = new List<Direction>() { Direction.NORTH, Direction.SOUTH, Direction.WEST, Direction.EAST, Direction.NOTHING };
Location destination;
foreach (Direction dir in allDirections)
{
destination = game.Destination(myPirate, dir);
double distance2 = Distance(destination, loc);
if (distance2 < distance && game.IsPassable(destination)) return dir;
}
return Direction.NOTHING;
}
«Объект», о котором я вам говорил, называется кодом myPirate
, и он может перемещаться только в одном направлении за каждый ход. код запускается за каждый ход до тех пор, пока он не достигнет цели.
Как я могу заставить эту программу работать правильно? Что не так с моим кодом?
Вы программируете какой-то робот? Затем вам нужно сначала построить путь, а затем попытаться следовать ему. Например. вы можете определить строку как 'y = kx + b' или как' x + = dx' и 'y + = dy' (до вас), затем на каждой итерации построения пути (поиск координат следующей ячейки, ток, увеличиваясь короче, чтобы двигаться: 'x' или' y'), где вы должны идти (N, S, E, W) и делать шаг. – Sinatr
'int slope = dy/dx;' и '(slope> 1 || slope <-1)' подразумевает, что наклон должен быть 2 или более, чтобы идти на север или на юг. Это градиент более 66%, в противном случае он будет горизонтальным. Даже если вы только что разработали касательный квадрант и следовали за тем, что вы получите более постепенную линию. Чтобы получить нужную строку, вам нужно место начала. Затем следующий квадрат, из которого когда-либо проходит линия с исходного места –
@Sinatr, это не работает, код запускается 1 раз за ход, для exapmle: поверните 1: мой бот играет, затем код останавливается и бот 2, код запускается и останавливается. вся переменная вырывается из памяти, а в свою очередь, она начинается, поэтому я не думаю, что ваш метод будет работать. –