1

これがアルゴリズムです(機能していません)エラーがどこにあるか教えてください

ありがとう

private void checkSouth(Location point, int player) {
        //Loop through everything south
        boolean isthereAnOppositePlayer=false;

        int oppositePlayer=0;
        //Set opposite player
        if (player==1) {
            oppositePlayer=2;
        }else{
            oppositePlayer=1;
        }

        for (int i = point.getVertical(); i < 8; i++) {

            //Create a location point with the current location being compared
            MyLocation locationBeingChecked= new MyLocation();
            locationBeingChecked.setHorizontal(point.getHorizontal());
            locationBeingChecked.setVertical(i);

            int value = board[locationBeingChecked.getVertical()][locationBeingChecked.getHorizontal()];

            //If the first checked is the opposite player
            if (value==oppositePlayer) {
                //Then potential to evaluate more
                isthereAnOppositePlayer=true;
            }
            //If it isn't an opposite player, then break
            if(!isthereAnOppositePlayer && value!=0){
                break;
            }

            //If another of the player's piece found or 0, then end
            if (isthereAnOppositePlayer && value==player || isthereAnOppositePlayer && value==0) {
                break;
                //end   
            }

            //Add to number of players to flip
            if(isthereAnOppositePlayer && value==oppositePlayer && value!=0){
                //add to array
                addToPiecesToTurn(locationBeingChecked);
            }
        }
    }
4

3 に答える 3

1

他のプレイヤーに回転して戻った場所は、最初の移動中に回転した場所とまったく同じように見えます。addToPiecesToTurnによって移入されている配列は、おそらく各移動の間にクリアされていないので、以前のすべての場所はまだそこにあると思います。

ターンするピースを保存している場合は、このメソッドをArrayList使用して、clear()各ターンの間にコレクションの内容を消去できます。


もう1つの考えられる問題は、相手のプレーヤーをチェックしていて、すぐにデータが入力され始めることaddToPiecesToTurnです。ただし、その方向のピースは、現在のプレーヤーのピースを含む2番目の場所に「サンドイッチ」されていない限り、回転するのに必ずしも有効ではありません。あなたのコードがそのケースを適切にチェックしているとは思いません。その場合は、の配列をクリアするなど、どういうわけかそれらのピースを他のプレーヤーにフリップすることをスキップする必要がありますpiecesToTurn


編集:すべての方向を個別に実装している現在のソリューションを見ると、重複したコードがたくさんあることになります。特定の方向に沿って歩くことの意味を考えると、x/y値を「ステップ」量だけ調整することと考えることができます。ステップ量は-1、後方、0移動なし、または1前方の場合があります。次に、ロジックを複製せずにすべての方向を処理する単一のメソッドを作成できます。

private void checkDirection(Location point, int player, int yStep, int xStep) {
    int x = point.getHorizontal() + xStep;
    int y = point.getVertical() + yStep;

    MyLocation locationBeingChecked = new MyLocation();
    locationBeingChecked.setHorizontal(x);
    locationBeingChecked.setVertical(y);

    while (isValid(locationBeingChecked)) {
        // do the logic here

        x += xStep;
        y += yStep;

        locationBeingChecked = new MyLocation();
        locationBeingChecked.setHorizontal(x);
        locationBeingChecked.setVertical(y);
    }
}

場所が有効であることを確認するために実装する必要がありisValidます。つまり、ボード内です。次に、各方向に対してこのメ​​ソッドを呼び出すことができます。

// north
checkDirection(curPoint, curPlayer, -1, 0);
// north-east
checkDirection(curPoint, curPlayer, -1, 1);
// east
checkDirection(curPoint, curPlayer, 0, 1);
// etc
于 2013-03-04T21:52:08.347 に答える
0

これは、いくつかのユニットテストに適した種類の問題です。ボードを簡単にセットアップし、動きを再生し、答えを検証することができます。テスト結果は、期待と現実がどこで分岐するかについての十分な洞察を提供します。

于 2013-03-04T22:03:37.603 に答える
0

なぜ2D配列を使用しなかったのですか?

各セルには列挙型が含まれます:EMPTY、PLAYER_1、PLAYER_2。

次に、セルを調べるために、各方向にループを使用するだけです。

たとえば、セルをクリックすると、右側をチェックすると次のようになります。

for(int x=pressedLocation.x+1;x<cells[pressedLocation.y].length;++x)
  {
  Cell cell=cells[pressedLocation.y][x];
  if(cell==EMPTY||cell==currentPlayerCell)
    break;
  cells[pressedLocation.y][x]=currentPlayerCell;
  }

上から下へのチェックは次のようになります。

for(int y=pressedLocation.y+1;y<cells.length;++y)
  {
  Cell cell=cells[y][pressedLocation.x];
  if(cell==EMPTY||cell==currentPlayerCell)
    break;
  cells[y][pressedLocation.x]=currentPlayerCell;
  }
于 2013-03-04T22:06:47.007 に答える