0

eclipse と gridworld を使用して、オセロ ゲームで移動が合法かどうかを確認しようとしています。場所に対して最初に行うことは、それが有効かどうかを確認することですが、有効な場所を確認するには、null ではない必要があります。問題は、それが合法的な移動である要件の 1 つは、それが null/空/空いていることです。どうすればこれを回避できますか? エラーがどこにあると思われるかを指摘しました。(これが誰かを混乱させた場合は申し訳ありません。)

public boolean isLegal(Location loc1)
{
    boolean isLegal = false;
    String currentColor = currentPlayer.getColor();
    int row = loc1.getRow();
    int col = loc1.getCol();
    if(board.isValid(loc1))
    {
        if(board.get(loc1) == null)
        {
            for(Location tempLoc : board.getValidAdjacentLocations(loc1))
            {
                **if(!board.get(tempLoc).equals(currentColor))**
                {
                    if((row != tempLoc.getRow()) && (col == tempLoc.getCol()))
                    {
                        //count up column
                        if(tempLoc.getRow() < row)
                        {
                            for(int i = row; i > 1;)
                            {
                                Location tempLoc2 = new Location(i-2, col);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i--;
                                }
                                else
                                {
                                    i=-1;
                                    isLegal = true;
                                }   
                            }
                        }
                        //count down column
                        else
                        {
                            for(int i = row; i < 6;)
                            {
                                Location tempLoc2 = new Location(i+2, col);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i++;
                                }
                                else
                                {
                                    i=9;
                                    isLegal = true;
                                }
                            }
                        }
                    }
                    else if(col != tempLoc.getCol() && row == tempLoc.getRow())
                    {
                        //count right row
                        if(col > tempLoc.getCol())
                        {
                            for(int i = col; i > 1;)
                            {
                                Location tempLoc2 = new Location(row, i-2);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i--;
                                }
                                else
                                {
                                    i=-1;
                                    isLegal = true;
                                }   
                            }
                        }
                        //count left row
                        else
                        {
                            for(int i = col; i < 6;)
                            {
                                Location tempLoc2 = new Location(row, i+2);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i++;
                                }
                                else
                                {
                                    i=9;
                                    isLegal = true;
                                }
                            }
                        }
                    }
                    else
                    {   //count up/right diag
                        if(row-1 == tempLoc.getRow() && col+1 == tempLoc.getCol())
                        {
                            int j = col;
                            for(int i = row; i > 1;)
                            {
                                Location tempLoc2 = new Location(i-1, j+1);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i--;
                                    j++;
                                }
                                else
                                {
                                    i=-1;
                                    isLegal = true;
                                }   
                            }
                        }
                        //count down/left diag
                        else if(row+1 == tempLoc.getRow() && col-1 == tempLoc.getCol())
                        {
                            int i = row;
                            for(int j = col; j > 1;)
                            {
                                Location tempLoc2 = new Location(i+1, j-1);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i++;
                                    j--;
                                }
                                else
                                {
                                    i=9;
                                    isLegal = true;
                                }   
                            }
                        }
                        //count up/left diag
                        else if(row-1 == tempLoc.getRow() && col-1 == tempLoc.getCol())
                        {
                            int j = col;
                            for(int i = row; i > 1;)
                            {
                                Location tempLoc2 = new Location(i-1, j-1);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i--;
                                    j--;
                                }
                                else
                                {
                                    i=-1;
                                    isLegal = true;
                                }   
                            }
                        }
                        //count down/right diag
                        else
                        {
                            int j = col;
                            for(int i = row; i > 6;)
                            {
                                Location tempLoc2 = new Location(i+1, j+1);
                                if(!board.get(tempLoc2).equals(currentColor))
                                {
                                    i++;
                                    j++;
                                }
                                else
                                {
                                    i=-1;
                                    isLegal = true;
                                }   
                            }
                        }
                    }
                }
            }
        }
    }
    return isLegal;
}
4

3 に答える 3

3

解決策の 1 つは、デザインを変更して、場所がなくなるようにすることですnull

nullあなたは「空いている」または「空っぽ」と同一視しているようです。代わりに、最初にすべてのポジションを作成し (オセロ ボードにはそれほど多くありません)、boolean occupied = falseまたは同等のメンバー変数ですべてを初期化します。次に、次のようになります。

if ( !board.get(loc1).isOccupied() ) { /*stuff*/ }

null チェックの代わりに。

空の場所も場所であり、操作可能であるため、これはより優れたオブジェクト指向設計です。

于 2012-01-15T23:20:56.530 に答える
1

nullロジックの一部として使用しないでください。
nullそれは状態ではなく、状態がないことの象徴です。ロジックを除外する
必要があります。参照がである場合、モデルに関係なく、本当に厄介なことが確実に発生することがわかります。内部では、たとえばメソッドなどを作成できるため、 との比較を簡単に回避できます。nullnullLocationisEmpty()null

于 2012-01-15T23:29:47.873 に答える
0

の代わりにenumBLACKWHITEおよびを使用して、各位置にある色のトークンを保存します。クラスから同じものを返します。VACANTStringenumgetColor()Player

于 2012-01-16T00:48:08.037 に答える