Мой конечный автомат закончился преждевременно

Я смотрю на ту же проблему уже два часа. Я надеюсь, что некоторые свежие глаза могут помочь мне.

это глупая игра в Ханой, которую я делаю.

как только моя машина входит в PLAY, она автоматически переходит в OVER в следующем цикле, несмотря ни на что. Я хочу, чтобы он непрерывно повторял состояние PLAY, пока цель игры не будет достигнута. Что я тут не так сделал?

 //program stuff below
enum State {INTRO, BEGIN, PLAY, OVER, END}
static State gamestate;

public static void print(String s){

    System.out.println(s);
}


public static void main(String[] args){

    Scanner in = new Scanner(System.in);
    int rings = 0;
    gamestate = State.INTRO;
    Towers t = new Towers(1);
    do {
        switch(gamestate){

        case INTRO: System.out.print("Towers of Hanoi: A Children's Game\n by Julio Ollarvia\n\n\n");
                    gamestate = State.BEGIN;

        case BEGIN: System.out.print("How many rings would you risk?: ");

                    try{
                        rings = in.nextInt();
                        t = new Towers(rings);
                        print("\nturn out the lights and light a candle...");
                        gamestate = State.PLAY;

                    }catch(IllegalArgumentException e){
                        System.out.println("/n lets keep it between 0 and 64, bad boy.");

                    }



        case PLAY: print(t.toString());
                   print("this ring is free, grab 1,2, or 3... ");
                   try{
                    int movefrom = in.nextInt();
                    print("to complete your fun, choose 3,2, or 1...");
                    int moveto = in.nextInt();
                    t.move(movefrom,moveto);
                    if (t.peg2.getRingCount() == rings){
                        print("rings: "+rings);
                        print("peg: "+t.peg2.getRingCount());
                        gamestate = State.OVER;
                    }
                   }catch (IllegalArgumentException e){
                    print("Pegs are numbered between 1 and 3. Please choose just 1,2,3. And don't choose the same one.");

                   }
                   print(gamestate == State.OVER? "over": "still goin'");




        case OVER: print("Better luck next time.\n   wait... no. You won!  "+5*rings+" paraBitCoin has been deposited into your account.\n Please allow"+
                " 28 business days for transaction to complete.");

                gamestate = State.END;
        }

    }while(gamestate != State.END);
    in.close();
}

1 ответ

Решение

Проблема с вашим кодом в том, что у вас нет break заявления в ваших случаях.

В Java по умолчанию для операторов case в коммутаторе используется значение сбой. То есть, после того, как один случай будет выполнен, будет также запущен следующий:

    int a = 1;
    switch (a) {
        case 1:
            System.out.println("This gets printed");
        case 2:
            System.out.println("So does this");
    }

Если вы хотите, чтобы выполнялся только соответствующий случай, вам нужно явно выделить оператор switch в конце соответствующего случая:

    int b = 1;
    switch (b) {
        case 1:
            System.out.println("This gets printed");
            break;
        case 2:
            System.out.println("This doesn't");
    }

В вашем коде, независимо от того, что gamestate Вы находитесь, каждый случай после того, как будет выполнен соответствующий, кульминацией в случае OVER который устанавливает состояние END и выбрасывает тебя из своей петли.

Другие вопросы по тегам