0

最初の応答は「wtf、arraylistsを使用しないでください!」になると確信していますが、私は実際にこれを可能な限り機能させようとしています。

これは基本的に、マッチ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」ループはキャストに関するエラーを出します。これで何か助けはありますか?

ありがとう!

4

2 に答える 2

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[,]>>私がそれを正しく推測した場合は使用してください。

于 2012-04-04T19:22:32.627 に答える
2

より簡単だと思うために ArrayLists を使用している場合は、使用しないでください。リストを使用します。必要があり、List を使用する方法がないために ArrayLists を使用している場合 (これは疑問です)、次のようなものになります。

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

SomeClassThatYouAddToInnerLists内側の ArrayLists に追加するタイプに置き換えます。(mBoard のタイプ。)

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

于 2012-04-04T19:22:46.713 に答える