Мой конечный автомат закончился преждевременно
Я смотрю на ту же проблему уже два часа. Я надеюсь, что некоторые свежие глаза могут помочь мне.
это глупая игра в Ханой, которую я делаю.
как только моя машина входит в 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
и выбрасывает тебя из своей петли.