Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 06.03.2019
Сообщений: 82

Многопоточное приложение

25.11.2020, 09:30. Показов 1788. Ответов 8

Студворк — интернет-сервис помощи студентам
Здравствуйте, мое задание звучит так: Футболисты сборной «Спартак» двигаются хаотично со скоростью 0.5V. Хаотичность достигается случайной сменой направления движения раз в N секунд.
Футболисты сборной «ЦСКА» двигаются хаотично со скоростью V. Хаотичность достигается случайной сменой направления движения раз в N1 секунд.
Для смены направления нужны таймеры, по истечению которых сменяется направление? В моем задании потоки заканчивают работу только по нажатию кнопки "Стоп" выходит? Не совсем понимаю, как задать это хаотичное движение
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
package football;
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.lang.Thread.State;
import java.util.Random;
 
 
public class Football implements ActionListener, ChangeListener, ItemListener
{    
    private final JFrame frame;
    private final JButton start, stop;
    private final JCanvasPanel panel1;
    private final JPanel panel2, panel3;
    private final JSlider time1, time2, speed;
 
   
    private final JLabel label1, label2, label3;
    
    private CSKA bluesArray[];
    private View blueView;
   
    
    private Spartak redsArray[];
    private View redView;
    
    
    // Конструктор
    public Football()
    {
        
        this.frame = new JFrame("Пример работы с потоками Java");
        this.start = new JButton("Старт");
        this.stop = new JButton("Стоп");
        this.panel1 = new JCanvasPanel();
        this.panel2 = new JPanel();
        this.panel3 = new JPanel();
        this.time1 = new JSlider();
        this.time2 = new JSlider();
        this.speed = new JSlider();
      
      
        this.label1 = new JLabel("Смена напр. раз в сек(ЦСКА)");
        this.label2 = new JLabel("Смена напр. раз в сек(Спартак)");
        this.label3 = new JLabel("Скорость анимации (пикс/сек)");
        
    }
    
    // Метод подготовки интерфейса
    public void launchFrame()
    {   
        this.label1.setPreferredSize(new Dimension(180, 24));
        this.label1.setFont(new Font("Arial", Font.PLAIN, 12));
        this.label1.setHorizontalAlignment(SwingConstants.CENTER);
        
        this.label2.setPreferredSize(new Dimension(180, 24));
        this.label2.setFont(new Font("Arial", Font.PLAIN, 12));
        this.label2.setHorizontalAlignment(SwingConstants.CENTER);
        
        this.label3.setPreferredSize(new Dimension(180, 24));
        this.label3.setFont(new Font("Arial", Font.PLAIN, 12));
        this.label3.setHorizontalAlignment(SwingConstants.CENTER);
      
         
        this.time1.setPreferredSize(new Dimension(180, 45));
        this.time1.setMinimum(0);
        this.time1.setMaximum(10);
        this.time1.setValue(1);
        this.time1.setMajorTickSpacing(2);
        this.time1.setMinorTickSpacing(1);
        this.time1.setPaintTicks(true);
        this.time1.setPaintLabels(true);
        this.time1.setFont(new Font("Arial", Font.PLAIN, 12));
        this.time1.addChangeListener(this);
       
        this.time2.setPreferredSize(new Dimension(180, 45));
        this.time2.setMinimum(0);
        this.time2.setMaximum(10);
        this.time2.setValue(1);
        this.time2.setMajorTickSpacing(2);
        this.time2.setMinorTickSpacing(1);
        this.time2.setPaintTicks(true);
        this.time2.setPaintLabels(true);
        this.time2.setFont(new Font("Arial", Font.PLAIN, 12));
        this.time2.addChangeListener(this);
        
        this.speed.setPreferredSize(new Dimension(180, 45));
        this.speed.setMinimum(0);
        this.speed.setMaximum(50);
        this.speed.setValue(5);
        this.speed.setMajorTickSpacing(10);
        this.speed.setMinorTickSpacing(2);
        this.speed.setPaintTicks(true);
        this.speed.setPaintLabels(true);
        this.speed.setFont(new Font("Arial", Font.PLAIN, 12));
        this.speed.addChangeListener(this);
        
        this.start.setPreferredSize(new Dimension(80, 30));
        this.start.setFont(new Font("Arial", Font.PLAIN, 12));
        this.start.addActionListener(this);
                
        this.stop.setPreferredSize(new Dimension(80, 30));
        this.stop.setFont(new Font("Arial", Font.PLAIN, 12));
        this.stop.setEnabled(false);
        this.stop.addActionListener(this);
        
       
        
        this.panel1.setBorder(
            BorderFactory.createMatteBorder(1, 0, 0, 0, Color.GRAY));
        this.panel1.setBackground(Color.WHITE);
                
        this.panel3.setPreferredSize(new Dimension(180, 30));
        
        this.panel2.setBorder(
            BorderFactory.createMatteBorder(1, 1, 0, 0, Color.GRAY));
        this.panel2.setPreferredSize(new Dimension(200, -1));
        this.panel2.add(this.label1, BorderLayout.NORTH);
        this.panel2.add(this.time1, BorderLayout.NORTH);
         this.panel2.add(this.label2, BorderLayout.NORTH);
         this.panel2.add(this.time2, BorderLayout.NORTH);
        this.panel2.add(this.label3, BorderLayout.NORTH);
        this.panel2.add(this.speed, BorderLayout.NORTH);
        
        this.panel2.add(this.panel3, BorderLayout.NORTH);
        this.panel2.add(this.start, BorderLayout.NORTH);
        this.panel2.add(this.stop, BorderLayout.NORTH);
        
        this.frame.add(this.panel1, BorderLayout.CENTER);
        this.frame.add(this.panel2, BorderLayout.EAST);
        // Размеры основной формы скорректированы так, чтобы размеры 
        // панели отображения были 800x800
        this.frame.setSize(1006,829);
        this.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.frame.setLocationRelativeTo(null);
        this.frame.setResizable(false);
        this.frame.setVisible(true);
    }
 
