Создание доски шашек в Java - PullRequest
1 голос
/ 06 марта 2012

Я начинаю небольшой проект по созданию простой игры в шашки. Однако прошло много времени с тех пор, как я использовал инструменты java GUI. Цель кода на этом этапе - нарисовать начальную доску (красные фигуры сверху, черные снизу). Однако все, что я получаю, когда запускаю код, это пустой кадр. Я также немного не уверен, будет ли мой код рисования кругов делать то, что я хочу (т.е. создавать сплошные красные или черные круги внутри определенных квадратов). Вот код. Заранее благодарен за любую помощь / предложения

РЕДАКТИРОВАТЬ: Мне, вероятно, следует чередовать рисование синих и серых квадратов, иначе эта штука, вероятно, будет просто гигантским голубым шариком, однако в этот момент я остановлюсь на гигантском голубом шарике: p

import javax.swing.*;
import java.awt.*;

public class CheckersServer 
{
    public static class Board
    {
        private JFrame frame = new JFrame();
        private JPanel backBoard = new JPanel();

    Board()
    {

        frame.setSize(905,905);
        backBoard.setSize(900,900);
        frame.setTitle("Checkers");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        backBoard.setVisible(true);


        boardSquare bs;
        String type = null;
        //Filling in Red Side
        for (int i = 0; i <=1; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(j % 2 == 0)
                {
                    type = "Red";
                }
                else 
                {
                    type = "Blank";
                }

                bs = new boardSquare(100*j,100*i,type);
                backBoard.add(bs); 

            }

        }
        //Filling in empty middle
        type = "Blank";
        for (int i = 2; i < 7; i++)
        {
            for(int j = 0; j < 9; j++)
            {

                bs = new boardSquare(100*j,100*i,type);
                backBoard.add(bs); 

            }

        }

        //Filling in Black side
        for (int i = 7; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(j % 2 != 0)
                {
                    type = "Black";
                }
                else 
                {
                    type = "Blank";
                }

                bs = new boardSquare(100*j,100*i,type);
                backBoard.add(bs); 

            }

        }

        backBoard.repaint();
        frame.add(backBoard);
        frame.repaint();


    }

    private class boardSquare extends JComponent
    {
        private int x; //x position of the rectangle measured from top left corner
        private int y; //y position of the rectangle measured from top left corner

        private boolean isBlack = false;
        private boolean isRed = false;

        public boardSquare(int p, int q, String type)
        {
            x = p;
            y = q;
            if (type.equals("Black"))
            {
                isBlack = true;
                isRed = false;
            }
            else if (type.equals("Red"))
            {
                isRed = true;
                isBlack = false;
            }
            else if (type.equals("Blank"))
            {
                isBlack = false;
                isRed = false;
            }

        }
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
            Rectangle box = new Rectangle(x,y,100,100);
            g2.draw(box);
            g2.setPaint(Color.BLUE);
            g2.fill(box);

            if(isBlack)
            {
                g2.fillOval(x, y,100 ,100 );
                g2.setColor(Color.black);
                g2.drawOval(x, y, 100, 100);
            }

            else if(isRed)
            {
                g2.fillOval(x, y,100 ,100 );
                g2.setColor(Color.red);
                g2.drawOval(x, y, 100, 100);
            }

        }
    }


}


public static void main(String[] args)
{
    Board game = new Board();

}
}

Ответы [ 3 ]

3 голосов
/ 06 марта 2012

У вас есть несколько проблем.

Пользовательский интерфейс Java основан на макете, что означает, что при добавлении компонента в родительский макет родительского элемента определяет, где будет размещен дочерний компонент. У вас нет кода для настройки макета, и поэтому ваше приложение использует значения по умолчанию (FlowLayout используется по умолчанию, и это может работать в вашем случае, если ваш JFrame и дочерние элементы имеют подходящий размер).

Большие проблемы в вашем классе. По умолчанию JPanels имеют размер 10х10. Вы не указываете размер, и поэтому все ваши квадраты 10х10. Вы должны сказать квадратам, насколько они велики. Вы можете сделать это в конструкторе boardSquare:

setPreferredSize(new Dimension(100, 100));

Наконец, в вашем коде рисования вы делаете смещение x, y при рисовании квадратов и кругов. Это смещение от верхнего левого угла компонента. Ваши компоненты (после установки размера) будут 100x100 пикселей. Но если ваши x, y превышают эти значения, вы будете рисовать за пределами компонента. Вместо этого эти значения должны быть установлены в 0,0, потому что это верхний левый угол компонента, который вы рисуете.

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

