Змейка(14)

  • 24
  • Недоступна
Теперь поработаем над методом print(). Надо: а) вывести на экран прямоугольник из точек размером width x height. б) тело змеи отметить символом "x"-английское в) голову змеи нарисовать символом "X"-английское. Подсказка: а) удобно сначала создать матрицу типа int[][] с размером (height x width).
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (95)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
wan-derer.ru28 уровень, Москва
24 сентября, 08:16
А зачем делать матрицу инт? Я сделал чар и пишу в неё прямо нужные символы. Валя съела нормально
Victor Zverev28 уровень, Киев
6 сентября, 18:34
Валидатор задание принял, но есть интересный ньюанс - если использовать такие данные:
game = new Room(5, 5, new Snake(5, 1));
то получаю
ArrayIndexOutOfBoundsException
Melonorm24 уровень, Николаев
4 октября, 08:18
Если у Вас с комнатой что-то типа такого:
char [][] gamefield = new char[height][width];
А со змеиной головой что то типа такого:
int headX = game.snake.getX();
int headY = game.snake.getY();
gamefield[headY][headX] = 'X';
то в Вашем случае пытаемся на игровое поле шириной 5 ячеек впихнуть голову змеи в шестую ячейку (индекс которой будет равен пяти). Отсюда и ArrayIndexOutOfBoundsException получается.
Ivan D28 уровень
5 сентября, 11:16
Тут пишут, что имя массива должно быть matrix. Я назвал gameField, и у меня все приняло. Так что не забивайте голову.
24 августа, 21:27
Если кто интересуется, можно ли писать через for-each двухмерные массивы, и(или) не хочет лезть в гугл, то да, можно. Просто Вам прийдётся указать в значении массив. Например:
int[][] matrix =  new int[/*значения*/][/*значения*/];
for (int[] a : matrix){
       for (int b : a){
              //что-либо
      }
}
В даной задаче, во втором цикле перебираем все значения. Ну тут всё понятно. А моё решение... О боже... Я такой гений, что иногда хочется часами биться об стену... Я сделал так (это не верный код, если что):
int[][] matrix = new int[width][height];
for (int x = 0; x < width; x++){
         for (int y = 0; y < height; y++){
                   if (snake.getSections().get(0).getX = x){
                               if (snake.getSections.get(0).getY() = y)
                                                matrix[x][y] = 3;
                   }
         }
}/*Mouse и тело змеи заносилось по такому же принципу*/
Главная ошибка был в том, что в двухмерном массиве сначала идёт высота, потом ширина. Не говоря уже о том, что я сначала пытался сделать через символы (то есть сделал двухмерный массив char). Я не утверждаю, что так сделать было нельзя, но 3 попытки уже не вернуть 😢
Фёкла35 уровень, Москва
27 июня, 18:05
Для тех, кто запутался в XY и height/width * Размеры матрицы [height] [width] * Все методы getY() возвращают значение для height * Все методы getX() возвращают значение для width * Проход цикла - сначала высота, потом ширина - выглядит так:
for (int h = 0; h < getHeight(); h++) {
    for (int w = 0; w < getWidth(); w++) { }
}
barracuda29 уровень, Санкт-Петербург
23 июня, 22:00
Прочитал условие. Ничего не понял. Сразу полез сюда. Почитал, что хорошие люди пишут. Поэтому с первого раза. Вывод в консоль должен быть примерно вот такой: (кол-во строк , естесственно, должно быть больше. Обрезал, чтобы не загружать этот пост, и так longread получился...). .................... ..^................. .................... .................... .................... .................... .................... ..........X......... .................... 1. Создал матрицу, как просили. int [][] matrix = new int[height][width]; (в комментах писали, что если назовешь не matrix - валидатор не пропустит. Решил не рисковать ))) 2. прописал координаты головы змеи: matrix[snake.getSections().get(0).getY()][snake.getSections().get(0).getX()] = 2; (сначала указываем Y - задается строчка, потом X - задается конкретная позиция в этой строчке. Ну это мы в первом квесте проходили... 3. прописал координаты секций змеи - пройдясь уиклом по коллекции snake.getSections(). Цикл начинал не с 0, а с единицы, т.к. 0 - это голова, а её прорисовали уже во втором шаге. 4. прописал в матрицу координаты мыши: matrix[mouse.getY()][mouse.getX()] = 3; 5. Двойным циклом прошелся по этой матрице: ---> во внешнем циклепо height - задает строчку - вертикальную координату. Потом по width - задает столбец - горизонтальную координату. for(int i = 0; i < height; i++){ for(int j = 0; j < width; j++) Ну и внутри этих циклов с помощью if сделал if(matrix[i][j] == 1) { System.out.print("x"); } else if ...................... else if ...................... else {System.out.print(".");} После окончания каждого внутреннего цикла - новую строчку, например вот так : System.out.println(); - чтобы выводило не в одну линию. 6. Это все.
коммивояжер26 уровень, Москва
1 июля, 13:41
Чувак, красава, спасибо тебе, не знал что сначала getY() в матрице указываем.
Алексей32 уровень, Майкоп
6 июля, 17:20
Огромное спасибо, очень помогло!
Igor Chubenko25 уровень, Черкассы
17 июля, 12:47
Спасибо
Андрей30 уровень, Москва
23 июля, 06:58
Пол часа мучался, потому что решил заполнить матрицу не значениями 1, 2, 3, а номерами символов 'x', 'X', '^', '.'. В итоге после твоего комментария оставил только '.', остальное заменил на 1, 2, 3 и все прошло. :((
Василий Бабин28 уровень, Москва
6 августа, 16:02
В принципе сделал также. Только вывод я использовал тернанрый оператор, и точкам пространство комнаты не заполнял только границы.
24 августа, 21:02
Огромное спасибо! Не знаю, пользуетесь ли Вы for-each, но последний пункт с выводом можно было сделать легче:
for (int[] a : matrix){
            for (int b : a){
                if (b == 1)
                    System.out.print("x");
                else if (b == 2)
                    System.out.print("X");
                else if (b == 3)
                    System.out.print("^");
                else
                    System.out.print("-");
            }
            System.out.println("");
        }
То есть если мы работаем в двухмерном массиве через for-each, то получаем массив символов для текущего ряда. Или что-то типа того. Честно говоря в интернете не искал, точно не скажу, мне подсказал компилятор.
Алексей26 уровень, Санкт-Петербург
6 сентября, 09:24
snake.getSections().get(0).getX() зачем такой длинный запрос, мы же делали в snake спец методы для получения координат головы
Владимир35 уровень
25 мая, 11:34
Сделал через массив строк. На экран выводил то что требовали (голова = "X", тело = "x", мышь = "^") без точек, вместо них пустые строки. Вывод на экран:
Владимир35 уровень
25 мая, 11:05
Пример работы с матрицей
[0, 0]	[0, 1]	[0, 2]	[0, 3]
[1, 0]	[1, 1]	[1, 2]	[1, 3]
[2, 0]	[2, 1]	[2, 2]	[2, 3]
Первое число в скобках обозначают ряд (строку), а второе число - столбец. Принято считать, что в массиве new int[M][N] первый размер означает количество строк, а второй - количество столбцов. На экране после запуска примера мы увидим следующее: 0 1 2 3 4 5 6 7 8 9 10 11 Надо это запомнить, что сначала "Y" потом "X" (по оси координат например). Или по принципу написания строк. Начинаем писать первую строку (Y), потом пишем предложения (X), которые будут находиться в первой строке строке (Y). Перешли на другую строку (Y) и в неё начинаем писать предложения (X).
alex41 уровень
24 мая, 03:45
блин не пойму, я что-то упустил? голову змеи мы создали, а я че-то не помню, что было какое-то задание про тело змеи
Vladislav Shamshurin29 уровень, Ижевск
25 мая, 10:30
Голова змеи - это первый элемент List<SnakeSection> sections; Остальные элементы коллекции - тело.
Денис Давыдов38 уровень, Казань
11 мая, 12:57
Может кому пригодится, в циклах заполнения и прорисовки массива в ограничения пишите поля height и width. Потратил две попытки и 20 минут на переписывания, потому что в ограничения циклов вписал размеры массива.