С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
2 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 36

Передача массива в метод

22.11.2016, 20:10. Показов 3102. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, написал лабиринт, но очень криво и теперь хочу разбить код по классам. Запнулся на самом начале, хочу перенести код движения из метода keyPressed() в отдельный класс Player.
1. В строке 58 я передаю методу из класса Player массив map. Учитывая, что переменные x и у я пометил как public они должны быть видны в Player, но это не так. Как я должен оформить код, чтобы класс знал, какие переменные я хочу ему передать?
2. Я не понимаю как я должен выполнить return в методе moveRight() класса Player, если нынешний вариант неверен.
3. В 39 строчке указывается изображение лабиринта, картинку я добавил вложением.

Кликните здесь для просмотра всего текста
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
/**
 * В этой программе осуществляется движение по лабиринту.
 * Передвигаться нужно с помощью стрелок.
 */
 
public class RealMaze implements KeyListener {
 
    //Начальные координаты игрока,
    public int x = 0;
    public int y = 0;
 
    JButton button;
    MyDrawPanel myDrawPanel;
    JFrame frame;
    Player player;
 
    public static void main(String[] args) {
        RealMaze realMaze = new RealMaze();
        realMaze.go();
    }
 
    public void go() {
 
        //Отрисовка окна
 
        frame = new JFrame();
        myDrawPanel = new MyDrawPanel();
        button = new JButton();
        frame.setSize(500, 560);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.CENTER, myDrawPanel);
        frame.getContentPane().add(BorderLayout.SOUTH, button);
        frame.add(new JLabel(new ImageIcon("C:/Users/IP44/Downloads/thinWall2.png")));
        button.addKeyListener(this);
 
    }
 
    @Override
    public void keyTyped(KeyEvent e) {
 
    }
 
    @Override
    public void keyPressed(KeyEvent e) {
 
        //Движение осуществляется по пикселям окна, в соответствии
        //со значениями координат в массиве.
 
        int key = e.getKeyCode();
 
        if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
           player.moveRight(map);
        }
        
        //Перемещение вправо. 
        //if (map[x][y] == 0 && e.getKeyCode() == KeyEvent.VK_RIGHT) {
            //x++;
            //if (map[x][y] == 2) {
                //x++;
            //}
        //}
        if (map[x][y] == 0 &&  e.getKeyCode() == KeyEvent.VK_LEFT) {
            x--;
            if (map[x][y] == 2) {
                x--;
            }
        }
        if (map[x][y] == 0 && e.getKeyCode() == KeyEvent.VK_UP) {
            y--;
            if (map[x][y] == 2) {
                y--;
            }
        }
        if (map[x][y] == 0 && e.getKeyCode() == KeyEvent.VK_DOWN) {
            y++;
            if (map[x][y] == 2) {
                y++;
            }
        }
        if (map[x][y] == 1 && e.getKeyCode() == KeyEvent.VK_RIGHT) {
            x--;
        }
        if (map[x][y] == 1 &&  e.getKeyCode() == KeyEvent.VK_LEFT) {
            x++;
        }
        if (map[x][y] == 1 && e.getKeyCode() == KeyEvent.VK_UP) {
            y++;
        }
        if (map[x][y] == 1 && e.getKeyCode() == KeyEvent.VK_DOWN) {
            y--;
        }
        frame.repaint();
    }
    @Override
    public void keyReleased(KeyEvent e) {
    }
 
    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(Color.red);
            // Размер стороны квадрата.
            int sideLength = getSideLength();
            // Размер квадрата с учетом размера окна и размера массива.
            g.fillRect(x*sideLength, y*sideLength, sideLength, sideLength);
            g.setColor(Color.gray);
        }
 
        private int getSideLength() {
            // Минимальная сторона компоненты.
            int minComponentSide = (this.getHeight() > this.getWidth())  ? this.getWidth() : this.getHeight();
            // Максимальная сторона карты.
            int maxMapSide = (map.length > map[0].length) ? map.length : map[0].length;
            // Длина стороны, чтобы карта уместилась и комнаты были квадратные.
            return minComponentSide / maxMapSide;
        }
    }
 
    //Карта передвижения, 1 - стена, 2 - тонкая стена
    int[][] map = new int[][]{
            {0,0,2,0,0,0,0}, //x
            {0,0,2,0,0,0,0}, //|
            {0,0,1,0,0,0,0}, //|
            {0,0,1,1,2,2,2}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}  //|
            // - - - - - y
    };
}


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Player {
 
    int moveRight(int[][] map, int x, int y) {
        this.x = x;
        if (map[x][y] == 0) {
            x++;
            if (map[x][y] == 2) {
                x++;
            }
        }
        return [x][y];
 
   }
}
Миниатюры
Передача массива в метод  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.11.2016, 20:10
Ответы с готовыми решениями:

