0

私は Java を初めて使用し、単純なタスク (TicTacToe コンソール ゲーム) に取り組んでいます。while今日、doループ後に main メソッドを続行できないという問題に直面しました。プロジェクトには と の 2 つのクラスがMainありFieldます。Field は、すべてのゲーム フィールドの更新に応答します。メイン メソッドの do while ループでメソッドを呼び出しFieldていますが、結果がループにある場合は終了し、メイン メソッドを続行する必要があります (ユーザーがもう一度再生するかどうかを確認する必要があります)。while残念ながら、プログラムは doループ後に停止します。

これが私のコードです:

import java.io.IOException;
import java.util.Scanner;

public class Main {
    private static char playerSym, compSym;
    private static int Sym;
    public static int playerChoice;
    public static boolean result;

    public static void main(String args[]) throws IOException {
        Field field = new Field();

        // start of the game
        System.out.println("Let`s play");
        System.out.println("Choose your symbol please");
        System.out.println("0='O', 1='X'");
        Scanner sc = new Scanner(System.in);
        Sym = sc.nextInt();

        while (Sym != 0 & Sym != 1) {
            System.out
                    .println("The symbol you entered is incorrect, please repeat");
            System.out.println("0='O', 1='X'");
            Sym = sc.nextInt();
        }

        // setting player character
        if (Sym == 1) {
            playerSym = 'X';
            compSym = 'O';
        } else if (Sym == 0) {
            playerSym = 'O';
            compSym = 'Х';
        }

        System.out.println("There is a game field");
        System.out.println("Please choose the cell number you`d like to fill with  " + playerSym);
        field.firstShowFields();

        do {
            playerChoice = (Integer) sc.nextInt();
            field.updateFields(playerChoice, playerSym);
            field.showFields(field.fields);
        } while (result==false);

        System.out.println("Want to play once more? Y-Yes, N-No");
        char answer = (char) System.in.read();

        switch (answer) {
            case 'Y':
                System.out.println("Restarting the game");
                break;
            case 'N':
                System.out.println("Thank you! Bye-Bye!");
                break;
            default:
                break;  
        }   
    }
}

public class Field {
    public static final int FIELD_SIZE = 3;
    // private static final char DEFAULT_CHAR=' ';

    public char[][] fields;
    public boolean result = true;
    public char playerSym;

    public Field() {
        fields = new char[FIELD_SIZE][FIELD_SIZE];
    }

    public void firstShowFields() {
        int cellValue = 1;
        for (int i = 0; i < FIELD_SIZE; i++) {
            for (int j = 0; j < FIELD_SIZE; j++) {
                System.out.print("[" + cellValue + "]");
                cellValue++;
            }
            System.out.println();
        }
    }

    public char[][] updateFields(int choice, char sym) {
        playerSym = sym;
        int cellValue = 1;
        int playerChoice = choice;

        do {
            for (int i = 0; i < FIELD_SIZE; i++) {
                for (int j = 0; j < FIELD_SIZE; j++) {

                    if (playerChoice == cellValue) {
                        fields[i][j] = (char) playerSym;
                    } else if (fields[i][j] == (char) playerSym) {
                        fields[i][j] = (char) playerSym;
                    } else {
                        fields[i][j] = (char) ('0' + cellValue);
                    }

                    cellValue++;
                }

            }

            this.checkWin(fields, playerSym);
            return fields;

        } while (this.checkWin(fields, playerSym) == false);
    }

    public void showFields(char[][] fields) {
        this.fields = fields;
        for (int i = 0; i < FIELD_SIZE; i++) {
            for (int j = 0; j < FIELD_SIZE; j++) {
                System.out.print("[" + fields[i][j] + "]");
            }
            System.out.println();
        }
    }

    public boolean checkWin(char[][] field, char playerSym) {
        char[][] checkField = field;
        this.playerSym = playerSym;

        // checkline
        if (((checkField[0][0] == checkField[0][1]) && (checkField[0][1] == checkField[0][2]))
                || ((checkField[1][0] == checkField[1][1]) && (checkField[1][1] == checkField[1][2]))
                || ((checkField[2][0] == checkField[2][1]) && (checkField[2][1] == checkField[2][2]))) {

            System.out.println("The game is over. The winner is player " + playerSym);
            return  true;
        } 
        // checkraw
        else if (((checkField[0][0] == checkField[1][0]) && (checkField[1][0] == checkField[2][0]))
                || ((checkField[0][1] == checkField[1][1]) && (checkField[1][1] == checkField[2][1]))
                || ((checkField[0][2] == checkField[1][2]) && (checkField[1][2] == checkField[2][2]))) {
            System.out.println("The game is over. The winner is player " + playerSym);
            return result = true;

        } // checkdiagonal
        else if (((checkField[0][0] == checkField[1][1]) && (checkField[1][1] == checkField[2][2]))
                || ((checkField[0][2] == checkField[1][1]) && (checkField[1][1] == checkField[2][0]))) {
            System.out.println("The game is over. The winner is player " + playerSym);
            return result = true;
        }
            return false;
    }
}
4

2 に答える 2

2

ここに無限ループがあります:

do {
        playerChoice = (Integer) sc.nextInt();
        field.updateFields(playerChoice, playerSym);
        field.showFields(field.fields);
    } while (result==false);

resultは更新されないためwhile (result==false);、最初に true であった限り失敗することはありません。以下のように変更してみてください。

do {
        playerChoice = (Integer) sc.nextInt();
        field.updateFields(playerChoice, playerSym);
        field.showFields(field.fields);
        result = field.checkWin(field.fields, playerSym);
    } while (result==false);

また、インスタンスに既にアタッチされているフィールドをインスタンス メソッドに渡すことはお勧めできません。パラメータchar[][] fieldを checkWin メソッドから削除して、単純にインスタンス変数で動作させることができますfields。しかし、それはループの問題の原因ではありません。

于 2013-08-01T20:36:14.853 に答える
0

user506 が指摘しているように、ループを通過しない唯一の理由は、ブール値resultが に設定されていないためtrueです。

main メソッドを分離するために 2 つのクラスがあるのはなぜですか?

于 2013-08-01T20:43:29.163 に答える