здравствуйте. есть прога (работает, НО), моделирующая движущегося робота, который натыкается "лучом" на препятствие и строит "свое виденье" его расположения. НО нужно добавить парочку моментов, которые я не очень понимаю, как сделать: 1) движение робота здесь автоматическое, а надо сделать чтобы пользователь мог с клавы управлять им (как в игре, передвижение, повороты) 2)сделать несколько рандомных препятствий, и чтоб робот динамически строил их расположение как только луч наткнется на них
Код:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Game extends JPanel {
static final int Win_length = 1200;
static final int Win_width = 800;
static int rob_prime_x = 50; // Координата нулевой точки оси x системы координат, связанной с роботом в мировой системе координат
static int rob_prime_y = 300; // Координата нулевой точки оси y СКР в МСК
static int rob_body_x = 0; // Координата X левого верхнего угла корпуса робота в МСК
static int rob_body_y = 0; // Координата Y левого верхнего угла корпуса робота в МСК
static int rob_body_width = 50; // ширина робота
static int rob_body_length = 100; // длина робота
static int obst_body_x;//координата препятствия
static int obst_body_y = 50;
static int obst_lenght;
static int scan_body_lenght = 30;// длина сканера
static int scan_body_weight = 30;// ширина сканера
static int sensor_position_rob_x = 5;// позиция сканера относительно робота по Х
static int sensor_position_rob_y = -40;// позиция сканера относительно робота по У
static int sensor_position_world_x ;// положение сканера в мире п Х
static int sensor_position_world_y ;// положение сканера в мире п У
static int wave_lenght = 190;// длина испускаемого луча
static int wave_weight = scan_body_weight;// ширина луча
static int wave_position_scan_x;// положение луча относительно сканера по Х
static int wave_position_scan_y;// положение луча относительно сканера по У
static int calc_obst_beg ; //координата начала препятствия
static int calc_obst_end ; //координата конца преп
static int calc_obst_lenght ; // длина реал преп
static int robVision_obst_x = 0 ;//положение преп, как видит робот по Х
static int robVision_obst_y = 0; // по У не учит
static int robVision_obst_lenght = 0;
Game() {
do
{ // чтобы препятствие не пересекало границу
obst_body_x = (int) Math.round((300 + Math.random() * 600 ));
obst_lenght = (int) Math.round(100+(Math.random() * 250) );
}
while (!(obst_body_x + obst_lenght < Win_length - 150)); // "Кривое решение". Просто прописывается координата, за которую препятствие не может заступать
}
private void moveRobot() { // начало координат находится в центре корпуса
rob_prime_x = rob_prime_x + 1; // изменение координаты x центра
rob_body_x = rob_prime_x - (rob_body_length / 2); // вычисление ЛВУ по x относительно центра
//rob_prime_y = rob_prime_y + 1; // изменение координаты y центра
rob_body_y = rob_prime_y - (rob_body_width / 2); // вычисление ЛВУ по y относительно центра
sensor_position_world_x = rob_prime_x + sensor_position_rob_x - (scan_body_lenght/2); // вычисление положения датчика относительно мира по Х
sensor_position_world_y = rob_prime_y + sensor_position_rob_y - (scan_body_weight/2); // по У
wave_position_scan_x = sensor_position_world_x; // привязка ИК-волны к датчику
wave_position_scan_y = sensor_position_rob_y + 95;
// ИИ вычисление координат преп
if (wave_position_scan_x == obst_body_x) { //
calc_obst_beg = rob_prime_x;
}
else if (wave_position_scan_x <= obst_body_x + obst_lenght) { // координата конца увеличивается до нахождения правой грани
calc_obst_end = rob_prime_x;
}
calc_obst_lenght = calc_obst_end - calc_obst_beg; // вычисляем длину преп
// виденье робота для проверки
robVision_obst_x = calc_obst_beg - scan_body_lenght/2;
robVision_obst_y = calc_obst_end - scan_body_lenght/2;
robVision_obst_lenght = robVision_obst_y - robVision_obst_x;
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
Graphics2D gty = (Graphics2D) g;
Graphics2D gO = (Graphics2D) g; //преп
Graphics2D gs = (Graphics2D) g;// сканер
Graphics2D gq = (Graphics2D) g;//луч
Graphics2D str = (Graphics2D)g; //строки с координатами
Graphics2D str1 = (Graphics2D)g;
Graphics2D str2 = (Graphics2D)g;
Graphics2D rv = (Graphics2D)g; // виденье робота
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawRect(rob_body_x, rob_body_y, rob_body_length, rob_body_width); // рисуем робота
gty.drawRect(1100, 25, 10, 700);
gO.drawRect(obst_body_x, obst_body_y, obst_lenght, obst_body_y); // рисуем преп
gs.drawRect(sensor_position_world_x, sensor_position_world_y, scan_body_lenght, scan_body_weight); // рисуем сенсор
gq.drawRect(wave_position_scan_x,wave_position_scan_y,wave_weight, wave_lenght); // рисуем луч
String calc_obst_beg1 = String.valueOf(calc_obst_beg);
str.drawString("Координата начала: " + calc_obst_beg1, 300, 350); //вывод вычисленной координаты начала преп
String calc_obst_end1 = String.valueOf(calc_obst_end);
str1.drawString("Координата конца: " + calc_obst_end1, 600, 350); //вывод вычисленной координаты конца преп
String calc_obst_lenght1 = String.valueOf(calc_obst_lenght);// вывод вычисленной длины преп
str2.drawString("Длина : " + calc_obst_lenght1, 800, 350);
if (calc_obst_beg != 0) rv.drawRect(robVision_obst_x, 550, calc_obst_lenght, 20); // построение "видения" робота после нахождения левой грани препятствия
}
public static void main(String[] args) throws InterruptedException {
JFrame frame = new JFrame("Robots move");
Game game = new Game();
frame.add(game);
frame.setSize(Win_length, Win_width);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
while (true) {
game.moveRobot();
game.repaint();
Thread.sleep(5);
if (rob_prime_x + rob_body_length / 2 == Win_length - 120) break;
}
}
}