2012-04-04 8 views
0

最初の応答は「wtf、arraylistsを使用しないでください!」と確信していますが、実際にはこれを何とかできるようにしようとしています。ArrayList内のArrayListへのアクセスの取得

これは基本的に3試合の試合のための「試合試合」です。一致リスト内の一致データにアクセスできません。下記を参照してください。

public void FindAndRemoveMatches() { 

    ArrayList foundMatches = LookForMatches(); 

    //just checking if we're getting the right amount for now 
    Debug.Log("We found " + foundMatches.Count + " 'Match 3's"); 

    foreach(Object el in foundMatches){ 
     // Debug.Log(el.ToString()); 
    } 

} 

ArrayList LookForMatches(){ 

    //List<int> matchList = new List<int>(); 
    ArrayList matchList = new ArrayList(); 

    // search for horizontal matches 
    // note that we're subtracting two rows here. 
    // We don't need to check the last two rows because we're matching 3. 
    for (int i = 0; i < BOARD_WIDTH; i++){ 
     for (int j = 0; j < BOARD_HEIGHT-2; j++){ 
      ArrayList match = GetMatchHoriz(i,j); 
      if (match.Count > 2) { 
       matchList.Add(match); 
       i += match.Count-1; 
      } 
     } 
    } 

    // search for vertical matches 
    for (int i = 0; i < BOARD_WIDTH; i++){ 
     for (int j = 0; j < BOARD_HEIGHT-2; j++){ 
      ArrayList match = GetMatchVert(i,j); 
      if (match.Count > 2) { 
       matchList.Add(match); 
       j += match.Count-1; 
      } 

     } 
    } 


    return matchList; 
} 


// look for horizontal matches starting at this point 
ArrayList GetMatchHoriz(int col,int row){ 
    ArrayList match = new ArrayList(); 
    match.Add(mBoard[col,row]); 

    for(int i = 1; (col+i)<8; i++) { 
     if (mBoard[col,row] == mBoard[col+i,row]) { 
      if(mBoard[col+i,row] > mPieces.GetNumPieceTypes()) match.Add(mBoard[col+i,row]); 
     } else { 
      return match; 
     } 
    } 
    return match; 
} 

// look for horizontal matches starting at this point 
ArrayList GetMatchVert(int col,int row){ 
    ArrayList match = new ArrayList(); 
    match.Add(mBoard[col,row]); 

    for(int i = 1; (row+i)<8; i++) { 
     if (mBoard[col,row] == mBoard[col,row+i]) { 
      if(mBoard[col,row+i] > mPieces.GetNumPieceTypes()) match.Add(mBoard[col,row+i]); 
     } else { 
      return match; 
     } 
    } 
    return match; 
} 

良いニュースは、正確に一致を見つけることです。デバッグログを使用して見つかった一致の数は、画面上で起こっていることと相関があります。わーい!しかし、私はそれをボード(mBoard [col、row])と比較してそれらのオブジェクトをゲームボードから取り除くために、そのデータにアクセスする必要があります。

findandremovematchesの 'foreach'ループはキャストに関するエラーを示します。これに関する助け?

ありがとうございました!

+0

正確なエラーメッセージが表示されます。 – mobiGeek

+0

あなたは最初の応答について間違っていました:) –

+3

wtf、arraylistsを使用しないでください! –

答えて

2

は、私は私が示唆したように、私は右のそれを推測した場合、正しく

foreach(Objecct obj in list) 
{ 
ArrayList inner = obj as ArrayList; 
if(inner != null) 
{ 
    //this is what you are looking for 
    //you can then iterate the inner array list and get the int[,] you saved 
} 
} 

しかし、 List<ArrayList>または List<List<int[,]>>を使用するあなたの質問を理解してほしいです。

2

ArrayListsを使用している場合は、それが容易だと思うので、そうしないでください。リストを使用する。 あなたが持っている、あなたは(私は疑う)リストを使用するための方法がないので、あなたは、あなたがこのようなものがありますのArrayListを使用している場合:

foreach(ArrayList innerList in foundMatches) 
{ 
    foreach(SomeClassThatYouAddToInnerLists item in innerlist) 
    { 
    //use item; 
    } 
} 

タイプがあることは何でもしてSomeClassThatYouAddToInnerListsを交換します内部のArrayListsに追加します。 (mBoardのタイプ)

リストを使用すると、リスト内のすべてのタイプのタイプが非常に明確になります。 List<List<int>>は使いやすいです。それは数字のリストです。

関連する問題