我目前正在Windows Forms和C#中编写Level Generation程序。每个级别都是由一系列“模式”创建的。在启动时加载到数组中。创建关卡时,程序会从该数组中随机选择多个模式,随机旋转它们并创建关卡。选择的每个模式都存储在chosenPattern
变量中,以便可以在不修改原始模式的情况下旋转它。
这是我用来选择模式并旋转它的代码。
int rand = randomNumber(0, patterns.Count - 1);
Level chosenPattern = new Level(patterns[rand]);
chosenPattern = rotatePattern(chosenPattern, randomNumber(0, 3));
这里是Level构造函数,包括Copy Constructor。
public class Level
{
public List<List<char>> grid;
public string solution;
public int difficulty;
public TimeSpan generationTime;
public Level()
{
grid = new List<List<char>>();
solution = "";
difficulty = 0;
generationTime = TimeSpan.MinValue;
}
public Level(Level level)
{
grid = level.grid;
solution = level.solution;
difficulty = level.difficulty;
generationTime = level.generationTime;
}
}
然而,即使使用复制构造函数,存储在数组中的模式在旋转存储的模式时仍然会旋转,我不确定为什么(注意:我是一个相当新手的C#程序员)
和RotatePattern函数:
public Level rotatePattern(Level pattern, int rotation)
{
Level tempPattern = pattern;
switch (rotation)
{
case 1:
//Rotate 90 - Reverse Each Row
for(int i = 0; i < tempPattern.grid.Count; i++)
{
tempPattern.grid[i].Reverse();
}
break;
case 2:
//Rotate 180 - Reverse Each Row, then Each Column
for (int i = 0; i < tempPattern.grid.Count; i++)
{
tempPattern.grid[i].Reverse();
}
tempPattern.grid.Reverse();
break;
case 3:
//Rotate 270 - Reverse Each Column
tempPattern.grid.Reverse();
break;
}
return tempPattern;
}
答案 0 :(得分:3)
在复制构造函数中,将其替换为
public Level(Level level)
{
grid = level.grid.Select(x=>x.ToList()).ToList();
solution = level.solution;
difficulty = level.difficulty;
generationTime = level.generationTime;
}
简单地传递List将复制引用而不是值
答案 1 :(得分:0)
这是因为grid
属性与其他属性不同,不是ValueType,因此复制地址而不是实际值。
复制构造函数只是一个接受相同类型实例的构造函数。如果您为其中一个属性即网格分配,那么如果此属性不是ValueType,那么您应该创建一个方法来复制这些值,使用grid = level.grid
进行简单分配,只需赢得&#39;削减它,并产生相同的结果。
尝试将grid
作业更改为以下内容:
grid = level.grid.Select(lst => lst.ToList()).ToList();