Крестики-нолики

Рекомендованный уровеньуровень
5+
Кре́стики-но́лики[1] — логическая игра между двумя противниками на квадратном поле 3 на 3 клетки или бо́льшего размера (вплоть до «бесконечного поля»). Один из игроков играет «крестиками», второй — «ноликами». В традиционной китайской игре Гомоку используются чёрные и белые камни. Игроки по очереди ставят на свободные клетки поля 3×3 знаки (один всегда крестики, другой всегда нолики). Первый, выстроивший в ряд 3 своих фигуры по вертикали, горизонтали или большой диагонали, выигрывает. Если игроки заполнили все 9 ячеек и оказалось, что ни в одной вертикали, горизонтали или большой диагонали нет трёх одинаковых знаков, партия считается закончившейся в ничью. Первый ход делает игрок, ставящий крестики. Обычно по завершении партии выигравшая сторона зачёркивает чертой свои три знака (нолика или крестика), составляющих сплошной ряд. Обмен значков Можно отменить правило, указывающее игрокам ставить только свой вид значков. Например, вариантом игры может быть: игроки ставят крестик или нолик (что захотят); первый выигрывает, если построит линию нужной длины из одинаковых значков, второй — если до заполнения поля этого не произойдёт. Другой вариант: «свой» значок меняется с каждым ходом. Супер крестики-нолики Игра состоит из девяти досок для игры в крестики-нолики, расположенных в сетке 3 × 3. Игроки по очереди играют на меньших досках крестиков-ноликов до тех пор, пока один из них не выиграет на большей доске крестиков-ноликов. По сравнению с традиционными крестиками-ноликами, стратегия в этой игре концептуально сложнее и оказалась более сложной для компьютеров.
Комментарии (38)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #3442379
Уровень 1
21 апреля, 17:28
Метод викликається, але перевірка не проходить
Jandar
Уровень 1
21 апреля, 14:59
Зробив, як написано, а видає цю помилку: Метод повинен містити код, що виконується, або його слід оголосити абстрактним. файл ua/javarush/games/ticktacktoe/TicTacToeGame.java, рядок 7, позиція 147
Денис
Уровень 27
20 апреля, 15:22
Помогите с этим методом, если ячейка равна нулю то пишу в ней "X" или "O" , когда нажимаю на ячейку не во всех ячейках появляется "X" или "O"
// отображение только одной ячейки
    public void updateCellView(int x, int y, int value) {
        // установка текста в ячейке метод setCellValue(x, y, text)
// когда без этого условия, то все отлично расставляет знаки
        if (x != 0 && y != 0) { // если ячейка не равна нулю
            return;
        }
        if (value  == 0) {
              setCellValueEx(x, y, Color.WHITE, " ", Color.WHITE);
        } else if (value == 1) {
            setCellValueEx(x, y, Color.WHITE, "X", Color.RED);
        } else if (value == 2) {
            setCellValueEx(x, y, Color.WHITE, "O", Color.BLUE);
        } else {
            setCellValueEx(x, y, Color.WHITE, "", Color.WHITE);
        }
    }
Денис
Уровень 27
20 апреля, 16:35
Вообщем проверку надо вставлять в метод onMouseLeftClick
24 апреля, 13:43
а для чего вообще эта проверка у вас?
Денис
Уровень 27
24 апреля, 15:41
// если ячейка не ноль, то ретурн
        if (model[x][y] != 0) {
            return;
        }
Nozim
Уровень 11
30 марта, 06:00
public void onKeyPress(Key key) {
        if (key == Key.ESCAPE) {
            startGame();
            updateView();
        }
        if (key == Key.SPACE) {
            startGame();
            updateView();
        }
    }
