我一直试图弄清楚为什么我的ascii人不会独立移动为一个人,因为他们一直在作为一个群体行动。 我的目标是让一群人每帧随机向四个方向移动。每个人都是一个拥有它自己的数据集的类,比如它们的X和Y位置。以下是代码的一部分:
顺便说一下代码的作用是,它在10x2的矩形中产生了10个人。这就是出现问题的时候。
public class Soldier
{
public int Health;
public string Symbol;
public int x, y;
public int ID;
public void SetHealth(int hp)
{
Health = hp;
}
public void SetSymbol(string sym)
{
Symbol = sym;
}
public void SetID(int id)
{
ID = id;
}
public void RandomStep()
{
Random rnd = new Random();
int randNum = rnd.Next(1, 5);
if (randNum == 1)
{
x += 1;
}
else if (randNum == 2)
{
x -= 1;
}
else if (randNum == 3)
{
y += 1;
}
else if (randNum == 4)
{
y -= 1;
}
}
}
else if (battleMode == true)
{
bool battleLoad = true;
int team1Size = 0;
int team1Max = 10;
int rowXstart = 40;
int rowYstart = 10;
int rowX = rowXstart;
int rowXmax = rowXstart + 5;
int rowY = rowYstart;
int rowYmax = 5;
int pickIDsol = 1;
int IDsoldier = 1;
int battleID = 1;
List<Soldier> soldierunlist = new List<Soldier>();
List<Soldier> soldierlist = new List<Soldier>();
for (; ; )
{
if (battleLoad == true)
{
for (; ; )
{
if (team1Size < team1Max)
{
soldierunlist.Add(new Soldier());
Soldier unpickSoldier = soldierunlist.First(x => x.ID == 0);
unpickSoldier.ID = IDsoldier;
IDsoldier += 1;
team1Size += 1;
Console.WriteLine("Loading1");
}
else
{
break;
}
}
foreach (Soldier soldier in soldierunlist) {
soldier.Symbol = "☻";
Console.WriteLine("Loading Graphics");
}
for (; ; )
{
if (soldierunlist.Count != 0)
{
if (rowX < rowXmax)
{
Soldier pickSoldier = soldierunlist.First(x => x.ID == pickIDsol);
pickSoldier.x = rowX;
pickSoldier.y = rowY;
rowX += 1;
pickIDsol += 1;
soldierunlist.Remove(pickSoldier);
soldierlist.Add(pickSoldier);
Console.WriteLine("Creating Position values for soldiers");
}
else if (rowX >= rowXmax)
{
rowX = rowXstart;
rowY += 1;
}
}
else
{
battleLoad = false;
battleMode = true;
break;
}
}
}
else
{
for (; ; ){
Console.Clear();
int RefreshRate = 100; // 1000 = 1 second
/// [ START ]
//foreach (Soldier soldier in soldierlist)
//{
// WriteAt(soldier.Symbol, soldier.x, soldier.y);
// soldier.RandomStep();
//}
for (; ; )
{
if (battleID != team1Max)
{
Soldier aSoldier = soldierlist.First(x => x.ID == battleID);
aSoldier.RandomStep();
battleID += 1;
}
else
{
break;
}
}
foreach (Soldier soldier in soldierlist)
{
WriteAt(soldier.Symbol, soldier.x, soldier.y);
}
battleID = 1;
/// [ END ]
System.Threading.Thread.Sleep(RefreshRate); // Waits for (number) of time
}
}
}
}
答案 0 :(得分:2)
Random rnd = new Random();
每当你想要一个随机数时,就会创建一个新的随机数。由于所有的呼叫都是即时的,你每次都会得到相同的种子,所以所有的动作都朝着同一个方向发展。
来自文档(https://msdn.microsoft.com/en-us/library/system.random(v=vs.110).aspx):
但是,由于时钟具有有限的分辨率,因此使用无参数构造函数以紧密连续的方式创建不同的随机对象会创建随机数生成器,从而生成相同的随机数序列。 ...在大多数Windows系统上,彼此在15毫秒内创建的随机对象可能具有相同的种子值。 ...要避免此问题,请创建一个Random对象而不是多个对象。
因此,您需要创建一个随机对象。也许在加载游戏时。然后使用该单个随机创建进入的方向,然后将不同。