
- •4.1. Объектное представление программы 6
- •4.3. Потоки 7
- •5.Поэтапная разработка программной системы 7
- •1. Задание
- •2.Уточнение задания
- •3. Описание разрабатываемой программы с точки зрения пользователя
- •4.2. События
- •4.3. Потоки
- •5.Поэтапная разработка программной системы
- •5.3.1. Этап 1. Разработка класса Avto
- •5.3.2. Этап 2. Разработка события ev и уведомления
- •5.3.3. Этап 3. Разработка прикладного и дочернего окон, кнопки добавления шаров.
- •5.3.4. Этап 4. Добавление элемента списка, добавление кнопок остановки и удаления.
- •5.3.5. Этап 5. Добавления события ev.
- •11. Приложение 4. Текст программы на языке Java
11. Приложение 4. Текст программы на языке Java
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
public class Avto extends Observable implements Runnable
{
public int num;
public int x, y;
public double fi = 0.1;
public int dx1, dy1, dx2, dy2;
Thread thr;
public boolean dvig = true, run = true;
boolean life;
public int speed;
public int N() { return num; }
public int X() { return x; }
public int Y() { return y; }
public Avto(int N, int X, int Y, int Speed)
{
num = N;
x = X; y = Y;
speed = Speed;
life = true;
thr = new Thread(this);
thr.start();
}
public void report()
{
setChanged();
notifyObservers();
}
public void Finish()
{
Resume();
life = false;
}
public void run()
{
while (life)
{
if (run)
{
try
{
Thread.sleep(speed);
}
catch (InterruptedException e) { }
if (dvig)
{
x += dx1;
y += dy1;
dx1 = (int)(19 * Math.sin(fi));
dy1 = (int)(19 * Math.cos(fi));
}
else
{
y -= dx2;
x -= dy2;
dx2 = (int)(28 * Math.sin(fi));
dy2 = (int)(28 * Math.cos(fi));
}
fi += 0.1;
report();
}
}
}
public void Suspend()
{
if (run)
{
run = false;
}
}
public void Resume()
{
if (!run)
{
run = true;
}
}
}
public class Autos extends Frame implements Observer, ActionListener, ItemListener
{
public ArrayList al;
private boolean run;
private Frame f;
private Button ok, add;
private int num = 0;
private Random r;
private Choice n;
private Button del;
public Autos()
{
al = new ArrayList();
r = new Random();
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent wE)
{
for (int n = 0; n < al.size(); n++)
{
Avto a = (Avto)al.get(n);
a.Suspend();
}
System.exit(0);
}
});
setTitle("Шоссе");
setLocation(new Point(600, 0));
setBackground(Color.green);
run = true;
f = new Frame();
f.setSize(300, 100);
f.setTitle("Control");
f.setLocation(new Point(150,150));
f.setLayout(new FlowLayout());
ok = new Button("Стоп");
ok.setActionCommand("stop");
ok.addActionListener(this);
f.add(ok);
add = new Button("Add");
add.setActionCommand("ADD");
add.addActionListener(this);
f.add(add);
f.setVisible(true);
del = new Button("Del");
del.setActionCommand("DEL");
del.addActionListener(this);
f.add(del);
n = new Choice();
n.addItemListener(this);
f.add(n);
f.setVisible(true);
}
//обработать уведомдение
public void update(Observable obj, Object arg)
{
repaint();
}
//перерисовать окно
public void paint(Graphics g)
{
g.setColor(Color.gray);
g.fillOval(100, 100, 604, 604);
g.fillOval(175, 175, 450, 450);
g.setColor(Color.white);
g.fillOval(173, 173, 454, 454);
g.setColor(Color.gray);
g.fillOval(175, 175, 450, 450);
g.fillOval(175, 175, 450, 450);
g.setColor(Color.green);
g.fillOval(245, 245, 300, 300);
for (int i = 0; i < al.size(); i++)
{
g.setColor(Color.red);
Avto a = (Avto)al.get(i);
g.fillOval(a.X(), a.Y(), 25, 25);
g.setColor(Color.white);
g.drawString(Integer.toString(a.num), a.X() + 5, a.Y() + 15);
}
boolean crash = false;
for (int i = 0; i < al.size(); i++)
{
Avto a = (Avto)al.get(i);
if (a.life)
for (int j = 0; j < al.size(); j++)
{
Avto a1 = (Avto)al.get(j);
if ((a.num != a1.num) && (Math.abs(a1.x - a.x) < 10) && (Math.abs(a1.y - a.y) < 10))
{
System.out.println("Avto " + a.num + " and " + a1.num + " vrezalis");
crash = true;
a.run = false;
a1.run = false;
try
{
Thread.sleep(400);
}
catch (InterruptedException e) { }
run = true;
a.run = true;
a1.run = true;
if (crash)
{
if ((a.x > a1.x) || (a.y > a1.y))
{
a.x += 2;
a1.x -= 2;
a.y += 2;
a1.y -= 2;
}
else
{
a1.x += 2;
a.x -= 2;
a1.y += 2;
a.y -= 2;
}
System.out.println("Avto " + a.num + " and " + a1.num + " raz'ehalis");
}
}
}
}
}
//выполнить команды для нажатия кнопок
public void actionPerformed(ActionEvent aE)
{
String str = aE.getActionCommand();
if (str.equals("stop"))
{
if (run)
{
run = false;
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
b.Suspend();
}
ok.setLabel("Старт");
}
else
if (!run)
{
run = true;
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
b.Resume();
}
ok.setLabel("Стоп");
}
}
if (str.equals("ADD"))
{
num++;
Avto b;
r = new Random();
if (num % 2 == 0)
{
Avto a = new Avto(num, 385, 666, r.nextInt(100)+50);
System.out.println("Dobavlen avto " + num);
a.dvig = false;
b = a;
}
else
{
Avto a = new Avto(num, 195, 400, r.nextInt(100)+50);
System.out.println("Dobavlen avto " + num);
a.dvig = true;
b = a;
}
b.addObserver(this);
n.addItem(Integer.toString(num));
al.add(b);
}
if (str.equals("DEL") && !al.isEmpty())
{
String st = n.getSelectedItem();
n.remove(st);
int sel = Integer.parseInt(st);
for (int n = 0; n < al.size(); n++)
{
Avto b = (Avto)al.get(n);
if (b.num == sel)
{
b.Finish();
al.remove(n);
}
}
}
repaint();
}
public void itemStateChanged(ItemEvent e)
{
repaint();
}
public static void main(String[] args)
{
Autos auto = new Autos();
auto.setSize(750, 750);
auto.setVisible(true);
}
}