2016-10-23 2 views
0

Я делаю Othello игру в java и имею проблему переключить другой игрок когда enter нажал. Я объявила глобальную переменную public static int counter;, которая будет увеличиваться при нажатии.Как работает глобальная переменная java?

Scanner s = new Scanner(System.in); 
move = s.nextLine(); 
// enter to forfeit 
if(move.equals("")){ 
    if(counter%2 == 0){ 
     whiteEnterForfeit = turn(board, "White", "W", "B"); 
     printBoard(board); 
     counter++; 
     } 
    if(counter%2 == 1) { 
     blackEnterForfeit = turn(board, "Black", "B", "W"); 
     printBoard(board); 
     counter++; 
     } 
} 

/* If coordinate is typed like 2,4 I will be recorded at right spot on the board. 

else if(!move.equals("")){ 
    StringTokenizer st = new StringTokenizer(move, ","); 
    rowMove = Integer.parseInt(st.nextToken()); 
    colMove = Integer.parseInt(st.nextToken()); 
*/ 

Поэтому, как только я нажимаю войти дважды в строке, предполагается распечатать Black-White-Black. Тем не менее, мой выдает Black-White-White...... То, что я думаю о глобальной переменной static, заключается в том, что любые классы или методы могут получить доступ и изменить ее значение.

Я также увеличиваю counter, когда каждый игрок успешно играет. Поскольку код более 300 строк, вы можете найти его на github (https://github.com/misonam03/TIL/blob/master/Java/Othello.java). Спасибо заранее!

+0

пожалуйста ВЫВЕШУ SSCCE http://sscce.org ** здесь **, так что мы можем проанализировать вашу проблему. –

+0

Что вы нашли, когда вы пробовали отладки? – shmosel

+0

@shmosel Я использую eclipse и не вижу никакого «красного» сигнала. У него все еще есть ошибка? – jaykodeveloper

ответ

2

Вы хав рекурсии здесь, а затем ваш счетчик никогда не получить приращение:

if(counter%2 == 0){ 
    whiteEnterForfeit = turn(board, "White", "W", "B"); 
    printBoard(board); 
    counter++; 
} 

При перемещении счетчика ++ перед вызовом вы получаете право печати, но в конечном итоге вы получите StackOverflowError, потому как вы реализовали рекурсия.

Я думаю, что эта серия видео может вам помочь. Это для игры C# GO, но она очень похожа на то, что вы делаете: Roy Osherove - Building a Go Game Engine With TDD and Pair Programming - Part 1

+0

Ty для совета! Причина, по которой я использую глобальную переменную здесь, заключается в том, чтобы избежать проблемы с рекурсией, и кажется, что она не работает. Я имел в виду – jaykodeveloper

+0

. Возьмите это как подсказку о том, что глобальные переменные являются ** злыми **! Они заставляют Харт отслеживать проблемы. –

0

Необходимо использовать ключевое слово else вместо if. Это исправит его, потому что в настоящее время счетчик увеличивается, когда он четный, что сделает его нечетным (и, следовательно, выполняется второй оператор if).

if(counter%2 == 0){ 
    whiteEnterForfeit = turn(board, "White", "W", "B"); 
    printBoard(board); 
    counter++; 
} else { 
    blackEnterForfeit = turn(board, "Black", "B", "W"); 
    printBoard(board); 
    counter++; 
} 

делая второй ifelse вместо остановится и от бежится.

+0

Он по-прежнему показывает черно-бело-бело-белый. Я думаю, что один из других парней сказал прав. Он упомянул рекурсию – jaykodeveloper

0

Я бы предпочел, чтобы написать код так:

Scanner s = new Scanner(System.in); 
move = s.nextLine(); 
// enter to forfeit 
if(move.equals("")){ 
    if(counter%2 == 0){ 
     whiteEnterForfeit = turn(board, "White", "W", "B"); 
    } 
    if(counter%2 == 1) { 
     blackEnterForfeit = turn(board, "Black", "B", "W"); 
    } 
    printBoard(board); 
    counter++; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^