2014-10-24 3 views
3

Мне нужно создать черепичную карту nxn столбцов/строк. Во-первых, программа запрашивает у пользователя, сколько фрагментов он хочет, затем создает карту с черепицей. После этого пользователь нажимает на одну плиту, а плитки меняют цвет. Затем он нажимает на anothe плитка, и цвет меняется также. После этого программа найдет решение от выбранной плитки к другой.Создание плиточной карты n * n для лабиринта

В настоящее время я создал черепичную карту с компонентом Graphics2D, но когда я нажимаю на плитку, это целая графика, которая меняет цвет, а не только одну плиту ... Не могли бы вы рассказать мне, что случилось? Каков прекрасный способ рисования плиточной карты? Спасибо ! лабиринт должен выглядеть следующим образом:

enter image description here

мне еще нужно ввести код стен и найти решение. Это код моего JPanel, где я создаю карту.

public LabyrintheInteractif(){ 
    addMouseListener(new MouseAdapter() { 

     @Override 
     public void mouseClicked(MouseEvent e) { 
      click=true; 
      repaint(); 
      xClick=e.getX(); 
      yClick=e.getY(); 
     } 
    }); 

    tiles=Integer.parseInt(JOptionPane.showInputDialog("How many tiles ?")); 
    Quadrilage", JOptionPane.YES_NO_OPTION); 

    setPreferredSize(new Dimension(734, 567)); 
    setVisible(true); 
} 

@Override 
public void paintComponent(Graphics g) { 

    super.paintComponent(g); 

    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(Color.white); 

    rect = new Rectangle2D.Double(0, 0,getWidth(), getWidth()); 
    g2d.fill(rect); 
    g2d.setColor(Color.black); 

    for (row = 0; row <tuiles; row++) { 
     for (column = 0; column < tuiles; column++) { 
      g2d.setStroke(new BasicStroke(3)); 
      g2d.draw(square=new Rectangle2D.Double(column*100 , row*100,100,100)); 
     } 
     if(click){ 
      g2d.setColor(Color.green); 
      g2d.fill(square); 
      repaint(); 
    } 
} 
+1

Прямо сейчас, я бы сказал, что ваш лучший шаг - отделить логику от рендеринга. Отсортируйте структуру данных, алгоритмы и поведение вашей * модели *, и как только это будет проверено и работает, только тогда рассмотрите, как * визуализировать * модель. См. [MVC] (http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller). Прямо сейчас вы объединили все вместе, что затрудняет разработку, отладку и понимание. – Bohemian

ответ

2

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

Что вам нужно сделать, это найти width и height плитки. Затем вам нужно проверить, для какой плитки пользователь щелкнул, например, в виде вложенного цикла.

for (row = 0; row <tuiles; row++) { 
    for (column= 0; column<tuiles; column++) { 
     if(clicked){ 

     //check if the click x position is within the bounds of this tile 
     if(column * tileWidth + tileWidth > xClick && column * tileWidth < xClick){ 

      //check if the click y position is within the bounds of this tile 
      if(row * tileHeight + tileHeight > yClick && row * tileHeight < yClick){ 
       //mark this tile as being clicked on. 
       clicked = false; 
      } 
     } 
     } 
    } 
} 

Затем вам нужно будет хранить логические значения, которые будут утверждать, была ли конкретная плитка была нажата на. Таким образом, когда вы рисуете плитку, вы можете использовать что-то вроде этого:

if(thisTileHasBeenClicked){ 

    //if the tile has been clicked on 
    g2d.setColor(Color.green); 
    g2d.fill(square); 
}else{ 

    //if the tile has not been clicked on 
    g2d.setColor(Color.gray); 
    g2d.fill(square); 
} 
Смежные вопросы