Игра "Точки". Алгоритм - Java

Узнай цену своей работы

Формулировка задачи:

Всем доброго времени суток. Есть такая проблема. Нужно написать десктоп-приложение, игра "Точки". Линк вики В чём собственно проблема: 1. в GUI. Какие компоненты использовать. Думал можно использовать Button'ы, но если их создавать просто через new Button не получится использовать их в алгоритме. 2. Просто слушать клик мышки на форме? Но тоже не получается. Собственно, велосипед решил не изобретать, погуглил, нашёл алгоритм на VB:
Function volna(mestoX As Integer, mestoY As Integer, Player As Byte, Wave As Integer)
   ' Если волна дошла до края поля - выход из рекурсивного цикла
   If VolnaKray Then Exit Function
   ' Вышло ли за край поля
   If mestoX < 0 Or mestoX > maxX Or mestoY < 0 Or mestoY > maxY Then
       VolnaKray = True
       Exit Function
   End If
   ' Распространение волны в незанятые места
   If mesto(mestoX, mestoY) <> Player And cepochka(mestoX, mestoY) = 0 Then
       cepochka(mestoX, mestoY) = Wave
   Else
       ' Значит место занято волной или точкой соперника
       Exit Function
   End If
   ' Рекурсивный перебор всех направлений распространения волны
   ' Влево
   volna mestoX - 1, mestoY, Player, Wave + 1
   ' Вверх
   volna mestoX, mestoY - 1, Player, Wave + 1
   ' Вправо
   volna mestoX + 1, mestoY, Player, Wave + 1
   ' Вниз
   volna mestoX, mestoY + 1, Player, Wave + 1
End Function
И ейный вызов
' Есть ли замкнутая область, mestoX и mestoY - Точка, которую проверяем на замкнутось (окружили её или нет)
VolnaKray = False
volna CInt(mestoX), CInt(mestoY), Player, 1
If Not (VolnaKray) Then ' значит окружили, закрашиваем, подсчитываем
перевести дословно алгоритм на java - нет проблем. Вопрос собственно такой: какие графические компоненты использовать и как прикрутить этот алгоритм. Заранее, спасибо.

Решение задачи: «Игра "Точки". Алгоритм»

textual
Листинг программы
public class ShootTest {
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
       Field frame = new Field();
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       frame.show();
    }
}
class Field extends JFrame
{
    public Field()
    {
        setTitle("Морской бой");
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        Toolkit kit = Toolkit.getDefaultToolkit();
        
        Dimension screenSize=kit.getScreenSize();
        int screenHeight=screenSize.height;
        int screenWidth=screenSize.width;
        setLocation(screenWidth/4,screenHeight/4);
        FieldPanel panel = new FieldPanel();
        Container ContentPane=getContentPane();
        ContentPane.add(panel);
    }
    private static final int DEFAULT_WIDTH=700;
    private static final int DEFAULT_HEIGHT=500;
    
}
class FieldPanel extends JPanel
{
    public FieldPanel()
            
