Не могу сделать так чтобы выполнялся 2ой и 3ий пример
Описание На этом этапе вы должны проанализировать поле крестики-нолики.
Примечание. На этом этапе либо "Х", либо " о " может начать игру.
После печати поля вам нужно найти то состояние, в котором находится игра в данный момент. Возможное состояние:
"Игра не закончена" - когда ни у одной стороны нет тройки подряд, но на поле есть пустые клетки; "Ничья" - когда ни одна сторона не имеет тройки в ряд и на поле нет пустых ячеек; "X выигрывает" - когда на поле есть три X подряд; "О выигрыше" - когда на поле есть три часа подряд; "Невозможно" - когда на поле есть три X подряд, а также три O подряд. Или поле имеет намного больше X, чем O, или наоборот (если разница равна 2 или более, должно быть 1 или 0). Кроме того, вы можете использовать '' или '_' для печати пустых ячеек - это зависит от вас.
Примеры В приведенных ниже примерах показаны выходные данные для некоторых предопределенных состояний. Ваша программа должна работать точно так же.
Пример 1:
Enter cells: XXXOO__O_
---------
| X X X |
| O O _ |
| _ O _ |
---------
X wins
Example 2:
Enter cells: XOXOXOXXO
---------
| X O X |
| O X O |
| X X O |
---------
X wins
Example 3:
Enter cells: XOOOXOXXO
---------
| X O O |
| O X O |
| X X O |
---------
O wins
Example 4:
Enter cells: XOXOOXXXO
---------
| X O X |
| O O X |
| X X O |
---------
Draw
Example 5:
Enter cells: XO_OOX_X_
---------
| X O |
| O O X |
| X |
---------
Game not finished
Example 6:
Enter cells: XO_XO_XOX
---------
| X O _ |
| X O _ |
| X O X |
---------
Impossible
Example 7:
Enter cells: _O_X__X_X
---------
| O |
| X |
| X X |
---------
Impossible
Example 8:
Enter cells: _OOOO_X_X
---------
| O O |
| O O |
| X X |
---------
Impossible
Код
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] array = str.toCharArray();
char[][] array2 = new char[3][3];
int countOfX = (int) str.chars().filter(ch -> ch == 'X').count();
int countOfO = (int) str.chars().filter(ch -> ch == 'O').count();
int countOfFreeSpace = (int) str.chars().filter(ch -> ch == '_').count();
System.out.println(countOfX);
System.out.println(countOfO);
System.out.println(countOfFreeSpace);
int m = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
array2[i][j] = array[m];
m++;
}
}
System.out.println("---------");
System.out.println("| " + array[0] + " " + array[1] + " " + array[2] + " |");
System.out.println("| " + array[3] + " " + array[4] + " " + array[5] + " |");
System.out.println("| " + array[6] + " " + array[7] + " " + array[8] + " |");
System.out.println("---------");
for (int i = 0; i < 3; i++) {
int numOfXToWin = 0;
int numOfOToWin = 0;
for (int j = 0; j < 3; j++) {
if ((int) array2[i][j] == 88) {
numOfXToWin += array2[i][j];
} else if ((int) array2[i][j] == 79) {
numOfOToWin += array2[i][j];
}
if (numOfXToWin == 264) {
System.out.println("X wins");
return;
} else if (numOfOToWin == 237) {
System.out.println("O wins");
return;
} else if (countOfO == countOfFreeSpace && countOfX == countOfFreeSpace) {
System.out.println("Game not finished");
return;
}
else if (countOfO + countOfX == 9) {
System.out.println("Draw");
return;
} else if (Math.abs(countOfX - countOfO) > 1) {
System.out.println("Impossible");
return;
}
}
}
}
}
Ответы (1 шт):
У вас проверка только горизонталей. Нужно добавить проверку вертикалей и диагоналей
int getAddend(char ch) {
switch (ch) {
case 'X': return 1;
case 'O': return -1;
default:
return 0;
}
}
..............
if (Math.abs(countOfX - countOfO) > 1) {
System.out.println("Impossible");
return;
}
boolean xWin = false;
boolean oWin = false;
int dataMainD = 0;
int dataSecD = 0;
for (int i = 0; i < 3; i++) {
int dataRow = 0;
int dataCol = 0;
for (int j = 0; j < 3; j++) {
dataRow += getAddend(array2[i][j]);
dataCol += getAddend(array2[j][i]);
}
if (dataRow == 3 || dataCol == 3)
xWin = true;
if (dataRow == -3 || dataCol == -3)
oWin = true;
dataMainD += getAddend(array2[i][i]);
dataSecD += getAddend(array2[i][2 - i]);
}
if (dataMainD == 3 || dataSecD == 3)
xWin = true;
if (dataMainD == -3 || dataSecD == -3)
oWin = true;
if (xWin && oWin)
System.out.println("Impossible");
else if (xWin)
System.out.println("X wins");
else if (oWin)
System.out.println("O wins");
else if (countOfFreeSpace > 0)
System.out.println("Not Finished");
else
System.out.println("Draw");