Игра "Точки". Алгоритм - Java
Формулировка задачи:
Всем доброго времени суток. Есть такая проблема.
Нужно написать десктоп-приложение, игра "Точки".
Линк вики
В чём собственно проблема:
1. в GUI. Какие компоненты использовать. Думал можно использовать Button'ы, но если их создавать просто через new Button не получится использовать их в алгоритме.
2. Просто слушать клик мышки на форме? Но тоже не получается.
Собственно, велосипед решил не изобретать, погуглил, нашёл алгоритм на VB:
И ейный вызов
перевести дословно алгоритм на java - нет проблем.
Вопрос собственно такой: какие графические компоненты использовать и как прикрутить этот алгоритм.
Заранее, спасибо.
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 ' значит окружили, закрашиваем, подсчитываем
Решение задачи: «Игра "Точки". Алгоритм»
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) { } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д