用Java创建Checkers Board

时间:2012-03-06 00:20:13

标签: java swing

我正在开始一个小项目来创建一个简单的跳棋游戏。但是,自从我使用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 个答案:

答案 0 :(得分:3)

你有几个问题。

Java UI是基于布局的,这意味着当您将组件添加到父级时,父级的布局将确定子组件的放置位置。您没有任何代码来设置布局,因此您的应用程序使用默认值(FlowLayout是默认值,这可能适合您的情况,只要您的JFrame和子节点大小合适)。

更大的问题出在boardSquare类中。默认情况下,JPanel的维度为10x10。你没有指定大小,所以你的方块都是10x10。你需要告诉方块他们有多大。您可以在boardSquare构造函数中执行此操作:

setPreferredSize(new Dimension(100, 100));

最后,在绘图代码中,绘制正方形和圆形时,您正在进行x,y的偏移。这是从组件左上角的偏移量。您的组件(设置大小后)将为100x100像素。但是如果你的x,y大于这些值,你将在组件的边界之外绘制。相反,这些值应设置为0,0,因为这是您正在绘制的组件的左上角。

通过设置正方形的首选大小并将x,y设置为0,我能够在框架中绘制正方形,尽管它并不漂亮。在正确布局之前,您需要设置正确的布局。

答案 1 :(得分:1)

以下是一些提示:

  • 您的BoardSquare的尺寸为0x0。对于您希望用户可见的内容而言,尺寸不是很好。

  • 为了帮助可视化正在发生的事情,使每个BoardSquare的大小为100x100像素,并为它们提供边框。现在,您可以看到它们在GUI中显示的位置。您的GUI代码仍然需要进行重大更改,但这至少可以让您开始看到您正在处理的内容。

        public BoardSquare(int p, int q, String type)
        {
            this.setBorder(new LineBorder(Color.CYAN, 2));
            this.setPreferredSize(new Dimension(100, 100));
    
            // ... etc ...
    
  • BoardSquare似乎被编码为根据窗口中绝对最左边的点的坐标绘制其内容,但是应该对它们进行编码以从{{1的最左上角 - 绘制自己的内容。本身。也就是说,组件应该只在它们自己的边界内绘制,并且它们应该使用假设0,0指定组件的顶部,左侧而不是窗口的坐标。

  • 如果您想使用BoardSquare s(BoardSquare s)并将它们添加到框架中,您可能应该使用不同的布局管理器,例如GridLayout。 FlowLayout不会为您提供所需的精确定位。

答案 2 :(得分:1)

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();

}
}