Крестики-нолики / Tic-tac-toe - Java

Здравствуйте всем!
Не получается реализовать логику противника для игры в крестики нолики. Сам думал и гуглил в течении 2 дней. Но увы, решение я не нашел. Обращаюсь на форум за поддержкой.
Суть задания следующая: необходимо реализовать "умную" логику противника (компьютера). А именно с помощью массива проверить соседние ячейки поля на наличие нужного нам символа. И если такой имеется, ставить символ рядом. Если нет, ставить в рендомную пустую ячейку поля.
Ниже код, в котором я застрял (
import java.util.Random;
import java.util.Scanner;
public class TicTacToe {
private static char[][] map;
private static int SIZE = 3;
private static final char DOT_EMPTY = '•';
private static final char DOT_X = 'X';
private static final char DOT_O = 'O';
private static final boolean SILLY_MODE = false;
private static Scanner scanner = new Scanner(System.in);
private static Random random = new Random();
public static void main(String[] args) {
initMap();
printMap();
while(true){
humanTurn();
if(isEndGame(DOT_X)) {
break;
}
computerTurn();
if(isEndGame(DOT_O)) {
break;
}
}
System.out.println("Игра закончена");
}
private static void initMap() {
map = new char[SIZE][SIZE];
for (int i = 0; i < SIZE; i ++) {
for (int j = 0; j < SIZE; j ++) {
map[i][j] = DOT_EMPTY;
}
}
}
private static void printMap() {
//TODO сократить кол-во циклов
for (int i = 0; i <= SIZE; i ++) {
System.out.print(i + " ");
}
System.out.println();
for (int i = 0; i < SIZE; i ++) {
System.out.print((i + 1) + " ");
for (int j = 0; j < SIZE; j ++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
System.out.println();
}
private static void humanTurn() {
int x, y;
do {
System.out.println("Введите координаты ячейки через пробел");
y = scanner.nextInt() - 1;
x = scanner.nextInt() - 1;
} while (!isCellValid(x, y));
map[y][x] = DOT_X;
}
private static void computerTurn() {
int x = -1;
int y = -1;
if (SILLY_MODE) {
do {
x = random.nextInt(SIZE);
y = random.nextInt(SIZE);
} while (!isCellValid(x, y));
}
else {
//проверяем клетки по направлениям
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if(isCellValid(i, j)) {//проеряем можно ли занять ячекй
//далее мы должны проверить соседние места с данной ячейкой.
//напрмер если map[i+1][j] == DOT_O - ставим map[i][j] = DOT_O ?
// if(map[i][j] == DOT_O) {
// System.out.println(i + 1 + " " + j + 1);
// } else {
// do {
// x = random.nextInt(SIZE);
// y = random.nextInt(SIZE);
// } while (!isCellValid(x, y));
// }
}
}
}
}
System.out.println("Компьютер выбрал ячейку " + (y + 1) + " " + (x + 1));
map[y][x] = DOT_O;
}
private static boolean isCellValid(int x, int y) {
boolean result = true;
if (x < 0 || x >= SIZE || y < 0 || y >= SIZE) {
result = false;
}
if (map[y][x] != DOT_EMPTY) {
result = false;
}
return result;
}
private static boolean isEndGame(char playerSymbol) {
boolean result = false;
printMap();
if (checkWin(playerSymbol)) {
System.out.println("Победили " + playerSymbol);
result = true;
}
if (isMapFull()) {
System.out.println("Ничья");
result = true;
}
return result;
}
private static boolean isMapFull() {
boolean result = true;
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (map[i][j] == DOT_EMPTY)
result = false;
}
}
return result;
}
private static boolean checkWin(char playerSymbol) {
boolean result = false;
if (
(map[0][0] == playerSymbol && map[0][1] == playerSymbol && map[0][2] == playerSymbol) ||
(map[1][0] == playerSymbol && map[1][1] == playerSymbol && map[1][2] == playerSymbol) ||
(map[2][0] == playerSymbol && map[2][1] == playerSymbol && map[2][2] == playerSymbol) ||
(map[0][0] == playerSymbol && map[1][0] == playerSymbol && map[2][0] == playerSymbol) ||
(map[0][1] == playerSymbol && map[1][1] == playerSymbol && map[2][1] == playerSymbol) ||
(map[0][2] == playerSymbol && map[1][2] == playerSymbol && map[2][2] == playerSymbol) ||
(map[0][0] == playerSymbol && map[1][1] == playerSymbol && map[2][2] == playerSymbol) ||
(map[2][0] == playerSymbol && map[1][1] == playerSymbol && map[0][2] == playerSymbol))
{
result = true;
}
return result;
}
}
21 января 2020 в 14:05
Ближайшие курсы

Как начать свой путь в разработке?
Онлайн-курс
26
февраля
Интенсив «Как работать с Analytics и Метрикой?»
Онлайн-курс
26
февраля
Язык C#: изучи однажды, используй везде!
Онлайн-курс
26
февраля
Новые статьи

«После Scratch поняла, что не хочу бросать программирование»
13000

Что такое MVP и зачем его делать
12100

Как монетизировать Android-приложения в Play Market
32400