    {
        //Добавляем кнопки
        String style = new String("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        
        makeButton("Показать штучки",style);
        makeButton("Новая игра",style);
  
        X=0;
        Y=0;
        stage = 0;
        
        addKeyListener(new KeyList());
        addMouseListener(new MouseList());
        addMouseMotionListener(new MouseMoveList());
        
        Random r = new Random();       
        sheeps = new boolean[10][10];
        for (int i=0;i<sheeps.length;i++)
            for(int j=0;j<sheeps.length;j++)
                sheeps[i][j]=r.nextBoolean();
        paintGreed(0,0);
       
     
        
    }
    public void paintGreed(int x,int y)
    {
        for (int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            {
                x=X+i*20;
                y=Y+j*20;
                Rectangle2D r = new Rectangle2D.Double(x,y,20,20);
                FieldRects[i][j]=r;
            }
    }
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        for (int i=0;i<FieldRects.length;i++)
            for (int j=0;j<FieldRects.length;j++)
        {
            Rectangle2D rect=FieldRects[i][j];
            g2d.draw(rect);
        }
       paintCross(g2d);
       // Рисуем прицел       
       paintAim(g2d);                  
    }
    
                //Метод рисует крест
       private void paintCross(Graphics2D g2d)
    {
         for(int i=0;i<ShootList.length;i++)
             for(int j=0;j<ShootList.length;j++)
        {
            if (ShootList[i][j]==true)
            {
                Rectangle2D shoted = FieldRects[i][j];
                int x= (int)shoted.getX()-X;
                int y= (int)shoted.getY()-Y;
                int xi = x/20;
                int yi = y/20;
                //Если в массиве кораблей единица то рисуем крест иначе круг
                if (sheeps[xi][yi] == true) 
                        {
                            g2d.setStroke(new BasicStroke(3));
                            g2d.draw(new Line2D.Double(x+3,y+3,x+17,y+17));
                            g2d.draw(new Line2D.Double(x+17,y+3,x+3,y+17));
                            g2d.setStroke(new BasicStroke(1));
                        }
                else
                {
 
                    g2d.fillOval(x+6, y+6, 8, 8);
                }
            }
    }
    }
       private void paintAim(Graphics2D g2d)
       {
           if (current!=null&nowX<=200&nowY<=200)
           {
                double x=current.getCenterX();
                double y=current.getCenterY();
                Line2D l =new Line2D.Double(x,y+5,x,y-5);
                Line2D l1= new Line2D.Double(x-5,y,x+5,y);
                Ellipse2D el=new Ellipse2D.Double();
                el.setFrame(x-5, y-5, 10, 10);
                g2d.draw(l);
                g2d.draw(l1);
                g2d.draw(el);
           }
       }
    /*Метод возвращает квадрат в котором находится точка
     * @Point2D коордтнаты точки
     */
    public Rectangle2D find(Point2D p)
    {        
        for (int i=0;i<FieldRects.length;i++)
            for(int j=0;j<FieldRects.length;j++)
        {
            Rectangle2D rect=FieldRects[i][j];
            if (rect.contains(p)) return rect;
            
        }
        return null;
    }
    /*Метод создаёт соответствующую кнопку
     * @name имя кнопки
     * @location позиция кнопки вида Point
     * @Dimension размер кнопки(width height)
     * @plafName стиль кнопки
     */
    void makeButton(String name,final String plafName)
    {
      try
        {
            UIManager.setLookAndFeel(plafName);
            SwingUtilities.updateComponentTreeUI(FieldPanel.this);                           
        }
        catch(Exception e){e.printStackTrace();}
        JButton button = new JButton(name);                 
        
        add(button);
        button.addActionListener(
                new ActionListener()
                {
                    public void actionPerformed(ActionEvent event)
                    {
                       String param = event.getActionCommand();
                       if (param=="Показать штучки") 
                           {
                               for (int i=0;i<ShootList.length;i++)
                               for(int j=0;j<ShootList.length;j++)
                               {
                                 ShootList[i][j]=true;
                               }
                               repaint();
                           }
                       if (param=="Новая игра")
                           {
                               ShootList = new boolean[10][10];
                                 Random r = new Random();
                                  for (int i=0;i<sheeps.length;i++)
                                    for(int j=0;j<sheeps.length;j++)
                                      sheeps[i][j]=r.nextBoolean();
                           repaint();
                           }
                                 
                      
                    }
                });
    }
   
    private static int stage;
    private Rectangle2D[][] FieldRects=new Rectangle2D[10][10];
    private boolean[][] sheeps=new boolean[10][10];
    private Rectangle2D current;
    private int nowX;
    private int nowY;
    private boolean[][] ShootList=new boolean[10][10];
    private int X;
    private int Y;
    
private class KeyList implements KeyListener
{
    public void keyPressed(KeyEvent event)
    {
        
    }
    public void keyReleased(KeyEvent event)
    {
        
    }
    public void keyTyped(KeyEvent event)
    {
        
    }
 
}
private class MouseList extends MouseAdapter
{
 public void mousePressed(MouseEvent event)
     {
 
     }
 public void mouseClicked(MouseEvent event)
     {
         if (current!=null) 
         {        
             int i=((int)current.getX()-X)/20;
             int j=((int)current.getY()-Y)/20;
             ShootList[i][j]=true;
             repaint();
         }
     }
}
private class MouseMoveList implements MouseMotionListener
{
    public void mouseMoved(MouseEvent event)
    {
        nowX = event.getX();
        nowY = event.getY();
        if (nowX>200||nowY>200) 
        {
            current=null;
            repaint();
        }
        current=find(new Point2D.Double(nowX,nowY));
        if (current !=null) 
        {
            repaint();
            setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
        }
        else
        {
            setCursor(Cursor.getDefaultCursor());
        }
    }
    public void mouseDragged(MouseEvent event)
    {     
    }
}
}

Оцени полезность:

10   голосов , оценка 3.5 из 5