    // Метод создания потоков
    public void initThreads()
    {
        final Random r = new Random();
        
        int buyersCount = 11;
        this.bluesArray = new CSKA[buyersCount];
        this.blueView = new View(this.panel1);
        this.redsArray = new Spartak[buyersCount];
        this.redView = new View(this.panel1);
        int n1 = this.time1.getValue()+1;
              int t1=(int) (Math.random()*n1);
              int n2 = this.time2.getValue()+1;
              int t2=(int) (Math.random()*n2);
        // Создаем потоки покупателей
        for (int i=0; i<buyersCount; i++)
        {
            this.bluesArray[i] = new CSKA(i, this);
            
            // Устанавливаем координаты продавца,
            // покупателя, скорость движения
            // тип очереди (вертикально или горизонтально)
          
            this.bluesArray[i].setParam(
                30 + r.nextInt(740), 30 + r.nextInt(740),
               
                this.speed.getValue()
            );
        }
            for (int i=0; i<buyersCount; i++)
        {
            this.redsArray[i] = new Spartak(i, this);
                
            // Устанавливаем координаты продавца,
            // покупателя, скорость движения
            // тип очереди (вертикально или горизонтально)
           
            this.redsArray[i].setParam(
                30 + r.nextInt(740), 30 + r.nextInt(740),
                
                this.speed.getValue()/2
               
            );
        }
        
        this.panel1.setParam(this.bluesArray);
        this.panel1.repaint();
        this.panel1.setParams(this.redsArray);        
        this.panel1.repaint();
    }
 
 
    // Обработчик кнопки Старт
    public void startAll()
    {   
        this.start.setEnabled(false);
        this.stop.setEnabled(true);
        this.speed.setEnabled(false);
        this.time1.setEnabled(false);
        this.time2.setEnabled(false);
       
        // Если потоки один раз уже отработали и кнопка нажата повторно
        // надо пересоздавать потоки
        if (this.blueView.getState() == State.TERMINATED)
            initThreads();
 
        // Запуск потока отображения
        this.blueView.start();
        this.redView.start();
        // Запуск потоков в работу
        int buyersCount = 11;
        for (int i=0; i<buyersCount; i++)
            this.bluesArray[i].start();
        int buyerCount = 11;
        for (int i=0; i<buyerCount; i++)
            this.redsArray[i].start();
    }
    
    public void stopAll()
    {
        this.start.setEnabled(true);
        this.stop.setEnabled(false);
        this.speed.setEnabled(true);
        this.time1.setEnabled(true);
         this.time2.setEnabled(true);
      
    }
    
    // Обработчик кнопок
    @Override
    public void actionPerformed(ActionEvent ae) {
        if (ae.getSource() == this.start)
            this.startAll();
        else
        {
            // Досрочный останов всех потоков
            int buyersCount = 11;
            for (int i=0; i<buyersCount; i++)
                this.bluesArray[i].end();
            
            for (int i=0; i<buyersCount; i++)
                this.redsArray[i].end();
        }
    }
    
    // Обработчик ползунка изменения числа покупателей
    @Override
    public void stateChanged(ChangeEvent ce) {
        this.initThreads();
        
    }
    // Обработчик изменения направления очереди
    @Override
    public void itemStateChanged(ItemEvent ie) {
        this.initThreads();
      
    }
 public static void main(String[] args)
    {
        Football frame = new Football();
        frame.launchFrame();
        frame.initThreads();
        
    }
}
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
package football;
 
 
public class CSKA  extends Thread
{
    private final int num;      // Номер покупателя
    
    private final int w = 32;   // Размеры скина покупателя
    private final int h = 32;
    private final int wp = 800; // Размеры области отображения
    private final int hp = 800;   
    
    private Double x0;          // Координаты начальной точки
    private Double y0;             
    private Double x1;          // Координаты конечной точки
    private Double y1;            
    private Double dx;          // Вектор скорости
    private Double dy;
    
    private final Football parent;  // Ссылка на родительский класс, 
                                // запустивший поток
    private boolean ended;      // Признак завершения потока
    
    public CSKA (int num, Football parent)
    {
        super("CSKA " + (num + 1) + ": ");
        this.num = num + 1;
        this.ended = false;
        this.parent = parent;
    }
    
    // Установка основных параметров
    public void setParam(int x0, int y0, 
                                 int speed)
    {   
        this.x0 = new Double(x0);
        this.y0 = new Double(y0);
        
        
        // Вычисляем смещения в зависимости от направления 
        // движения покупателя и его скорости
 
    }
    
    // Изменяем признак завершения потока
    public void end()
    {
        this.ended = true;
    }
 
    public int getXLeft() {
        return (int)Math.round(this.x0 - this.w / 2.0);
    }
 
    public int getYLeft() {
        return (int)Math.round(this.y0 - this.h / 2.0);
    }
 
    public int getNum() {
        return this.num;
    }
    
    @Override
    public void run() {
        while(true)
        {
            // Если установлен признак завершения потока
            // Прерываем цикл, вместе с ним завершится поток
            if (this.ended == true)
               break;
            
            // Задержка выполнения потока
            try {
                Spartak.sleep(30);
            } catch (InterruptedException ex) {
                System.out.println("Error: " + ex.getMessage());
            }
        }
 
    }
}
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
package football;
 
public class Spartak extends Thread
{
    private final int num;      // Номер покупателя
    
