WPF: рендеринг холста в произвольных точках - PullRequest
0 голосов
/ 15 февраля 2009

Применительно к этой программируемой игре Я сейчас строю.

Когда игра запускается, я генерирую этих роботов в предположительно случайных точках на холсте, и на первый взгляд (добавление одного или двух ботов одновременно) это, похоже, работает должным образом.

... но, когда я добавил тонну ботов одновременно, они «случайно» появились на холсте:

альтернативный текст http://img22.imageshack.us/img22/6895/randombotpositionlf7.jpg

Якобы случайные точки не кажутся такими уж случайными ... они просто точки прямой !


Вот как я вычисляю очки:

SetStartingPoint(GetRandomPoint(ArenaWidth, ArenaHeight)); //the width and height are 550, 480 at the moment 

//which calls:

private Point GetRandomPoint(double maxWidth, double maxHeight)
{
        return new Point(new Random().Next(0, (int)(maxWidth-80)), new Random().Next(0, (int)maxHeight));
}

//and ultimately:

private void SetStartingPoint(Point p)
{
        Translate_Body.X = (double)p.X;
        Translate_Body.Y = (double)p.Y;
}

Что касается приведенного выше кода, Translate_Body относится к типу TranslateTransform робота (canvas), поэтому, присваивая его свойства X и Y, он изменит свою позицию на новые значения


Что мне здесь не хватает?


[ОБНОВЛЕНИЕ] Решение:

Проблема была в том, что вы все предположили, что числа не были засеяны должным образом из-за новых экземпляров.

Теперь я изменил код, чтобы использовать одну переменную Random и отсеять все точки из нее.

Но я до сих пор не могу понять, почему точки генерируются по, казалось бы, прямой линии координат. Кто-нибудь может объяснить это?


Ответы [ 4 ]

3 голосов
/ 15 февраля 2009

Я считаю, что проблема в том, что ваши случайные числа не отображаются правильно. Используйте один экземпляр Random, а не несколько, и вы увидите значительное улучшение.

Пользователь добавил «почему они были по прямой линии» - возможно, из-за прогрессии по умолчанию сгенерированных случайных чисел на основе начального числа. Википедия было бы хорошим началом - я не специалист по математике, поэтому не буду пытаться объяснить суть мира случайных чисел. :)

1 голос
/ 15 февраля 2009

Проблема в том, что вы продолжаете создавать новые объекты Random (), а затем берете самое первое случайное число. Но объект Random () инициализируется со временем, поэтому он всегда получает одно и то же значение.

Вместо этого сделайте это:

private System.Random R = new System.Random();
private Point GetRandomPoint(double maxWidth, double maxHeight)
{
    return new Point(R.Next(0, (int)(maxWidth - 80)), R.Next(0, (int)maxHeight));
}

Это создаст один объект Random (), а затем вызовет его несколько раз. Это также будет работать лучше, потому что вы не инициализируете слишком много объектов.

1 голос
/ 15 февраля 2009

По умолчанию класс Random использует текущее время в качестве начального числа. Поскольку время увеличивается только каждые несколько миллисекунд, большинство ваших «случайных» чисел будут фактически одинаковыми. Создайте свой Случайный объект только один раз, и последующие вызовы Next () должны дать вам больше случайных результатов.

0 голосов
/ 15 февраля 2009

Отсюда не видно ничего странного, кроме того, что вы должны использовать один экземпляр Random вместо того, чтобы все время создавать новое семя. Если ваша система достаточно быстра, вы можете получать одно и то же семя оба раза.

Если это не помогает, проверьте сеттеры и все, что влияет на настройку / рисование Translate_Body.X и Translate_Body.Y еще раз. Я предполагаю, что когда вы рисуете, вы рисуете в (X, X) или (Y, Y) вместо (X, Y) ...

...