Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
 Аватар для Aecttann
6 / 6 / 5
Регистрация: 19.10.2013
Сообщений: 359

Крестики-нолики (консоль)

11.02.2017, 13:37. Показов 4367. Ответов 4

Студворк — интернет-сервис помощи студентам
Пишу игру крестики-нолики 5х5 с консольной реализацией.
Столкнулся со следующими проблемами:
1) Почему-то можно победить и с первого хода, и со второго, в зависимости от того, какую клетку выбрать. Допустим, при появлении Х в ячейках 0 и 6, уже определен победитель. Или если выбрать 22-ую, то игра тоже заканчивается.
2) Красивый вывод границ ячеек. Получается сделать красиво либо для однозначных чисел, либо для двузначных. Как сделать красивую табличку??
Код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
package game;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class GameField {
 
    static int [] canvas = {0,0,0,0,0,
                            0,0,0,0,0,
                            0,0,0,0,0,
                            0,0,0,0,0,
                            0,0,0,0,0}; //начальный массив
    
    public static void main(String[] args){
 
        boolean b;
        boolean isCurrentX = false;
        do {
            isCurrentX = !isCurrentX;
            drawCanvas();
            System.out.println("Ходит " + (isCurrentX ? "X" : "O"));
            int n = getNumber();
            canvas[n] = isCurrentX ? 1 : 2;
            b = !isGameOver(n);
            if (isDraw()){
                System.out.println("Draw");
                return;
            }
        } while (b);
        drawCanvas();
        System.out.println();
 
        System.out.println("ПОбедитель: " + (isCurrentX ? "X" : "O") + "!");
    }
 
    static int getNumber(){
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        while (true){
            try {
                int n = Integer.parseInt(reader.readLine());
                if (n >= 0 && n < canvas.length && canvas[n]==0){
                    return n;
                }
                System.out.println("Выберите свободное поле и введите его порядковый номер");
            } catch (NumberFormatException e) {
                System.out.println("Пожалуйста, введите порядковый номер клетки");
            } catch (IOException e) {
            }
        }
    }
 
    static boolean isGameOver(int n){
        //
        //  0   1  2  3 4
        //  5   6  7  8 9 
        // 10 11 12 13 14
        // 15 16 17 18 19
        // 20 21 22 23 24
        //поиск совпадений по горизонтали
        int row = n-n%5; //номер строки - проверяем только её
        if (canvas[row]==canvas[row+1] &&
                canvas[row]==canvas[row+2] &&
                        canvas[row]==canvas[row+3] &&
                                canvas[row]==canvas[row+4]) return true;
        //поиск совпадений по вертикали
        int column = n%5; //номер столбца - проверяем только его
        if (canvas[column]==canvas[column+5])
            if (canvas[column]==canvas[column+10])
                if (canvas[column]==canvas[column+15])
                    if (canvas[column]==canvas[column+20])return true;
        //мы здесь, значит, первый поиск не положительного результата
        //если значение n находится на одной из граней - возвращаем false
        if (n%2!=0) return false;
        //проверяем принадлежит ли к левой диагонали значение
        if (n%4==0){
            //проверяем есть ли совпадения на левой диагонали
            if (canvas[0] == canvas[6] &&
                    canvas[0] == canvas[12] &&
                            canvas[0] == canvas[18] &&
                                    canvas[0] == canvas[24]) return true;
            if (n!=4) return false;
        }
        return canvas[2] == canvas[4] &&
                canvas[2] == canvas[8]&&
                        canvas[2] == canvas[12]&&
                                canvas[2] == canvas[16]&&
                                        canvas[2] == canvas[20];
    }
 
    static void drawCanvas(){
        System.out.println("     |     |     ");
        for (int i = 0; i < canvas.length; i++) {
            if (i!=0){
                if (i%5==0) {
                    System.out.println();
                    System.out.println("_____|_____|_____");
                    System.out.println("     |     |     ");
                }
                else
                    System.out.print("|");
            }
 
            if (canvas[i]==0) System.out.print("  " + i + "  ");
            if (canvas[i]==1) System.out.print("  X  ");
            if (canvas[i]==2) System.out.print("  O  ");
        }
        System.out.println();
        System.out.println("     |     |     ");
    }
 
    public static boolean isDraw() {
        for (int n : canvas) if (n==0) return false;
        return true;
    }
}
Добавлено через 39 минут
Проблему с границами ячеек решил

Добавлено через 39 секунд
но с isGameOver() по-прежнему не получается
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2017, 13:37
Ответы с готовыми решениями:

Крестики - нолики (консоль)
Всем доброго времени суток.Начал учить java совсем недавно,и после пары уроков выбрал для себя первую задачу -написать игру...

Крестики нолики
Задание : Необходимо реализовать метод, который проверяет наличие победителя на поле! Этот метод расположен в классе:...

ИИ для крестики-нолики
Есть программа на Java, крестики-нолики. Human vs PC. Ход компьютера происходит рандомно. А необходимо сделать хотя бы простенький ИИ,...

4
 Аватар для Aecttann
6 / 6 / 5
Регистрация: 19.10.2013
Сообщений: 359
11.02.2017, 13:51  [ТС]
Название: Clip2net_170211125055.png
Просмотров: 97

Размер: 7.4 Кб
Почему так происходит??
Победитель: 0.
0
 Аватар для Aecttann
6 / 6 / 5
Регистрация: 19.10.2013
Сообщений: 359
11.02.2017, 14:06  [ТС]
Название: Clip2net_170211130408.png
Просмотров: 97

Размер: 10.6 Кб
непонятно вообще
т.е. когда я начинаю ход с нуля - игра заканчивается на 4м ходу, а так все нормально отработало.
0
 Аватар для Aecttann
6 / 6 / 5
Регистрация: 19.10.2013
Сообщений: 359
11.02.2017, 14:09  [ТС]
Название: Clip2net_170211130721.png
Просмотров: 95

Размер: 12.4 Кб
0
 Аватар для Aecttann
6 / 6 / 5
Регистрация: 19.10.2013
Сообщений: 359
11.02.2017, 14:21  [ТС]
никак с условиями не могу разобраться
теперь выстраиваю по диагонали, но победы нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.02.2017, 14:21
Помогаю со студенческими работами здесь

Не работают крестики-нолики
Все нормально работало, что-то поменял и теперь после 1 хода игра заканчивается. В чем проблема? package javaapplication18; import...

Крестики нолики(учимся)
Всем привет, изучаю java со всем не много и взбрела в голову идея написать игру крестики нолики) Но что то не получается, ходить может...

игра крестики нолики
помогите переделать код : import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public...

Крестики нолики ( логика компьютера )
Нужно доработать игру Крестики=Нолики А именно. Что-бы &quot;О&quot; ставил комп, а не юзер. Как реализовать это и логику компа еще не придумал....

Проверка победы в крестики-нолики по диагонали
Не могу составить правильные условия победы по диагонали. При наличии 5 одинаковых символов по диагонали, игра все равно продолжается. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru