Случайное движение не так случайно
У меня проблема со случайным движением объекта на экране. Это вроде тикает взад и вперед, поэтому его движение вовсе не случайно. Это всего лишь небольшая консольная программа на C#.
namespace MorgSimulator
{
class Program
{
static void Main(string[] args)
{
Morg A = new MorgA();
A.MovingTime();
Console.ReadKey();
}
}
class Morg
{
public Morg()
{}
protected MoveBehavior moveBehavior;
public void MovingTime()
{
moveBehavior.move();
}
class MorgA : Morg
{
public MorgA()
{
moveBehavior = new Ooze();
}
interface MoveBehavior
{
void move();
}
class Ooze : MoveBehavior
{
public void move()
{
int row = 40, col = 25;
Console.CursorVisible = false;
Console.SetCursorPosition(col, row);
int direction = 0;
Random r = new Random();
for (int i = 0; i < 25; i++) // count of movement
{
Console.Write("<(._.)>");
System.Threading.Thread.Sleep(100);
Console.Clear();
direction = r.Next(5);
while (direction == 0)
direction = r.Next(5);
switch (direction)
{
case 1:
if (row + 1 >= 80)
row = 0;
Console.SetCursorPosition(col, row++);
break;
case 2:
if (row - 1 <= 0)
row = 79;
Console.SetCursorPosition(col, row--);
break;
case 3:
if (col + 1 >= 50)
col = 0;
Console.SetCursorPosition(col++, row);
break;
case 4:
if (col - 1 <= 0)
col = 49;
Console.SetCursorPosition(col--, row);
break;
}
}
}
}
По сути, мне нужно несколько более очевидных и более случайных движений в пределах границ, а не сдвиг назад и вперед в нижней части консоли. Может ли кто-нибудь указать мне правильное направление?
2 ответа
Случайность - это хорошо, не уверен, почему все так к этому относятся. Ваша проблема в том, что ваша начальная строка 40 - но ваша консоль изначально не открывается с 40 строками, когда она оконная. Таким образом, он рисует его в последней видимой в данный момент строке, вероятно, в строке 20. Вот как ведет себя консоль.
Если вы развернете окно консоли или установите начальный ряд на что-то более низкое, например 10, вы увидите, что он движется так, как вы ожидаете.
Попробуйте сделать Random свойством класса и инициализировать его один раз, а не снова и снова в методе move. Что-то вроде этого...
namespace MorgSimulator
{
class Program
{
static void Main(string[] args)
{
Morg A = new MorgA();
A.MovingTime();
Console.ReadKey();
}
}
class Morg
{
public Morg()
{}
protected MoveBehavior moveBehavior;
public void MovingTime()
{
moveBehavior.move();
}
}
class MorgA : Morg
{
public MorgA()
{
moveBehavior = new Ooze();
}
}
interface MoveBehavior
{
void move();
}
class Ooze : MoveBehavior
{
private readonly Random randomizer;
public Ooze()
{
this.randomizer = new Random();
}
public void move()
{
int row = 40, col = 25;
Console.CursorVisible = false;
Console.SetCursorPosition(col, row);
int direction = 0;
for (int i = 0; i < 25; i++) // count of movement
{
Console.Write("<(._.)>");
System.Threading.Thread.Sleep(100);
Console.Clear();
direction = this.randomizer.Next(5);
while (direction == 0)
direction = this.randomizer.Next(5);
switch (direction)
{
case 1:
if (row + 1 >= 80)
row = 0;
Console.SetCursorPosition(col, row++);
break;
case 2:
if (row - 1 <= 0)
row = 79;
Console.SetCursorPosition(col, row--);
break;
case 3:
if (col + 1 >= 50)
col = 0;
Console.SetCursorPosition(col++, row);
break;
case 4:
if (col - 1 <= 0)
col = 49;
Console.SetCursorPosition(col--, row);
break;
}
}
}
}
}