1

私のプログラムが同じステートメントを繰り返し出力している理由を理解しようとしています。適切な値を入力すると、このメソッドを正常に機能させることができますが、無効な選択をキャッチするようにelseステートメントを設定しています。elseステートメントを実行すると、無限に出力され、whileループが開始されることはありません。私はそれを理解することはできません。メソッド全体を貼り付けますが、問題のある領域を太字にします。これが明確であることを願っています。

public static int[][] placeCheese(int [][] gameBoard, String Player1Name) 
{ 
    Scanner console = new Scanner(System.in);
    int turnTaker = 0;
    int validRow = 0;
    int validCol = 0;
    int RowIndex = -1;
    int ColIndex = -1;
    while(turnTaker == 0)
    {
        while(validRow == 0)
        {
            System.out.println( Player1Name + ", please place your cheese by choosing a row, or choose -1 to exit.");
            RowIndex = console.nextInt() -1; 
            if(RowIndex < gameBoard.length && RowIndex >=0)
            {
                validRow++;
            }
            else if(RowIndex == -2)
            {
                System.out.println("Thanks for playing, " + Player1Name + " has forfeited!");
                System.exit(0);
            }
        }
        while(validCol == 0){
            System.out.println( Player1Name + ", please place your cheese by choosing a column, or choose -1 to exit.");
            ColIndex = console.nextInt() -1; 
            if(ColIndex < gameBoard.length && ColIndex >=0)
            {
                validCol++;
            }
            else if(RowIndex == -2)
            {
                System.out.println("Thanks for playing, " + Player1Name + " has forfeited!");
                System.exit(0);
            }
        }
    if(gameBoard[RowIndex][ColIndex] == 0)
    {
        gameBoard[RowIndex][ColIndex] = 1;
        turnTaker++;
        numPieces1--;
    }
    else 
    {
        System.out.println("this space is already occupied, please choose again.");
    }
    return gameBoard;
}
4

3 に答える 3

2

これが初めて呼び出されると、有効な列番号と行番号を指定する必要があります。正方形が設定され、turnTakerインクリメントされ、ループが終了します。

2回目に呼び出されたときに、選択された行番号と列番号が同じである場合、配列内の選択されたスポットが0ではないため、インクリメントされませturnTakerん。さらに、0ではないため、それ以上の要求はありません。数字-それは、二度とプロンプトを表示することなく、メッセージを印刷する無限のループに入ります!validRowvalidCol

メッセージを出力する「else」句はvalidRowvalidColを0に再度設定することでこれを修正できます。他の誰かが指摘しているように、これらの変数turnTakerがintではなくブール値であると、はるかに優れています。

于 2011-09-16T21:36:55.477 に答える
1

あなたのコードは判読できませんが、私が推測しなければならないとしたら、elseステートメントでturnTakerを変更していなかったと思います。無限ループ!

于 2011-09-16T21:28:27.610 に答える
0

turnTakerの値は変更しないため、常にゼロのままになります。

于 2011-09-16T21:27:08.853 に答える