    private final int w = 32;   // Размеры скина покупателя
    private final int h = 32;
    private final int wp = 800; // Размеры области отображения
    private final int hp = 800;   
    
    private Double x0;          // Координаты начальной точки
    private Double y0;             
    private Double x1;          // Координаты конечной точки
    private Double y1;            
    private Double dx;          // Вектор скорости
    private Double dy;
    
    private final Football parent;  // Ссылка на родительский класс, 
                                // запустивший поток
    private boolean ended;      // Признак завершения потока
    
    public Spartak (int num, Football parent)
    {
        super("Spartak " + (num + 1) + ": ");
        this.num = num + 1;
        this.ended = false;
        this.parent = parent;
    }
    
    // Установка основных параметров
    public void setParam(int x0, int y0,
                                 int speed)
    {   
        this.x0 = new Double(x0);
        this.y0 = new Double(y0);
      
       
        
    }
    
    // Изменяем признак завершения потока
    public void end()
    {
        this.ended = true;
    }
 
    public int getXLeft() {
        return (int)Math.round(this.x0 - this.w / 2.0);
    }
 
    public int getYLeft() {
        return (int)Math.round(this.y0 - this.h / 2.0);
    }
 
    public int getNum() {
        return this.num;
    }
    
    @Override
    public void run() {
        while(true)
        {
            // Если установлен признак завершения потока
            // Прерываем цикл, вместе с ним завершится поток
            if (this.ended == true)
               break;
            
            // Задержка выполнения потока
            try {
                Spartak.sleep(30);
            } catch (InterruptedException ex) {
                System.out.println("Error: " + ex.getMessage());
            }
        }
        
 
    }
}
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
package football;
 
import java.awt.*;
import javax.swing.*;
import java.io.IOException;
import javax.imageio.ImageIO;
 
class JCanvasPanel extends JPanel {
    
    private Image cskaImage, spartakImage; 
    private CSKA[] blues;
    private Spartak[] reds;
    private int sellerX;
    private int sellerY;
    
    public JCanvasPanel()
    {
        try {
            this.cskaImage = ImageIO.read(
                this.getClass().getResource("CSKA.png"));
            this.spartakImage = ImageIO.read(
                this.getClass().getResource("Spartak.png"));
        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
        }
    }
 
    public void setParam(CSKA[] blues) {
        this.blues = blues;
        this.sellerX = sellerX - 16;
        this.sellerY = sellerY - 16;
    }
    public void setParams(Spartak[] reds) {
        this.reds = reds;
        this.sellerX = sellerX - 10;
        this.sellerY = sellerY - 10;
    }
    
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        
        // Очистка содержимого
        g.setColor(this.getBackground());
        g.fillRect(0, 0, this.getHeight(), this.getWidth());
        
        // Проход по всем элементам и отрисовка
        g.setFont(g.getFont().deriveFont(Font.BOLD, 9.0f));
        if (this.blues != null)
            for (CSKA blues : this.blues) {
                
                g.drawImage(this.cskaImage,
                    blues.getXLeft(),
                    blues.getYLeft(),
                    null);
                
                g.setColor(Color.WHITE);
                g.drawString(Integer.toString(blues.getNum()),
                    blues.getXLeft() + 9,
                    blues.getYLeft() + 10);
            }
        g.setFont(g.getFont().deriveFont(Font.BOLD, 9.0f));
        if (this.reds != null)
            for (Spartak reds : this.reds) {
                
                g.drawImage(this.spartakImage,
                    reds.getXLeft(),
                    reds.getYLeft(),
                    null);
                
                g.setColor(Color.WHITE);
                g.drawString(Integer.toString(reds.getNum()),
                    reds.getXLeft() + 9,
                    reds.getYLeft() + 10);
            }
    }
 
    
}
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
package football;
 
import javax.swing.JPanel;
 
// Вспомогательный класс,
// представляет собой отдельный поток, используемый для отображения
// покупателей
public class View extends Thread {
    
    private boolean ended;       // Признак завершения потока
    private final JPanel panel;  // Панель, которую будем перерисовывать     
    
    // Конструктор
    public View(JPanel panel) {
        this.panel = panel;
        this.ended = false;
        // Для потока, отвечающего за отображение,
        // устанавливаем максимальный приоритет и как можно меньшее
        // время перерисовки, иначе возможно моргание анимации
        this.setPriority(Thread.MAX_PRIORITY);
    }
    
    // Изменяем признак завершения потока
    public void end()
    {
        this.ended = true;
    }
    