Почему не проходит?
Михаил
Уровень 31
3 апреля, 22:25
У проверки нажатия пробела нахватает проверки что игра остановлена
Irina бухгалтер в Тандер АО
28 марта, 08:07
В своей реализации игры я добавила сообщение в начале игры и изменила надпись "Ничья".
Alexey
Уровень 3
26 марта, 16:54
public boolean checkWin(int x, int y, int n) {
    boolean winX = true;
    boolean winY = true;
    boolean winD1 = true;
    boolean winD2 = true;
    int l = model.length - 1;

    for(int i = 0; i < model.length; i++) {
        winX = model[x][i] == n && winX;
        winY = model[i][y] == n && winY;
        winD1 = model[i][i] == n && winD1;
        winD2 = model[i][l-i] == n && winD2;
    };

    return winX || winY || winD1 || winD2;
}
E_X_P_E_R_T_ ___
Уровень 1
26 марта, 12:48
есть ли способы сократить код или другие методы?(хотелось бы узнать)
public boolean checkWin(int x, int y, int n){
        if (model[x][0] == n && model[x][1] == n && model[x][2] == n)
        return true;
        if (model[0][y] == n && model[1][y] == n && model[2][y] == n)
        return true;
        if (model[0][0] == n && model[1][1] == n && model[2][2] == n)
        return true;
        if (model[2][2] == n && model[1][1] == n && model[0][0] == n)
        return true;
         if (model[0][2] == n && model[1][1] == n && model[2][0] == n)
        return true;
        if (model[2][0] == n && model[1][1] == n && model[0][2] == n)
        return true;

        return false;
Лёля
Уровень 30
Expert
26 марта, 16:06
Думаю можно объединить арифметику поиграв с count, но сходу не придумалось. Ещё короче, без кучи циклов, это вместо count завести четыре переменных, например countX, countY, countD, countD2 и все их прогнать в одном цикле, а после все значения прогнать через if и ||, но тогда работать будет дольше за счёт возможных лишних прогонов, зато код будет визуально короче. Ну и если закинуть размер в переменную, то можно такой код масштабировать на любое количество клеток, поправив всего пару мест, в отличие от готового решения.
public boolean checkWin(int x, int y, int n) {
    int count = 0;

    for (int i = 0; i < 3; i++) {
        count = model[x][i] == n ? ++count : 0;
    }
    if (count == 3) return true;

    count = 0;

    for (int i = 0; i < 3; i++) {
        count = model[i][y] == n ? ++count : 0;
    }
    if (count == 3) return true;

    count = 0;
    for (int i = 0; i < 3; i++) {
        count = model[i][i] == n ? ++count : 0;
    }
    if (count == 3) return true;

    count = 0;
    for (int i = 0; i < 3; i++) {
        count = model[2-i][i] == n ? ++count : 0;
    }
    if (count == 3) return true;
    return false;
}
Anonymous #3418302
Уровень 2
26 марта, 19:40
Нужно ли дублировать проверку одной и той же диагонали? if (model[0][0] == n && model[1][1] == n && model[2][2] == n) return true; if (model[2][2] == n && model[1][1] == n && model[0][0] == n) return true; в коде третий и четвертый if проверяют одно и то же, пятый и шестой if также проверяют одну и ту же диагональ . дублирование проверки можно убрать
Александр Крылов Full Stack Developer в MKB
10 апреля, 18:05
public boolean checkWin(int x, int y, int n) {
        boolean resX = true, resY = true, resD = true, resD2 = true;
        for (int i = 0; i < SIZE; i++) {
            resX = resX && model[i][y] == n;
            resY = resY && model[x][i] == n;
            resD = resD && model[i][i] == n;
            resD2 = resD2 && model[i][SIZE - 1 - i] == n;
        }
        return resX || resY || resD || resD2;
    }
Примечание: если одна из переменных res будет false, то на следующем витке цикла в присваивании этой переменной java не будет выполнять условие model[][] == n, так как false && ??? = false
Alex
Уровень 41
23 апреля, 10:43
1) Duplicate Checks: Some checks are duplicated. For example, you check for the same diagonal twice (model[0][0] == n && model[1][1] == n && model[2][2] == n and model[2][2] == n && model[1][1] == n && model[0][0] == n). Similarly, you check for both diagonals separately. 2) Logic for Diagonal Check: The diagonal checks (model[0][0] == n && model[1][1] == n && model[2][2] == n and model[0][2] == n && model[1][1] == n && model[2][0] == n) are incorrect. You have (2,2) and (0,0) twice, which should be replaced with (0,2) and (2,0) respectively.
Davit Kirakosyan
Уровень 1
25 марта, 16:11
https://javarush.com/projects/apps/497871
Satenik
Уровень 1
25 марта, 13:12
Дмитрий Ким
Уровень 1
24 марта, 17:17
public void initialize(){
        setScreenSize(3,3);
        startGame();
        updateView();
    }
почему не засчитывает?
Максим Дроздов
Уровень 1
24 марта, 18:52
1. public void initialize() { 2. setScreenSize(3, 3); Остальное всё правильно