Передача массива в метод, без изменения исходного массива
Привет! Задача такая, пишу простые сортировки массивов. Каждая сортировка в отдельном методе.Вызываются последовательно в методе main. ...

Передача массива с переменными в метод
Передаю в метод строковую переменную, массив целочисленный и две переменные целочисленные. Что-то подсказывает мне, что я делаю...

Вычисление определителя и передача массива в метод
Здравствуйте! Задался целью написать алгоритм для вычисления определителя матрицы размером 3*3. Попробовал такой код: public...

6
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
22.11.2016, 22:04
Java
1
int moveRight(int[][] map, int x, int y)
функция у тебя принимает три переменных, а передаешь ей ты только массив
Java
1
player.moveRight(map);
Вот так, будет верно : player.moveRight(map, x, y);

Добавлено через 4 минуты
А то что они public означает,что они дотупны,при создании экземпляра класса. Если хочешь их напрямую и спользовать в классе Player, то следует указать им модиaикатор static:
Java
1
public static int X=0;
, и тогда в классе Player они будут доступны вызовом:
Java
1
RealMaze.X;
0
2 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 36
23.11.2016, 11:32  [ТС]
Изменил программу, но все равно выскакивают исключение, которые я не знаю как обработать.

и тогда в классе Player они будут доступны вызовом:
А зачем мне их вызывать, если я их передаю в 55й строчке?

Кликните здесь для просмотра всего текста
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
116
117
118
119
120
121
122
123
124
125
126
127
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
/**
 * В этой программе осуществляется движение по лабиринту.
 * Передвигаться нужно с помощью стрелок.
 */
 
public class RealMaze implements KeyListener {
 
    //Начальные координаты игрока,
    public static int X = 0;
    public static int Y = 0;
 
    JButton button;
    MyDrawPanel myDrawPanel;
    JFrame frame;
    Player player;
 
    public static void main(String[] args) throws Exception {
        RealMaze realMaze = new RealMaze();
        realMaze.go();
    }
 
    public void go()throws Exception {
 
        //Отрисовка окна
 
        frame = new JFrame();
        myDrawPanel = new MyDrawPanel();
        button = new JButton();
        frame.setSize(500, 560);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.CENTER, myDrawPanel);
        frame.getContentPane().add(BorderLayout.SOUTH, button);
        frame.add(new JLabel(new ImageIcon("C:/Users/IP44/Downloads/thinWall2.png")));
        button.addKeyListener(this);
 
    }
 
    @Override
    public void keyTyped(KeyEvent e)   {
 
    }
 
    @Override
    public void keyPressed(KeyEvent e) {
        try {
            int key = e.getKeyCode();
 
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                player.moveRight(map, X, Y);
            }
 
 
            if (map[X][Y] == 0 &&  e.getKeyCode() == KeyEvent.VK_LEFT) {
                X--;
                if (map[X][Y] == 2) {
                    X--;
                }
            }
            if (map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_UP) {
                Y--;
                if (map[X][Y] == 2) {
                    Y--;
                }
            }
            if (map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_DOWN) {
                Y++;
                if (map[X][Y] == 2) {
                    Y++;
                }
            }
            if (map[X][Y] == 1 && e.getKeyCode() == KeyEvent.VK_RIGHT) {
                X--;
            }
            if (map[X][Y] == 1 &&  e.getKeyCode() == KeyEvent.VK_LEFT) {
                X++;
            }
            if (map[X][Y] == 1 && e.getKeyCode() == KeyEvent.VK_UP) {
                Y++;
            }
            if (map[X][Y] == 1 && e.getKeyCode() == KeyEvent.VK_DOWN) {
                Y--;
            }
            frame.repaint();
        } catch (Exception ex) {ex.printStackTrace();}
    }
    @Override
    public void keyReleased(KeyEvent e)   {
    }
 
    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g)   {
            g.setColor(Color.red);
            // Размер стороны квадрата.
            int sideLength = getSideLength();
            // Размер квадрата с учетом размера окна и размера массива.
            g.fillRect(X*sideLength, Y*sideLength, sideLength, sideLength);
            g.setColor(Color.gray);
        }
 
        private int getSideLength()   {
            // Минимальная сторона компоненты.
            int minComponentSide = (this.getHeight() > this.getWidth())  ? this.getWidth() : this.getHeight();
            // Максимальная сторона карты.
            int maxMapSide = (map.length > map[0].length) ? map.length : map[0].length;
            // Длина стороны, чтобы карта уместилась и комнаты были квадратные.
            return minComponentSide / maxMapSide;
        }
    }
 
    //Карта передвижения, 1 - стена, 2 - тонкая стена
    int[][] map = new int[][]{
            {0,0,2,0,0,0,0}, //x
            {0,0,2,0,0,0,0}, //|
            {0,0,1,0,0,0,0}, //|
            {0,0,1,1,2,2,2}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}  //|
            // - - - - - y
    };
}



Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Player {
 
    int moveRight(int[][] map, int x, int y) {
 
 
        if (map[x][y] == 0) {
            x++;
            if (map[x][y] == 2) {
                x++;
            }
        }
        return map[x][y];
    }
}
0
8 / 8 / 2
Регистрация: 07.03.2013
Сообщений: 85
23.11.2016, 12:13
Цитата Сообщение от Обрел Посмотреть сообщение
А зачем мне их вызывать, если я их передаю в 55й строчке?
Это я тебе для примера написал.

У меня никаких исключений не вылезает, но твоя программа совершенно не работает
0
 Аватар для Alradalion
132 / 126 / 85
Регистрация: 13.09.2013
Сообщений: 485
23.11.2016, 14:27
Первое: написать класс и создать объект - это разные вещи. Вы в своей 55 строке пытаетесь вызвать метод на объекте, который даже не проинициализировали. Где у вас инициализация этого объекта? где строка player=new Player()?
Далее, все же переменные пишут с маленькой буквы.
Ну и еще по поводу строки:
Java
1
player.moveRight(map, X, Y);
Зачем вы вызываете метод, если полученные значения никуда потом не кладете? Или вы думаете, что
Java
1
return map[x][y];
волшебным образом вам все сделает? В этом был бы смысл в связке со статическими переменными. Но тогда продает смысл вообще в выделении этого метода в отдельный класс
0
2 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 36
23.11.2016, 20:10  [ТС]
Цитата Сообщение от DEMONSTR Посмотреть сообщение
У меня никаких исключений не вылезает, но твоя программа совершенно не работает
Странно, должно работать. Проверил в notepad++'e и IDEA. Может из-за того, что у вас нет картинки из 36 строки.
Цитата Сообщение от Alradalion Посмотреть сообщение
где строка player=new Player()?
Да, мне казалось, что я смогу вызвать методы класса и без создания объекта через new в 19 строке. Получается, чтобы вызвать метод moveRight() я должен инициализировать его в любом случае?
Цитата Сообщение от Alradalion Посмотреть сообщение
Зачем вы вызываете метод, если полученные значения никуда потом не кладете?
Мне самому казалось это странным, я думал, раз я вызвал метод и он возвращает значения [x][y], то они сами сравнятся со значением в массиве. Как я могу забрать измененные переменные из метода moveRight().
0
2 / 0 / 1
Регистрация: 22.09.2016
Сообщений: 36
11.12.2016, 16:12  [ТС]
Кликните здесь для просмотра всего текста
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
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
/**
 * В этой программе осуществляется движение по лабиринту.
 * Передвигаться нужно с помощью стрелок.
 */
 
public class RealMaze implements KeyListener {
 
    //Начальные координаты игрока.
 
    public static int X = 0;
    public static int Y = 0;
 
    JFrame frame;
    Player player = new Player();
    MyDrawPanel myDrawPanel = new MyDrawPanel();
 
    public static void main(String[] args) throws Exception {
        RealMaze realMaze = new RealMaze();
        realMaze.go();
    }
 
