Я пытаюсь запрограммировать змею в консоли.После случайного количества шагов, которые делает змея, появляется новый GameObject (например, яблоко, которое заставляет змею расти, или гриб, который ускоряет змею).
Я создаю случайный gameObject (случайно (слева,top) координаты, а затем мне нужно проверить, появляется ли этот gameObject поверх snakeBodyPart или поверх другого gameObject. Если это так, я создаю новый gameObject и пробую то же самое снова. Только если он не сталкивается сдругой gameObject или Snake, он будет появляться.
snakeElemnts = список, содержащий все части тела змеи; gameObjects = список со всеми существующими объектами gameObjects;
If noCollisionAmount == количество snakeElements и GameObjects, не должно быть столкновений, и новый GameObject должен появиться.
К сожалению, в какой-то момент (в начале) змея просто перестает двигаться и ничего не происходит (без исключений или чего-либо).
Я не могу отладить, потому что у меня работает KeyboardWatcher, который проверяет, нажата ли клавиша.Поэтому, когда я нажимаю кнопку «Разрыв», я могу только исследовать «Клавиатурный наблюдатель».
Установка точки останова бесполезна, поскольку я никогда не прекращаю работу при возникновении проблемы.
if (this.randomStepNumber == 0)
{
int noCollision = 0; // this variable counts the amount of times there was no collision
GameObject validGameObject;
while (true)
{
validGameObject = this.snakeGameObjectFactory.Generate();
foreach (SnakeElements element in snakeElements)
{
if (validGameObject.XPosition != element.XPosition || validGameObject.YPosition != element.YPosition)
{
noCollision++;
}
else
{
break;
}
}
foreach (GameObject gameObject in gameObjects)
{
if (noCollision == snakeElements.Count) // if there was no collision of the new gameobject with an element of the snake, the gameobjects will get checked
{
if (validGameObject.XPosition != gameObject.XPosition || validGameObject.YPosition != gameObject.YPosition)
{
noCollision++;
}
else
{
break;
}
}
else
{
break;
}
}
if (noCollision == snakeElements.Count + gameObjects.Count) // if there was no collision at all, the check is ended
{
break;
}
else
{
noCollision = 0;
}
}
this.gameObjects.Add(validGameObject);
this.randomStepNumber = this.random.Next(10, 30);
}