JavaRush /Java блог /Архив info.javarush /крестики нолики, активный игрок, нужна помощь.
Samson
19 уровень

крестики нолики, активный игрок, нужна помощь.

Статья из группы Архив info.javarush
суть проблемы, прошел 10 уровней а денег шас нет на апгрейд. Решил сделать попытку на основе знаний написать консольную игру крестики нолики. не дошел пока до условий игры, но застрял на смене активного игрока. Помогите пожалуйста советом! public class Game { public static int[][] mas = new int[3][3]; // создаю двухмерний масив public static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); public static Person ActivePlayer = null; //присвоил активному играку значение null public static Person player1 = new Person('X');//создал 2 играка public static Person player2 = new Person('O'); public static void main(String[] args) throws Exception { //хотел заполнить "_" потом понял что при поиске для замены на "Х" или на "О" не выйдет. Заполнил от 0 до 9. int k = 0; for (int i = 0; i < mas.length; i++) { for (int j = 0; j < 3; j++) { mas[i][j] = k; k++; } } //при старте вывожу на екран массив for (int i = 0; i < mas.length; i++) { System.out.println(Arrays.toString(mas[i])); } //ход игры while(true) { System.out.println(" player1"); SetActivePlayer(player1);//ход первого игрока, в условии метода SetActivePlayer как раз не разобрался, там нужна помощь. ChangeMas();//метод меняет на символ активного игрока если есть сходство с введенным числом for (int i = 0; i < mas.length; i++) { System.out.println(Arrays.toString(mas[i]));// вывод на екран измененный массив }//то самое со вторим игроком System.out.println(" player2"); SetActivePlayer(player2); ChangeMas(); for (int i = 0; i < mas.length; i++) { System.out.println(Arrays.toString(mas[i])); } } } public static void ChangeMas() throws Exception//тот метод который меняет массив { int a = Integer.parseInt(reader.readLine()); for(int i=0;i когда запускаю и ввожу какой символ поменять, все время меняет только на символ первого игрока
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
fatfaggy Уровень 26
2 марта 2016
public static Boolean SetActivePlayer(Person player)
    {
        ActivePlayer = player;
        return true;
    }


кстати, можно его и войдом сделать, вы все-равно нигде не используете возвращаемое значение… разве что вот в этих иф-ах
if(SetActivePlayer(player1)){//если первый то пока поставил нуль;
    mas[i][j]=0;
}//если второй то заменяет на 1. потом откорректирую на "Х" та "О"
else if(SetActivePlayer(player2)){
    mas[i][j]=1;
}

но здесь явно надо переделать. насколько я понимаю логику программы, вы хотите проверить какой игрок делает ход, и исходя из этого поменять соответствующую клетку на «маркер» игрока (х или 0). для этого сетер использовать не нужно. сетер — должен устанавливать какое-то значение. да, сетеры бывают boolean и возвращают true или false, но там логика какая: если удалось установить значение — возвращаем true, если не удалось (например, если в строку пытаемся впихнуть массив, или например в клетку где могут быть цифры от 0 до 9 вдруг каким-то чудом мы передали -15) — вот тогда возвращается false.
я вам предлагаю вообще переписать метод ChangeMas() без циклов и всего такого… примерно так:
public static void ChangeMas() //тот метод который меняет массив
{
    /*
    1. читаем число с клавиатуры (тут же в блоке try-catch отлавливаем исключения, если не удалось спарсить то что ввел пользователь в число)
    2. убеждаемся, что это число в пределах от 0 до 9 (если нет - см. далее)
    3. теперь ищем соответствующую числу ячейку. примерно так:
        рядок = число / 3; // тут у нас целочисленное деление. возможный результат 0, 1 и 2, что соответствует нужному нам рядку
        колонка = число % 3; // а тут берем остаток от деления (тоже 0, 1 или 2), и это будет нужная нам колонка
    4. теперь напрямую обращаемся в массив наш и проверяем не занята л