    public void go()throws Exception {
 
        //Отрисовка окна
 
        frame = new JFrame();
        frame.add(new MyDrawPanel());
        frame.setSize(500, 560);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.CENTER, myDrawPanel);
        frame.add(new JLabel(new ImageIcon("C:/Users/IP44/Downloads/thinWall2.png")));
        frame.addKeyListener(this);
 
    }
 
    //Перемещение по массиву.
 
    @Override
    public void keyPressed(KeyEvent e) {
        try {
            int key = e.getKeyCode();
 
            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                player.moveRight();
 
            }
 
            if (Map.map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_LEFT) {
                X--;
                if (Map.map[X][Y] == 2) {
                    X--;
                }
            }
 
            if (Map.map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_UP) {
                Y--;
                if (Map.map[X][Y] == 2) {
                    Y--;
                }
            }
 
            if (Map.map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_DOWN) {
                Y++;
                if (Map.map[X][Y] == 2) {
                    Y++;
                }
            }
 
            if (Map.map[X][Y] == 0 && e.getKeyCode() == KeyEvent.VK_ESCAPE) {
                System.exit(0);
            }
 
            frame.repaint();
        } catch (Exception ex) {ex.printStackTrace();}
    }
 
    @Override
    public void keyReleased(KeyEvent e)   {
    }
    @Override
    public void keyTyped(KeyEvent e) {
    }
 
    //Перемещение по фрейму.
 
    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g)   {
            g.setColor(Color.red);
            int sideLength = 70;
            g.fillRect(X*70, Y*70, 70, 70);
        }
    }
}


Кликните здесь для просмотра всего текста
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
/**
 * Класс, в который планируется перенести 
 * передвижение игрока.
 */
 
import javax.swing.*;
import java.awt.*;
 
class Player extends JPanel {
 
    JFrame frame = new JFrame();
 
    public static int X = 0;
    public static int Y = 0;
 
 
    public void moveRight() {
        //Перемещение по массиву.
        frame.add(new MyDrawPanel());
 
        if (Map.map[X][Y] == 0) {
            X++;
            if (Map.map[X][Y] == 2) {
                X++;
           }
        }
 
        //Метод вызывается, так как значение X при каждом нажатии увеличивается.
        System.out.println(X);
 
        //Перемещение по фрейму.
        class MyDrawPanel extends JPanel {
            public void paintComponent(Graphics g)   {
                g.setColor(Color.red);
                g.fillRect(X * 70, Y * 70, 70, 70);
            }
        }
    }
}


Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
 * Класс, для хранения карты передвижения.
 */
public class Map {
    static int[][] map = new int[][]{
            {0,0,2,0,0,0,0}, //x
            {0,0,2,0,0,0,0}, //|
            {0,0,1,0,0,0,0}, //|
            {0,0,1,1,2,2,2}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}, //|
            {0,0,0,0,0,0,0}  //|
            // - - - - - y
    };
}


В прошлый раз я пытался передать переменные в метод moveRight() в класс Player и вернуть, но была возникла проблема, нужно было хранить измененные значения.
Сейчас я пытаюсь, вместо этого, вызвать перерисовку сразу в классе Player, но возникла проблема в 19 строчке. Я пытаюсь создать панель для рисования и заново нарисовать квадрат, но с уже новыми координатами.
Вот сама ошибка:
Error:(20, 23) java: cannot find symbol
symbol: class MyDrawPanel
location: class Player
Может стоит обратиться к уже существующей MyDrawPanel в классе RealMaze? Надеюсь на совет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2016, 16:12
Помогаю со студенческими работами здесь

Передача двумерного массива из одного метода в другой метод
Привет Всем! Как тут принято писать: " Java начал изучать не так давно" :) Появился вопрос: как передать значения двумерного массива из...

Передача динамического массива в метод
Добрый день! Есть у меня форма, она разделена визуально на 2 части. В одной части идет работа со статическим массивом, в другой- с...

Передача массива в метод класса
Здравствуйте уважаемые форумчане. Намекните пожалуйста (если можно с примером) как решить следующую проблему: У меня есть двухмерный...

Передача массива в метод класса
Здравствуйте, я не могу понять почему я не выходит передать статический массив в метод класса по указателю. Смтр. строку 54. Объясните...

Передача двухмерного массива в метод
Добрый день. Создаю метод для класса, хочу что бы параметром метода являлся двухмерный массив что то типа: Иван - 1 Андрей - 10 ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru