SWING шахматная доска - Java
Формулировка задачи:
Здравствуйте.
Есть намерение реализовать на java в учебных целях шашки.
Сейчас пишу компонент рисующий шахматную доску(изначально хотел просто вставить фотографию, но есть желание чтобы приложение подстраивалось под монитор пользователя, а кучу каритинок искать думаю не очень умно)
Создаю двумерный масив фигур.
Rectangle2D [][] squares
И цикл который добавляет в массив квадраты с координатами x, y.
Идея в следующем цикл сначала рисует 8 квадратов с нулевой высотой(y=0), постепенно смешаясь по ширине(x += side)
затем увеличивает высоту на длинну квадрата и далее рисует восемь квадратов по ширине.
Так восемь раз.
Это сделано потому как в шахматной доске фигуры по длине в зависимости от высоты ряда по разному закрашиваются.
Т.е. есть намерение в зависимости от ченого, нечетного i по разноме чередовать ч/б клетки.
Однако ситуация следующая если не обнулить y после цикла инициализации массива с объектами имеющими заданные координаты(ниже работоспособный код, операция там выделена) то все нарисованные в нижнем цикле квадраты сместятся вних относительно верха компонента на y.
В этом и была проблема.
1,5 часа голову ломал.
Не понимаю почему так происходит и прошу объяснить. Ведь в создаваемых Rectangle 2D объектах координаты инкапсулируется и у на них никак не влияет.
у же сама по себе просто переменная предназначенная для передачи значения высоты создаваемым квадратам.
Не могу понять почему изменение значения у оказывают подобное влияние.
Прошу умных людей объяснить смысл.
Ведь х и у координаты инкапсулируются в объектах Rectangle2D и внешняя переменная у на них не должна влиять?
int side = getHeight()/8; for(int i = 0; i < 8; i++) { for(int j =0; j < 8; j++) { Rectangle2D rect = new Rectangle2D.Double(x, y, side, side); squares[i][j] = rect; x += side; } x = 0; y += side; }
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; //import java.util.*; //import java.io.*; //import javax.imageio.*; class Game extends JFrame { { component = new GComponent(); } Game() { setTitle("Checkers"); Toolkit kit = Toolkit.getDefaultToolkit(); Dimension size = kit.getScreenSize(); sideLength = size.height; setSize((sideLength/20)*8, (sideLength/20)*8); setLocationByPlatform(true); setResizable(false); add(component); } private GComponent component; final int sideLength; } class GComponent extends JComponent { { squares = new Rectangle2D[8][8]; } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; side = getHeight()/8; for(int i = 0; i < 8; i++) { x = side/4; for(int j =0; j < 8; j++) { Rectangle2D rect = new Rectangle2D.Double( x, *y, side, side); System.out.println("x = " + x +" " +"y = " + y + "side =" +side);* squares[i][j] = rect; x += side; } System.out.println("side =" +side); y += 50; } [B]y = 0;[/B] for(int i = 0; i < 8; i++) for( int j = 0; j < 8; j++) { g2.draw(squares[i][j]); } //Rectangle2D rect = new Rectangle2D.Double(x, y, getHeight()/8, getHeight()/8); //g2.draw(rect); } private Rectangle2D [][] squares; private int x=0; private int y=0; private int side; }
строка 61.
Уже после инициализации графических объектов
Решение задачи: «SWING шахматная доска»
textual
Листинг программы
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; import java.util.ArrayList; class BoardPanel extends JComponent { private Color blackCellColor = Color.GRAY; private Color whiteCellColor = Color.LIGHT_GRAY; // //конструктор // public BoardPanel(int r) { res = r; squares = new Rectangle2D[8][8]; for(int i = 0; i < 8; i++) for(int j = 0; j < 8; j++) squares[i][j] = new Rectangle2D.Double(i*res, j*res, res, res); //массив для представления квадратов шахматной доски. initFigur(); addMouseListener(new MouseHandler() ); addMouseMotionListener(new MouseMotionHandler()); } // //Paint // public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; for(int i = 0; i < 8; i++) //Отрисовка шахматной доски for(int j = 0; j < 8; j++) { if((i+j)%2 == 0 ) g.setColor(whiteCellColor); //Четные квадраты в светлый else g.setColor(blackCellColor); //цвет, нечетные в темный g2.fill(squares[i][j]); } for(Ellipse2D els : bluefigurs) { g.setColor(Color.BLUE); //отрисовка синих фигур g2.fill(els); } for(Ellipse2D els : redfigurs) { g.setColor(Color.RED); //отрисовка красных фигур g2.fill(els); } } // //private void initFigur(int res) функция предназначена предназначен для инициализации начальных позиций шашек в игре // private void initFigur() { //Начальные позиции для синих фигур bluefigurs = new ArrayList <Ellipse2D>(12); bluefigurs.add(new Ellipse2D.Double(0*res+res/8, 0+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(2*res+res/8, 0+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(4*res+res/8, 0+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(6*res+res/8, 0+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(1*res+res/8, res+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(3*res+res/8, res+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(5*res+res/8, res+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(7*res+res/8, res+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(0*res+res/8, res*2+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(2*res+res/8, res*2+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(4*res+res/8, res*2+res/8, res - res/3, res - res/3)); bluefigurs.add(new Ellipse2D.Double(6*res+res/8, res*2+res/8, res - res/3, res - res/3)); //Начальные позиции для красных фигур redfigurs = new ArrayList <Ellipse2D>(12); redfigurs.add(new Ellipse2D.Double(1*res+res/8, 7*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(3*res+res/8, 7*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(5*res+res/8, 7*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(7*res+res/8, 7*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(0*res+res/8, 6*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(2*res+res/8, 6*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(4*res+res/8, 6*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(6*res+res/8, 6*res+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(1*res+res/8, res*5+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(3*res+res/8, res*5+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(5*res+res/8, res*5+res/8, res - res/3, res - res/3)); redfigurs.add(new Ellipse2D.Double(7*res+res/8, res*5+res/8, res - res/3, res - res/3)); } void reset() { initFigur(); repaint(); } // //Обработчики событий // private class MouseMotionHandler implements MouseMotionListener { public void mouseMoved(MouseEvent event) { } public void mouseDragged(MouseEvent event) { int x = event.getX(); int y = event.getY(); if(previousFigure != null) previousFigure.setFrame(x, y, res - res/3, res - res/3); repaint(); } } //;; private class MouseHandler extends MouseAdapter { public void mousePressed(MouseEvent event) { Point2D p = event.getPoint(); for(Ellipse2D els : redfigurs) if(els.contains(p)) previousFigure = els; for(Rectangle2D[] out : squares) for(Rectangle2D in : out) if(in.contains(p)) previous = in; } public void mouseReleased(MouseEvent event) { if (previousFigure == null) return; Point2D p = event.getPoint(); if (checkMoved(p)) previousFigure.setFrame(i*res+res/8, j*res+res/8, res - res/3, res - res/3); else previousFigure.setFrame(a*res+res/8, b*res+res/8, res - res/3, res - res/3); repaint(); } } //;; // //checkMoved(Point2D p) фунция проверяет соответствие хода игрока игровым правилам. // private boolean checkMoved(Point2D p) { //Текущая позиция, когда кнопка мыши отпущена boolean notFind = true; i = 0; while(i < 8 && notFind) { for(j = 0; j < 8; j++) { if(squares[i][j].contains(p)) { notFind = false; break; } } if (notFind) i++; } // Позиция в которой находился указатель, во время нажатия клавиши мыши. a = 0; notFind = true; while (a < 8 && notFind) { for(b = 0; b < 8; b++) { if(squares[a][b] == previous) { notFind = false; break; } } if(notFind) a++; } //Проверка препятствует выходу фигуры за пределы игровой карты. if (i > 7) i = 7; if(i < 0) i = 0; if(j > 7) j = 7; if(j < 0) j = 0; int xCheck = a - i; int yCheck = b - j; //Проверка не занята ли клетка назначения другой шашкей for (Ellipse2D els : redfigurs) if(els.intersects(squares[i][j]) && els != previousFigure) { return false; } for (Ellipse2D els : bluefigurs) if(els.intersects(squares[i][j]) && els != previousFigure) { return false; } //проверка является ли ход рубящим if((yCheck == 2 && (xCheck == 2 || xCheck == -2))) { switch(xCheck) { case 2: for (Ellipse2D els : bluefigurs) if (els.intersects(squares[a-1][b-1])) { bluefigurs.remove(els); return true; } return false; case -2: for (Ellipse2D els : bluefigurs) if (els.intersects(squares[a+1][b-1])) { bluefigurs.remove(els); return true; } return false; } } //если условие выполняется шашка ходит не по правилам. if(!(yCheck == 1 && (xCheck == 1 || xCheck == -1))) return false; return true; } int res; private Rectangle2D[][] squares; private ArrayList<Ellipse2D> redfigurs; private ArrayList<Ellipse2D> bluefigurs; private Ellipse2D previousFigure; private Rectangle2D previous; int i = 0; int j = 0; int a = 0; int b = 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д