SWING шахматная доска - Java

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

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

Здравствуйте. Есть намерение реализовать на java в учебных целях шашки. Сейчас пишу компонент рисующий шахматную доску(изначально хотел просто вставить фотографию, но есть желание чтобы приложение подстраивалось под монитор пользователя, а кучу каритинок искать думаю не очень умно) Создаю двумерный масив фигур. Rectangle2D [][] squares И цикл который добавляет в массив квадраты с координатами x, y.
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;   
        }
Идея в следующем цикл сначала рисует 8 квадратов с нулевой высотой(y=0), постепенно смешаясь по ширине(x += side) затем увеличивает высоту на длинну квадрата и далее рисует восемь квадратов по ширине. Так восемь раз. Это сделано потому как в шахматной доске фигуры по длине в зависимости от высоты ряда по разному закрашиваются. Т.е. есть намерение в зависимости от ченого, нечетного i по разноме чередовать ч/б клетки. Однако ситуация следующая если не обнулить y после цикла инициализации массива с объектами имеющими заданные координаты(ниже работоспособный код, операция там выделена) то все нарисованные в нижнем цикле квадраты сместятся вних относительно верха компонента на y. В этом и была проблема. 1,5 часа голову ломал. Не понимаю почему так происходит и прошу объяснить. Ведь в создаваемых Rectangle 2D объектах координаты инкапсулируется и у на них никак не влияет. у же сама по себе просто переменная предназначенная для передачи значения высоты создаваемым квадратам. Не могу понять почему изменение значения у оказывают подобное влияние.
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;
}
Прошу умных людей объяснить смысл. Ведь х и у координаты инкапсулируются в объектах Rectangle2D и внешняя переменная у на них не должна влиять?
строка 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;
        
    
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

9   голосов , оценка 3.667 из 5