2016-10-05 14 views
1

現在WindowsフォームとC#でレベル生成プログラムを作成しています。各レベルは、起動時にアレイにロードされる一連の「パターン」から作成されます。レベルを作成するとき、プログラムはこの配列からいくつかのパターンをランダムに選択し、ランダムに回転させてレベルを作成します。選択された各パターンはchosenPattern変数に格納され、元のパターンを変更せずに回転させることができます。C#のコンストラクタでも参照が保持されています

ここでは、パターンを選択して回転するためのコードです。

int rand = randomNumber(0, patterns.Count - 1);       
Level chosenPattern = new Level(patterns[rand]); 
chosenPattern = rotatePattern(chosenPattern, randomNumber(0, 3)); 

次に、コピーコンストラクタを含むLevelコンストラクタを示します。コピーコンストラクタを使用した場合でも、保存されたパターンを回転させたとき

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; 
     } 

答えて

3

public Level(Level level) 
{ 
    grid = level.grid.Select(x=>x.ToList()).ToList(); 
    solution = level.solution; 
    difficulty = level.difficulty; 
    generationTime = level.generationTime; 
} 
と交換0

単にリストが値

+0

ファンタスティック素晴らしい作品という、ありがとうございました! –

0

gridプロパティは、プロパティの残りの部分とは異なり、実際の値、したがってアドレスがコピーされValueTypeではないといないので、これがあるのではなく、参照がコピーされます渡します。

コピーコンストラクタは、同じ型インスタンスを受け入れる単なるコンストラクタです。プロパティーの1つに、つまりグリッドを割り当てると、このプロパティーがValueTypeでない場合、これらの値をコピーするメソッドを作成する必要があります。grid = level.gridのプレーン・アサインメントではカットされず、同じ結果が生成されます。

を次のようにgridの割り当てを変更してみてください:

grid = level.grid.Select(lst => lst.ToList()).ToList(); 
+0

実際には、構造体はプリミティブではなく、引き続き値渡しされます。一方、リストは参照型です – Martheen

+0

ありがとう、私はプリミティブではなくValueTypeに変更します。 –

関連する問題