    @Override
    public void run() {
        while(true)
        {
            // Если установлен признак завершения потока
            // Прерываем цикл, вместе с ним завершится поток
            if (this.ended == true)
               break;
            // Перерисовка панели
            this.panel.repaint();
            // Задержка выполнения потока
            try {
                View.sleep(10);
            } catch (InterruptedException ex) {
                System.out.println("Error: " + ex.getMessage());
            }
        }
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2020, 09:30
Ответы с готовыми решениями:

Разработать многопоточное консольное приложение на языке программирования Java
Имеется склад с тремя воротами: для маленьких (3 тонны), средних (5 тонн) и больших (15 тонн) грузовиков. Всего надо вывести 186 т. груза....

Многопоточное перемножение матрицы
Написал класс ParallelMatrixProduct, встроенный в класс UsualMatrix для вычисления произведения несколькими потоками. Класс работает, но...

Многопоточное умножение матрицы FixedThreadPool
Есть задача умножить две матрицы в могопоточном режиме используя FixedThreadPool. Я создал класс AllTask в котором есть очередь(тут сразу...

8
25.11.2020, 11:33

Не по теме:

Цитата Сообщение от and2001 Посмотреть сообщение
Футболисты сборной «Спартак» двигаются хаотично…
Футболисты сборной «ЦСКА» двигаются хаотично…
Типичный российский футбол…

0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
25.11.2020, 15:35
Лучший ответ Сообщение было отмечено and2001 как решение

Решение

Цитата Сообщение от and2001 Посмотреть сообщение
// время перерисовки, иначе возможно моргание анимации
это такая дичь хоть 3 часа делайте ничего мигать не будет.

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
public class Foot
{
    public JFrame win;
    public JLayeredPane swap;
    public JLabel[][] jl; 
    public double[][][] bs;
    
    
    public Foot()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Оле оле");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        jl = new JLabel[2][5];
        bs = new double[2][5][5];
        int[][] color = {{125,125,125},{15,145,255}};
 
        for (int i = 0; i < jl.length; i++)
        {
            for (int e = 0; e < jl[0].length; e++)
            {
                bs[i][e][0] = new Random().nextInt(750);//координата х
                bs[i][e][1] = new Random().nextInt(550);//координата y
                bs[i][e][2] = new Random().nextInt(750);//координата x для точки следования
                bs[i][e][3] = new Random().nextInt(550);//координата y для точки следования
                bs[i][e][4] = 3;//базовая скорость
                
                jl[i][e] = new JLabel();
                jl[i][e].setBounds(
                        (int)bs[i][e][0],
                        (int)bs[i][e][1],
                        50, 50);
                jl[i][e].setLayout(null);
                jl[i][e].setOpaque(true);
                make_Icon(jl[i][e], new int[]{color[i][0],color[i][1],color[i][2]});
                jl[i][e].setVisible(true);
                swap.add(jl[i][e], new Integer(0), 0);
            }
        }
    }
    
    
    private void make_Icon(JLabel jl, int[] c)
    {
        BufferedImage bf = new BufferedImage(jl.getWidth(), jl.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(new Color(c[0], c[1], c[2]));
        g.fillRect(0, 0, jl.getWidth(), jl.getHeight());
        g.drawImage(bf, 0, 0, null);
        g.dispose();
        bf.flush();
        
        jl.setIcon(new ImageIcon(bf));
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int e = 0; e < jl[0].length; e++)
                    {
                        bs[i][e][0] = bs[i][e][0] - (bs[i][e][4]*i+bs[i][e][4]) * Math.cos(
                                (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                (Math.PI/180));
                        bs[i][e][1] = bs[i][e][1] - (bs[i][e][4]*i+bs[i][e][4]) * Math.sin(
                                (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                (Math.PI/180));
                        
                        if (
                                bs[i][e][0] + 5 > bs[i][e][2] && 
                                bs[i][e][0] < bs[i][e][2] + 5 &&
                                bs[i][e][1] < bs[i][e][3] + 5 &&
                                bs[i][e][1] + 5 > bs[i][e][3]
                            )
                        {
                            bs[i][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[i][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        
                        jl[i][e].setLocation((int)bs[i][e][0], (int)bs[i][e][1]);
                    }
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Foot();
    }
}
Добавлено через 16 минут
Не доглядел что направление по счетчику менять хотите а не по достижении точки, счетчик так счетчик

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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
public class Foot
{
    public JFrame win;
    public JLayeredPane swap;
    public JLabel[][] jl; 
    public double[][][] bs;
    
    
    public Foot()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Оле оле");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        jl = new JLabel[2][5];
        bs = new double[2][5][5];
        int[][] color = {{125,125,125},{15,145,255}};
 
        for (int i = 0; i < jl.length; i++)
        {
            for (int e = 0; e < jl[0].length; e++)
            {
                bs[i][e][0] = new Random().nextInt(750);//координата х
                bs[i][e][1] = new Random().nextInt(550);//координата y
                bs[i][e][2] = new Random().nextInt(750);//координата x для точки следования
                bs[i][e][3] = new Random().nextInt(550);//координата y для точки следования
                bs[i][e][4] = 3;//базовая скорость
                
                jl[i][e] = new JLabel();
                jl[i][e].setBounds(
                        (int)bs[i][e][0],
                        (int)bs[i][e][1],
                        50, 50);
                jl[i][e].setLayout(null);
                jl[i][e].setOpaque(true);
                make_Icon(jl[i][e], new int[]{color[i][0],color[i][1],color[i][2]});
                jl[i][e].setVisible(true);
                swap.add(jl[i][e], new Integer(0), 0);
            }
        }
    }
    
    
    private void make_Icon(JLabel jl, int[] c)
    {
        BufferedImage bf = new BufferedImage(jl.getWidth(), jl.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(new Color(c[0], c[1], c[2]));
        g.fillRect(0, 0, jl.getWidth(), jl.getHeight());
        g.drawImage(bf, 0, 0, null);
        g.dispose();
        bf.flush();
        
        jl.setIcon(new ImageIcon(bf));
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        int t = 0;
        int r = 150;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int e = 0; e < jl[0].length; e++)
                    {
                        if (
                                !(bs[i][e][0] + 5 > bs[i][e][2] && 
                                bs[i][e][0] < bs[i][e][2] + 5 &&
                                bs[i][e][1] < bs[i][e][3] + 5 &&
                                bs[i][e][1] + 5 > bs[i][e][3])
                            )
                        {
                            bs[i][e][0] = bs[i][e][0] - (bs[i][e][4]*i+bs[i][e][4]) * Math.cos(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                            bs[i][e][1] = bs[i][e][1] - (bs[i][e][4]*i+bs[i][e][4]) * Math.sin(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                        }
                        
                        if (t == r)
                        {
                            bs[i][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[i][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        
                        jl[i][e].setLocation((int)bs[i][e][0], (int)bs[i][e][1]);
                    }
                }
                
                if (t < r)
                {
                    t++;
                }
                else
                {
                    t = 0;
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Foot();
    }
}
Добавлено через 36 минут
ну и если для каждой команды свой счетчик то замените на это
Java
1
2
3
4
5
6
7
8
9
10
if (t == r)
                        {
                            bs[0][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[0][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        else if (t == r/2)
                        {
                            bs[1][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[1][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
1
1 / 1 / 0
Регистрация: 06.03.2019
Сообщений: 82
25.11.2020, 21:43  [ТС]
Nidl, огромное спасибо за ответ, можно еще один вопрос? Как правильно к значению скорости слайдер?
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
25.11.2020, 22:22
Если не сильно заморачиватся то добавить просто
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
 
 
public class Foot
{
    public JFrame win;
    public JLayeredPane swap;
    public JSlider slider;
    public JLabel[][] jl; 
    public double[][][] bs;
    
    
    public Foot()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Оле оле");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        jl = new JLabel[2][5];
        bs = new double[2][5][5];
        int[][] color = {{125,125,125},{15,145,255}};
 
        for (int i = 0; i < jl.length; i++)
        {
            for (int e = 0; e < jl[0].length; e++)
            {
                bs[i][e][0] = new Random().nextInt(750);//координата х
                bs[i][e][1] = new Random().nextInt(550);//координата y
                bs[i][e][2] = new Random().nextInt(750);//координата x для точки следования
                bs[i][e][3] = new Random().nextInt(550);//координата y для точки следования
                //bs[i][e][4] = 3;//базовая скорость
                
                jl[i][e] = new JLabel();
                jl[i][e].setBounds(
                        (int)bs[i][e][0],
                        (int)bs[i][e][1],
                        50, 50);
                jl[i][e].setLayout(null);
                jl[i][e].setOpaque(true);
                make_Icon(jl[i][e], new int[]{color[i][0],color[i][1],color[i][2]});
                jl[i][e].setVisible(true);
                swap.add(jl[i][e], new Integer(0), 0);
            }
        }
        //
        slider = new JSlider(JSlider.HORIZONTAL, 1, 5, 1);
        slider.setBounds(600, 530, 170, 50);
        slider.setMajorTickSpacing(2);
        slider.setMinorTickSpacing(1);
        slider.setPaintTicks(true);
        slider.setPaintLabels(true);
        slider.setOpaque(false);
        swap.add(slider, new Integer(1), 0);    
    }
    
    
    private void make_Icon(JLabel jl, int[] c)
    {
        BufferedImage bf = new BufferedImage(jl.getWidth(), jl.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(new Color(c[0], c[1], c[2]));
        g.fillRect(0, 0, jl.getWidth(), jl.getHeight());
        g.drawImage(bf, 0, 0, null);
        g.dispose();
        bf.flush();
        
        jl.setIcon(new ImageIcon(bf));
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        int t = 0;
        int r = 150;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int e = 0; e < jl[0].length; e++)
                    {
                        if (
                                !(bs[i][e][0] + slider.getValue() > bs[i][e][2] && 
                                bs[i][e][0] < bs[i][e][2] + slider.getValue() &&
                                bs[i][e][1] < bs[i][e][3] + slider.getValue() &&
                                bs[i][e][1] + slider.getValue() > bs[i][e][3])
                            )
                        {
                            bs[i][e][0] = bs[i][e][0] - (slider.getValue()*i+slider.getValue()) * Math.cos(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                            bs[i][e][1] = bs[i][e][1] - (slider.getValue()*i+slider.getValue()) * Math.sin(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                        }
                        
                        if (t == r)
                        {
                            bs[0][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[0][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        else if (t == r/2)
                        {
                            bs[1][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[1][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        
                        jl[i][e].setLocation((int)bs[i][e][0], (int)bs[i][e][1]);
                    }
                }
                
                if (t < r)
                {
                    t++;
                }
                else
                {
                    t = 0;
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Foot();
    }
}
1
1 / 1 / 0
Регистрация: 06.03.2019
Сообщений: 82
26.11.2020, 00:32  [ТС]
Nidl, еще один вопрос(надеюсь последний), можно ли количесво "игроков" изменить во время выполнения? В полном задании сказано о возможности менять количество потоков. Сделал слайдер для них тоже, но количество берет начальное значение. Это же тогда нужно останавливать все потоки, настраивать количество и заново запускать?(кнопки начала и конца моделирования, как сказано в задании)
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
26.11.2020, 10:34
Поток не надо останавливать, он сама пульсация жизни в этом коде. Здесь есть 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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
 
public class Foot
{
    public JFrame win;
    public JLayeredPane swap;
    public JSlider[] slider;
    public JLabel[][] jl; 
    public double[][][] bs;
    
    
    public Foot()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Оле оле");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        int[][] dt = {{600, 530, 170, 70, 5, 2}, {600, 460, 170, 70, 15, 5}}; 
        String[] str = {"Speed", "Numbers"};
        slider = new JSlider[2];
        for (int i = 0; i < slider.length; i++)
        {
            slider[i] = new JSlider(JSlider.HORIZONTAL, 1, dt[i][4], 1);
            slider[i].setBounds(dt[i][0], dt[i][1], dt[i][2], dt[i][3]);
            slider[i].setMajorTickSpacing(2);
            slider[i].setMinorTickSpacing(1);
            slider[i].setPaintTicks(true);
            slider[i].setPaintLabels(true);
            slider[i].setValue(dt[i][5]);
            slider[i].setBorder(BorderFactory.createTitledBorder(str[i]));
            slider[i].setOpaque(false);
            swap.add(slider[i], new Integer(1), 0);
        }
        
        slider[1].addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent e)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int j = 0; j < ((JSlider) e.getSource()).getValue(); j++)
                    {
                        jl[i][j].setVisible(true);
                    }
                    for (int j = ((JSlider) e.getSource()).getValue(); j < jl[0].length; j++)
                    {
                        jl[i][j].setVisible(false);
                    }
                }
            }
        });
        //
        jl = new JLabel[2][15];
        bs = new double[jl.length][jl[0].length][5];
        int[][] color = {{125,125,125},{15,145,255}};
 
        for (int i = 0; i < jl.length; i++)
        {
            for (int e = 0; e < jl[0].length; e++)
            {
                bs[i][e][0] = new Random().nextInt(750);//координата х
                bs[i][e][1] = new Random().nextInt(550);//координата y
                bs[i][e][2] = new Random().nextInt(750);//координата x для точки следования
                bs[i][e][3] = new Random().nextInt(550);//координата y для точки следования
                //bs[i][e][4] = 3;//базовая скорость
                
                jl[i][e] = new JLabel();
                jl[i][e].setBounds(
                        (int)bs[i][e][0],
                        (int)bs[i][e][1],
                        50, 50);
                jl[i][e].setLayout(null);
                jl[i][e].setOpaque(false);
                make_Icon(jl[i][e], new int[]{color[i][0],color[i][1],color[i][2]});
                if (slider[1].getValue() < e + 1) jl[i][e].setVisible(false);
                swap.add(jl[i][e], new Integer(0), 0);
            }
        }
    }
    
    
    private void make_Icon(JLabel jl, int[] c)
    {
        BufferedImage bf = new BufferedImage(jl.getWidth(), jl.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(new Color(c[0], c[1], c[2]));
        g.fillRect(0, 0, jl.getWidth(), jl.getHeight());
        g.drawImage(bf, 0, 0, null);
        g.dispose();
        bf.flush();
        
        jl.setIcon(new ImageIcon(bf));
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        int t = 0;
        int r = 150;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int e = 0; e < jl[0].length; e++)
                    {
                        if (
                                !(bs[i][e][0] + slider[0].getValue() > bs[i][e][2] && 
                                bs[i][e][0] < bs[i][e][2] + slider[0].getValue() &&
                                bs[i][e][1] < bs[i][e][3] + slider[0].getValue() &&
                                bs[i][e][1] + slider[0].getValue() > bs[i][e][3])
                            )
                        {
                            bs[i][e][0] = bs[i][e][0] - (slider[0].getValue()*i+slider[0].getValue()) * Math.cos(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                            bs[i][e][1] = bs[i][e][1] - (slider[0].getValue()*i+slider[0].getValue()) * Math.sin(
                                    (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                    (Math.PI/180));
                        }
                        
                        if (t == r)
                        {
                            bs[0][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[0][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                        else if (t == r/2)
                        {
                            bs[1][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                            bs[1][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                        }
                            
                        if (jl[i][e].isVisible()) jl[i][e].setLocation((int)bs[i][e][0], (int)bs[i][e][1]);
                    }
                }
                
                if (t < r)
                {
                    t++;
                }
                else
                {
                    t = 0;
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Foot();
    }
}
Добавлено через 14 минут
ну и вот вам еще с кнопочкой паузы
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
 
 
public class Foot
{
    public JFrame win;
    public JLayeredPane swap;
    public JSlider[] slider;
    public JLabel[][] jl; 
    public double[][][] bs;
    public boolean pause = true;
    
    
    public Foot()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Оле оле");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        JButton bt = new JButton();
        bt.addActionListener(new ActionListener()
        {
            int i = 1;
            
            
            public void actionPerformed(ActionEvent e)
            { 
                i *= -1;
                if (i == 1)
                {
                    pause = true;
                    ((JButton) e.getSource()).setText("Игра");
                }
                else
                {
                    pause = false;
                    ((JButton) e.getSource()).setText("Стоп");
                }
            }
        });
        bt.addMouseListener(new MouseListener()
        {
            public void mouseClicked(MouseEvent e){}
            public void mouseEntered(MouseEvent e){}
            public void mouseExited(MouseEvent e){}
            public void mousePressed(MouseEvent e){}
            public void mouseReleased(MouseEvent e){}
        });
        bt.setText("Игра");
        bt.setBounds(670, 10, 100, 50);
        bt.setMargin(new Insets(0,0,0,0));
        bt.setHorizontalTextPosition(SwingConstants.CENTER);
        bt.setForeground(Color.BLACK);
        bt.setOpaque(false);
        bt.setContentAreaFilled(true);
        bt.setBorderPainted(true);
        bt.setFocusPainted(false);
        bt.setLayout(null);
        swap.add(bt, new Integer(1), 0);
        //
        int[][] dt = {{600, 530, 170, 70, 5, 2}, {600, 460, 170, 70, 15, 5}}; 
        String[] str = {"Speed", "Numbers"};
        slider = new JSlider[2];
        for (int i = 0; i < slider.length; i++)
        {
            slider[i] = new JSlider(JSlider.HORIZONTAL, 1, dt[i][4], 1);
            slider[i].setBounds(dt[i][0], dt[i][1], dt[i][2], dt[i][3]);
            slider[i].setMajorTickSpacing(2);
            slider[i].setMinorTickSpacing(1);
            slider[i].setPaintTicks(true);
            slider[i].setPaintLabels(true);
            slider[i].setValue(dt[i][5]);
            slider[i].setBorder(BorderFactory.createTitledBorder(str[i]));
            slider[i].setOpaque(false);
            swap.add(slider[i], new Integer(1), 0);
        }
        
        slider[1].addChangeListener(new ChangeListener()
        {
            public void stateChanged(ChangeEvent e)
            {
                for (int i = 0; i < jl.length; i++)
                {
                    for (int j = 0; j < ((JSlider) e.getSource()).getValue(); j++)
                    {
                        jl[i][j].setVisible(true);
                    }
                    for (int j = ((JSlider) e.getSource()).getValue(); j < jl[0].length; j++)
                    {
                        jl[i][j].setVisible(false);
                    }
                }
            }
        });
        //
        jl = new JLabel[2][15];
        bs = new double[jl.length][jl[0].length][5];
        int[][] color = {{125,125,125},{15,145,255}};
 
        for (int i = 0; i < jl.length; i++)
        {
            for (int e = 0; e < jl[0].length; e++)
            {
                bs[i][e][0] = new Random().nextInt(750);//координата х
                bs[i][e][1] = new Random().nextInt(550);//координата y
                bs[i][e][2] = new Random().nextInt(750);//координата x для точки следования
                bs[i][e][3] = new Random().nextInt(550);//координата y для точки следования
                //bs[i][e][4] = 3;//базовая скорость
                
                jl[i][e] = new JLabel();
                jl[i][e].setBounds(
                        (int)bs[i][e][0],
                        (int)bs[i][e][1],
                        50, 50);
                jl[i][e].setLayout(null);
                jl[i][e].setOpaque(false);
                make_Icon(jl[i][e], new int[]{color[i][0],color[i][1],color[i][2]});
                if (slider[1].getValue() < e + 1) jl[i][e].setVisible(false);
                swap.add(jl[i][e], new Integer(0), 0);
            }
        }
    }
    
    
    private void make_Icon(JLabel jl, int[] c)
    {
        BufferedImage bf = new BufferedImage(jl.getWidth(), jl.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(new Color(c[0], c[1], c[2]));
        g.fillRect(0, 0, jl.getWidth(), jl.getHeight());
        g.drawImage(bf, 0, 0, null);
        g.dispose();
        bf.flush();
        
        jl.setIcon(new ImageIcon(bf));
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        int t = 0;
        int r = 150;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                if (pause)
                {
                    for (int i = 0; i < jl.length; i++)
                    {
                        for (int e = 0; e < jl[0].length; e++)
                        {
                            if (
                                    !(bs[i][e][0] + slider[0].getValue() > bs[i][e][2] && 
                                    bs[i][e][0] < bs[i][e][2] + slider[0].getValue() &&
                                    bs[i][e][1] < bs[i][e][3] + slider[0].getValue() &&
                                    bs[i][e][1] + slider[0].getValue() > bs[i][e][3])
                                )
                            {
                                bs[i][e][0] = bs[i][e][0] - (slider[0].getValue()*i+slider[0].getValue()) * Math.cos(
                                        (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                        (Math.PI/180));
                                bs[i][e][1] = bs[i][e][1] - (slider[0].getValue()*i+slider[0].getValue()) * Math.sin(
                                        (-Math.atan2(bs[i][e][0] - bs[i][e][2], bs[i][e][1] - bs[i][e][3]) / (Math.PI/180) + 90) * 
                                        (Math.PI/180));
                            }
                            
                            if (t == r)
                            {
                                bs[0][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                                bs[0][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                            }
                            else if (t == r/2)
                            {
                                bs[1][e][2] = ThreadLocalRandom.current().nextInt(0, 750);
                                bs[1][e][3] = ThreadLocalRandom.current().nextInt(0, 550);
                            }
                                
                            if (jl[i][e].isVisible()) jl[i][e].setLocation((int)bs[i][e][0], (int)bs[i][e][1]);
                        }
                    }
                    
                    if (t < r)
                    {
                        t++;
                    }
                    else
                    {
                        t = 0;
                    }
                }
                
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e)
                {
                    //...
                }
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Foot();
    }
}
1
0 / 0 / 0
Регистрация: 01.04.2020
Сообщений: 13
26.11.2020, 15:54
Nidl, А можете подсказать, пожалуйста. Задание звучит так:Треугольник лежит внизу формы приложения. Изобразить подпрыгивание треугольника по нажатию кнопки. При нажатии кнопки остановки треугольник должен остановиться внизу, в исходной позиции.

Не могу разобраться, как реализовать сброс координат треугольника по кнопке "Стоп"
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 sample;
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import  java.awt.event.ActionListener;
import java.awt.geom.*;
 
public class Main extends JPanel implements Runnable {
    int dia = 30;
    long delay = 40;
    private int x1=50,x2=70,x3=90;
    private int y1=500,y2=400,y3=500;
    private int dx = 5;
    private int dy = 10;
    private boolean isRunning;
 
    protected void paintComponent(Graphics g){
        super.paintComponent(g);
        Color c = new Color(60,150,120);
        Color c1 = new Color(50,170,80);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(c);
        g2.drawPolygon( new int[]{x1,x2,x3}, new int[] {y1,y2,y3},3);
        g2.fillPolygon(new int[]{x1,x2,x3}, new int[] {y1,y2,y3},3);
        g2.setColor(c1);
    }
 
    public void run() {
        while(isVisible()) {
            try {
                Thread.sleep(delay);
            } catch(InterruptedException e) {
                System.out.println("interrupted");
            }
            move();
            repaint();
        }
    }
 
    public void move() {
        if (isRunning) {
            if(x1+dx<0 || x2+dx<0 || x3 +dx<0 ||  x1 + dia + dx > getWidth() || x2 + dia + dx > getWidth() || x3 + dia + dx > getWidth()){
                dx *= -1;
            }
            if(y1+dy<0 || y2+dy<0 || y3 +dy<0 ||  y1 + dia + dy > getHeight() || y2 + dia + dy > getHeight() || y3 + dia + dy > getHeight()) {
                dy *= -1;
            }
            x1 += dx;
            x2 += dx;
            x3 += dx;
            y1 += dy;
            y2 += dy;
            y3 += dy;
        }
    }
    private void start() {
 
        while(!isVisible()) {
            try {
                Thread.sleep(25);
            } catch(InterruptedException e) {
                System.exit(1);
            }
        }
        Thread thread = new Thread(this);
        thread.setPriority(Thread.NORM_PRIORITY);
        thread.start();
    }
 
    public static void main(String[] args) {
 
        EventQueue.invokeLater(new Runnable() {
 
            @Override
            public void run() {
                final Main test = new Main();
                JFrame f = new JFrame();
 
                JButton start = new JButton("start");
                start.addActionListener(new ActionListener() {
 
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        test.isRunning = true;
                    }
                });
 
                JButton stop = new JButton("stop");
                stop.addActionListener(new ActionListener() {
 
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        test.isRunning = false;
                    }
                });
 
                JPanel panel = new JPanel();
                panel.add(start);
                panel.add(stop);
 
                f.add(panel, java.awt.BorderLayout.NORTH);
                f.getContentPane().add(test);
 
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setSize(new Dimension(600, 600));
                f.setLocationRelativeTo(null);
                f.setVisible(true);
                test.start();
            }
 
        });
    }
}
0
296 / 149 / 67
Регистрация: 22.02.2017
Сообщений: 592
27.11.2020, 08:55
bog1,
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
 
 
 
public class Spin
{
    public JLayeredPane swap;
    public JLabel jl;
    public int y = 500;
    public boolean flag = false;
        
    
    public Spin()
    {
        makeWindow();
        makeElement();
        new WorkerThread(); 
    }
    
    
    private void makeWindow()
    {
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(800, 600));
        panel.setOpaque(false);
        
        JFrame win = new JFrame("Прыгун");
        swap = new JLayeredPane();
        swap = win.getLayeredPane();
        win.add(panel);
        win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        win.setResizable(false);
        win.getContentPane().setBackground(Color.WHITE);
        win.pack();
        win.setLayout(null);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }
    
    
    private void makeElement()
    {
        jl = new JLabel();
        jl.setBounds(350, y, 100, 100);
        jl.setLayout(null);
        jl.setOpaque(false);
        jl.setVisible(true);
        swap.add(jl, new Integer(0), 0);
        makeLine(jl);
        //
        JButton bt = new JButton();
        bt.setBounds(0,0,90,30);
        bt.setText("Поехали");
        bt.setOpaque(true);
        bt.setContentAreaFilled(true);
        bt.setBorderPainted(true);
        bt.setFocusPainted(true);
        bt.setLayout(null);
        bt.setFocusable(false);
        bt.setVisible(true);
        bt.addActionListener(new ActionListener()
        {   
            int i = -1;
            public void actionPerformed(ActionEvent e)
            {
                i *= -1;
                if (i == 1)
                {
                    flag = true;
                    ((JButton) e.getSource()).setForeground(Color.WHITE);
                }
                else
                {
                    flag = false;
                    ((JButton) e.getSource()).setForeground(Color.BLACK);
                }
            }
        });
        swap.add(bt, new Integer(0), 10);
    }
    
    
    private void makeLine(JLabel j)
    {
        BufferedImage bf = new BufferedImage(j.getWidth(), j.getHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics g = bf.createGraphics();
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.setRenderingHint(RenderingHints.KEY_RENDERING,
                RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, 
                RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB);
        g2.setColor(new Color(124,255,80));
        g2.fill(new Polygon(new int[] {0, 50, 100}, new int[] {100, 0, 100}, 3));
        g2.dispose();
        bf.flush();
        
        j.setIcon(new ImageIcon(bf));
        j.repaint();
    }
    
    
    class WorkerThread extends Thread
    {
        int fps = 15;
        int v = 0;
        boolean r;
        boolean run;
        
        
        public WorkerThread()
        {
            setDaemon(true); 
            start();
        }
 
        
        public void run()
        {
            while (true)
            {
                if (v == 0)
                {
                    if (flag)
                    {
                        run = true;
                    }
                    else
                    if (!flag)
                    {
                        run = false;
                    }
                }
                //
                if (run)
                {
                    switch(v)
                    {
                        case 0:
                            r = true;
                        break;  
                        case 150:
                            r = false;
                        break;
                        case 300:
                            v = -1;
                        break;
                    }
                    v++;
                    
                    if (r)
                    {
                        y--;
                    }
                    else
                    {
                        y++;
                    }
                
                    jl.setLocation(jl.getX(), y);
                }
 
                try
                {
                    sleep(fps);
                }
                catch (InterruptedException e){}
            }
        }
    }
    
    
    public static void main(String[] args)
    {
        new Spin();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.11.2020, 08:55
Помогаю со студенческими работами здесь

Многопоточное приложение
Возник вопрос по поводу работы с паралельно запускающимися потоками. Есть ли метод который бы четко задавал работу одного потока? Типа...

Спроектировать многопоточное приложение
Привет. Есть задача: дано довольно большое (порядко нескольких сотен тысяч или даже несколько миллионов) сетевых адресов (URL), каждый из...

Реализовать многопоточное приложение, реализующее поиск подстроки в файлах
Помогите написать программу, нужна помощь! С комментариями в коде пожалуйста. Реализовать многопоточное приложение, реализующее...

Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent
Разработать многопоточное приложение. Использовать возможности, предоставляемые пакетом java.util.concurrent. Не использовать слово...

Многопоточное приложение на Java (Java Thread)
Дано было такое задание: Выполнить приложение командной строки с двумя параметрами , один из которых – количество потоков, другой...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
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 Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru