Как определить победителя в крестиках-ноликах?
Игра в крестики-нолики происходит на поле, представляющим собой массив char[][]:
{{-, O, -}
{X, O, X}
{-, -, X}}
Каким образом я могу определить победителя, т.е. чтобы несколько ячеек подряд содержали один и тот же символ?
Ответы (2 шт):
С большим трудом понял ваш вопрос. Формулируйте лучше.
То есть у вас есть игровое поле, которое выражено матрицей char'ов, в ячейках которой может быть X, O и, видимо, какой-то ещё дефолтный символ, допустим это тире:
{{-, O, -}
{-, X, X}
{-, O, X}}
Проверить наличие X или O очень просто. Вам нужен перебор матрицы:
for (int i = 0; i < gameField.length; i++) {
for (int j = 0; j < gameField[i].length; j++) {
// а теперь проверяете, что содержится в ячейке gameField[i][j]
}
}
Но вам, видимо, нужно условие выигрыша. Для этого поступите следующим образом. Я не буду писать за вас код, но опишу общий принцип. Значит, делайте перебор в двойном цикле, который я привёл выше. Как только вы наткнётесь на символ X или O, то проверьте соседние ячейки на наличие того же символа. И если там тоже есть этот символ, то проверьте и следующую ячейку. Следите только за тем, чтобы не выйти за границу диапазона массива, иначе получите ошибку. Нашли три подряд - победитель найден. В коде это примерно вот так:
if (gameField[i][j] == 'X') {
if (gameField[i][j + 1] == 'X') {
if (gameField[i][j + 2] == 'X') {
System.out.println("Ура, победитель - X!");
}
}
}
Только я вам тут проверку в одну сторону показал, а вам надо проверки во все стороны реализовать. Плюс реализовать проверку на длину массива, чтобы случайно не выйти за его пределы.
public static void main(String[] args) {
char[][] map = {
{'X','O','X'},
{'O','X','O'},
{'X',' ',' '},
};
// Горизонталь
for (int x = 0; x < 3; x++) {
int sum = 0;
for (int y = 0; y < 3; y++) {
sum += map[x][y];
}
win(sum);
}
// Вертикаль
for (int y = 0; y < 3; y++) {
int sum = 0;
for (int x = 0; x < 3; x++) {
sum += map[x][y];
}
win(sum);
}
// Диагонали
int sum = 0;
for (int i = 0; i < 3; i++) {
sum += map[i][i];
}
win(sum);
sum = 0;
for (int i = 0; i < 3; i++) {
sum += map[i][2-i];
}
win(sum);
}
private final static int maxX = 'X'*3;
private final static int maxO = 'O'*3;
private static void win(int sum) {
if(sum == maxX)
System.out.println("Победил X");
if(sum == maxO)
System.out.println("Победил O");
}