Движение по лабиринту.

322
26 ноября 2016, 19:19

Делаю лабиринт. Движение осуществляется по фрейму, в зависимости от значения в массиве map, где 1 - можно двигаться, 2 - стена. Ну и как следствие получается, что я двигаюсь по одному пикселю и для большого лабиринта мне придется создать большой массив. Как без увеличения массива увеличить размер лабиринта?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RealMaze implements ActionListener {
    int x = 1;
    int y = 1;
    JButton button;
    MyDrawPanel myDrawPanel;
    JFrame frame;
    public static void main(String[] args) {
        RealMaze realMaze = new RealMaze();
        realMaze.go();
    }
    public void go() {
        frame = new JFrame();
        myDrawPanel = new MyDrawPanel();
        button = new JButton("Test");
        frame.setSize(100, 100);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(BorderLayout.CENTER, myDrawPanel);
        frame.getContentPane().add(BorderLayout.SOUTH, button);
        button.addActionListener(this);
    }
    //Движение по фрейму
    public void actionPerformed(ActionEvent event) {
        if (map[x][y] == 1) {
            x++;
                System.out.println(x);
                System.out.println(map[x][y]);
        }
        frame.repaint();
    }
    class MyDrawPanel extends JPanel {
        public void paintComponent(Graphics g) {
            g.setColor(Color.gray);
            g.fillRect(x, y, 10, 10);
        }
    }
    //Карта, 2 - стена. 
        int[][] map = new int[][]{
            {1,1,1,1,1,1,1,2,1,1},
            {1,1,1,1,1,1,1,2,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1},
            {2,2,1,1,1,1,1,1,1,1},
            {1,1,1,1,1,1,1,1,1,1}
        };
}
Answer 1

Вам нужно изменить размер шага при выводе. То есть определить некий модификатор, на который вы будете умножать координату при выводе на фрейм.

Например:

class MyDrawPanel extends JPanel {
    public void paintComponent(Graphics g) {
        g.setColor(Color.gray);
        // Получу размер стороны квадрата.
        int sideLength = getSideLength();
        // нарисую квадрат масштабируя координаты.
        g.fillRect(x*sideLength, y*sideLength, sideLength, sideLength);
    }
    private int getSideLength() {
        // минимальная сторона компоненты.
        int minComponentSide = (this.getHight() > this.getWidth()) ? this.getWidth() : this.getHight();
        // максимальная сторона карты.
        int maxMapSide = (map.length > map[0].length) ? map.length : map[0].length;
        // длина стороны, чтобы карта уместилась и комнаты были квадратные.
        return minComponentSide / maxMapSide;
    }
}
Answer 2

Я могу предложить альтернативу - используй картинку!

BufferedImage image = ImageIO.read(this.getClass.getResources("image.png");
int clr=  image.getRGB(x,y); 

Делаешь черно-белый лабиринт картинкой. Загружаешь сюда, и перебирая координаты проверяешь чтоб цифра не была равна 0 (черный).

READ ALSO
Неверная кодировка MySQL

Неверная кодировка MySQL

Выводит непонятные символы, не могу понять где и как нужно менять кодировку

222
SSH подключение к Android девайсу

SSH подключение к Android девайсу

Здравствуйте, возможно ли разработать приложение для Android которое бы создавало сессию ssh и к которой можно было подключиться по средствам...

311
Не совсем понятно, почему ответ именно такой

Не совсем понятно, почему ответ именно такой

Итак есть программа, которая выводит следующее:

245