1 голос
/ 18 ноября 2013
import javax.swing.*;
import javax.swing.border.LineBorder;

import java.awt.*;

public class CheckersServer2 
{
    public static String type_BLANK = "BLANK";
    public static String type_RED = "RED";
    public static String type_BLACK = "BLACK";

    public static int width = 100;
    public static int height = 100;

    public static class Board
    {
        private JFrame frame = new JFrame();
        private JPanel backBoard = new JPanel();

    Board()
    {
        int numRows = 8;
        int numCols = 8;

        frame.setSize(905,905);
        backBoard.setSize(900,900);
        frame.setTitle("Checkers");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        backBoard.setVisible(true);

        String type;
        for(int r=0; r<numRows; r++){
            for(int c=0; c<numCols; c++){
                //
                type = type_BLANK;
                if(c%2==0){
                    if(r==0 || r==2) {
                        type = type_RED;
                    }else if(r==6){
                        type = type_BLACK;
                    }
                }else{
                    if(r==1){
                        type = type_RED;
                    } else if(r==5 || r==7) {
                        type = type_BLACK;
                    }
                }
                backBoard.add(new BoardSquare(r,c,type));               
            }           
        }

        backBoard.repaint();
        frame.add(backBoard);
        frame.repaint();


    }

    private class BoardSquare extends JComponent
    {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private int x; //x position of the rectangle measured from top left corner
        private int y; //y position of the rectangle measured from top left corner

        private boolean isBlack = false;
        private boolean isRed = false;

        public BoardSquare(int p, int q, String type)
        {
            //this.setBorder(new LineBorder(Color.CYAN, 2));
            this.setPreferredSize(new Dimension(width, height));

            x = p;
            y = q;
            if (type.equals(type_BLACK))
            {
                isBlack = true;
                isRed = false;
            }
            else if (type.equals(type_RED))
            {
                isRed = true;
                isBlack = false;
            }
            else if (type.equals(type_BLANK))
            {
                isBlack = false;
                isRed = false;
            }

        }
        public void paintComponent(Graphics g)
        {
            Graphics2D g2 = (Graphics2D) g;
            Rectangle box = new Rectangle(x,y,width,height);
            g2.draw(box);
            g2.setPaint(Color.BLUE);
            g2.fill(box);
            int ovalWidth = width - 15;
            int ovalHeight = ovalWidth;
            if(isBlack)
            {
                g2.setColor(Color.black);
                g2.fillOval(x, y, ovalWidth, ovalHeight);
                g2.drawOval(x, y, ovalWidth, ovalHeight);
            }

            else if(isRed)
            {
                g2.setColor(Color.red);
                g2.fillOval(x, y, ovalWidth, ovalHeight);
                g2.drawOval(x, y, ovalWidth, ovalHeight);
            }

        }
    }


}


public static void main(String[] args)
{
    Board game = new Board();

}
}
1 голос
/ 06 марта 2012

Вот несколько подсказок:

  • Ваши BoardSquare s имеют размерность 0x0. Не очень хороший размер для того, что вы хотите видеть для пользователя.

  • Чтобы помочь визуализировать происходящее, сделайте так, чтобы каждый BoardSquare имел размер 100x100 пикселей, и дал им границу. Теперь вы можете видеть, где они отображаются в вашем графическом интерфейсе. Ваш код GUI все еще нуждается в значительных изменениях, но это по крайней мере позволит вам начать видеть, с чем вы имеете дело.

        public BoardSquare(int p, int q, String type)
        {
            this.setBorder(new LineBorder(Color.CYAN, 2));
            this.setPreferredSize(new Dimension(100, 100));
    
            // ... etc ...
    
  • BoardSquare, по-видимому, кодируется для рисования его содержимого на основе координат от самой верхней крайней левой точки окна, но они должны кодироваться так, чтобы рисовать себя из самой верхней левой точки самого BoardSquare. То есть компоненты должны рисовать только в пределах своих собственных границ, и они должны использовать координаты, которые предполагают, что 0,0 обозначает верхнюю часть слева от компонента, а не от окна.

  • Если вы хотите использовать BoardSquare s (JComponent s) и добавить их во фрейм, вам, вероятно, следует использовать другой менеджер компоновки, такой как GridLayout. FlowLayout не даст вам желаемого точного позиционирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...