2012-06-28 2 views
1

Я начал программировать несколько недель назад в java/android. Я хочу написать небольшую игру tic tac toe в качестве приложения для Android, но у меня возникают проблемы с моим методом, который будет проверять победителя. Она заключается в следующем:(Code Review) Оператор Java if с логическим и (&&) оператором

public void checkForWinner() { 

     if(taken[0] && taken[3] && taken[6] || 
      taken[0] && taken[1] && taken[2] || 
      taken[2] && taken[5] && taken[8] || 
      taken[6] && taken[7] && taken[8] || 
      taken[0] && taken[4] && taken[8] || 
      taken[2] && taken[4] && taken[6] || 
      taken[1] && taken[4] && taken[7] || 
      taken[3] && taken[4] && taken[5] == 1){} 
} 

Здесь я массив называется принято, что имеет 9 чисел, каждое из этих чисел является либо один, то есть игрок один владеет этот блок, или два, означающий игрока два РМО этого блока , Текущий, я пытаюсь попробовать все возможные сценарии, в которых игрок будет победителем, но затмение говорит мне, что The operator && is undefined for the argument type(s) int, int. Кажется, что ошибка показывает только первую логику и работу каждой строки оператора if. Например, первая ошибка увеличивается до taken[0] && taken[3], а затем исчезает до следующей строки.

+1

Если в элементах массива «приняты» есть только два возможных значения, тогда вам следует подумать о создании булевого массива, так что ваши логические утверждения также имеют смысл, хотя вы можете добавить скобки для удобства чтения. Однако, видя, что вы пытаетесь реализовать игру tic-tac-toe, вам понадобится другое значение для пространства, которое не имеет ни «1», ни «2», и в этом случае вам нужно будет проверить равенство, используя «= = ', а не булевы операторы. – pennetti

+1

Булевский массив - плохая идея, так как вам нужны три состояния. Пустой, p1, p2. –

+0

@Sam [Нет, вы недостаточно открыты] (http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx);) – Voo

ответ

3

В качестве альтернативы, вы можете чек приняты [п] значения, чтобы увидеть, если они имеют 1 или 2, если вы думаете, что бы сделать код более ясным:

(taken[0]==1 && taken[3]==1 && taken[6]==1) 

Имейте в виду, что & & оператор ожидает boolean operands ... поэтому он не будет работать с вашим массивом int так, как вы ожидаете.

+0

О, это работает, я думал, что могу проверить булевское выражение в конце инструкции, я думаю, я проверю их отдельно. Спасибо – user1489599

+1

Недостатком этой проверки является то, что вам понадобятся две почти идентичные условные проверки, вызывающие большое количество повторяющегося кода. Хотя, если вы измените метод, чтобы принять целое число, эквивалентное номеру проигрывателя, и поменяйте hardcoded 1 или 2 на параметр, это уменьшит этот дополнительный код. –

2

Поменяйте свой & & на ==, вы пытаетесь выяснить, все ли они одинаковые значения. Я предполагаю, что будет показывать победителя, и обязательно используйте круглые скобки для его сортировки, поэтому одно условие выигрыша будет

((taken[0] == taken[3]) && (taken[0] == taken[6])) 

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

+0

'взято [0] == принятое [3]' возвращает логическое значение. '(логический результат) == принят [6]' недействителен. –

+0

Вы совершенно правы, немного разочарованы тем, что я позволил этому легко проскользнуть, я отредактирую, чтобы информация не была недействительной. –

1

В Java

if (a && b) or if (a || b) 

работает только тогда, когда а и Ь BOOLEANS/логические выражения.

0

ОК здесь есть две основные проблемы.

Во-первых, taken[0] должен возвращать либо true, либо false, чтобы иметь возможность оставаться как есть внутри оператора if. Вы упомянули, что это целое число, поэтому для возврата true или false вам нужно выполнить сравнение, например taken[0] == 1.

Во-вторых, вам нужно использовать круглые скобки и выполнять некоторые группировки. Java не уважает пробелы. Вместо if(taken[0] && taken[3] && taken[6] || ... вам нужно будет сделать if((taken[0] && taken[3] && taken[6]) || .... То есть вам нужно поместить круглые скобки вокруг каждого набора группировок.

Причина, по которой Eclipse является ошибкой, заключается в том, что оператор && предназначен только для сравнения булевых. То есть true && true. Вы даете ему целые числа, и это не нравится.

Один из способов, которым вы, возможно, захотите решить это, - написать функцию, которая определяет, достигнуто ли решение. Так что, может быть что-то вроде:

private boolean isSolutionPresent(int[] taken, int index1, int index2, int index3) { 
    return (taken[index1] == 1) && (taken[index2] == 1) && (taken[index3] == 1); 
} 

Затем вы можете конвертировать ваши, если заявление на что-то вроде:

if (isSolutionPresent(taken, 0, 3, 6) || 
    isSolutionPresent(taken, 0, 1, 2) || 
    isSolutionPresent(taken, 2, 5, 8) || //... etc, removing the final ==1 

Поскольку метод isSolutionPresent возвращает логическое значение (то есть, истина/ложь), вы можете применить || оператора к нему.

+0

Ваш 'isSolutionPresent' не будет работать. оператор '==' возвращает логическое значение, а затем вы пытаетесь сравнить этот логический результат с int. –

+0

О чем ты говоришь? В if-утверждении есть только булевы. –

+0

'принят [index1] == принят [index2] == принят [index3] == 1;'. int == int, return boolean. boolean == int, сбой компиляции. –

1

1) Вы не можете использовать && или || операторов на int переменных, так как предназначены для boolean значений.

2) также использовать скобки для условий группы, как

if (
     (taken[0]==1 && taken[3]==1 && taken[6]==1)|| 
     (taken[0]==1 && taken[1]==1 && taken[2]==1)|| 
     ... 
1

Здесь я массив называется принятым, который содержит 9 целых чисел, каждое из этих чисел является либо один, то есть игрок один владеет этот блок, или два, что означает, что двум игрокам принадлежит этот блок.

В этом случае, вы можете заменить логические операторы с операторами поразрядными:

int winner = taken[0] & taken[3] & taken[6] 
      | taken[0] & taken[1] & taken[2] 
      | taken[2] & taken[5] & taken[8] 
      | taken[6] & taken[7] & taken[8] 
      | taken[0] & taken[4] & taken[8] 
      | taken[2] & taken[4] & taken[6] 
      | taken[1] & taken[4] & taken[7] 
      | taken[3] & taken[4] & taken[5]; 

Тогда переменная winner будет содержать 1, если игрок 1 вона, 2, если игрок 2 вона, 0, если ни один из них выиграли, или 3 из них выиграли (что, вероятно, невозможно в вашей игре).

+0

Вау, это гораздо более простой способ сделать это, и он работает точно так же, как и раньше. Спасибо. – user1489599

+0

Обратите внимание, что он работает только потому, что 1 и 2 являются степенями двух. Если вы когда-либо добавляли в игру третьего игрока, вы должны закодировать его как 4, а не 3. – fredoverflow

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