【问题标题】:Creating a multicolored board创建一个多彩多姿的板
【发布时间】:2013-04-09 00:19:54
【问题描述】:

我要创建一个彩色板,从第一个黑色方块开始,然后是蓝色、红色和黄色,这些方块是对角线填充的,没有空的彩色方块。我知道我的算法是错误的,但我不知道如何修复它。 目前,我的代码打印出来是这样的

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;

public class Grid extends JPanel {
private static final long serialVersionUID = 1L;
public static final int GRID_COUNT = 8;
private Color[] colors = { Color.black, Color.yellow, Color.red,
        Color.blue };
private int colorIndex = 0;

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D graphics = (Graphics2D) g;
    graphics.setColor(Color.black);

    Dimension size = getSize();
    Insets insets = getInsets();
    int w = size.width - insets.left - insets.right;
    int h = size.height - insets.top - insets.bottom;

    int sqrWidth = (int)((double)w / GRID_COUNT);
    int sqrHeight = (int)((double)h / GRID_COUNT);
    for (int row = 0; row < GRID_COUNT; row++) {
        for (int col = 0; col < GRID_COUNT; col++) {
                int x = (int) (row * (double) w / GRID_COUNT);
                int y = (int) (col * (double) h / GRID_COUNT);
                if ((row + col) % 2 == 0) {
                    int colorIndex = (row + col) % 4;
                    graphics.fillRect(x, y, sqrWidth, sqrHeight);
                    graphics.setColor(colors[colorIndex]);
                    colorIndex = (colorIndex + 1) % colors.length;
    }

}

public static void main(String[] args) {
    Grid grid = new Grid();
    grid.setPreferredSize(new Dimension(400, 400));
    JFrame frame = new JFrame("Grid");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(grid);
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);

}

}

【问题讨论】:

  • 感谢安德鲁的编辑!
  • 不客气,但您后来的编辑不是交换了图像的顺序吗? ;)
  • 是的,因为我想要输出,是另一张所有方块都填满的图片

标签: java grid


【解决方案1】:

让我们看看模式:

Bk Gr Pn Bl
Gr Pn Bl Bk
Pn Bl Bk Gr
Bl Bk Gr Pn

但为了简单起见,我们调用 Bk 0、Gr 1、Pn 2 和 Bl 3 来得到:

0 1 2 3
1 2 3 0
2 3 0 1
3 0 1 2

通过计算每个图块的tile[x][y] = (x + y) % 4 并使用查找表将这些数字转换为颜色(使用枚举或不给图块分配整数值,而是使用整数作为外观),可以轻松生成此模式-up 在颜色表中并将颜色分配给瓷砖)

如果您以前从未见过,% 4 表示“除以 4 并返回除数的余数”。

【讨论】:

  • +1 表示总体思路,但 OP 会为每隔一个单元格插入一个空白单元格,这将推迟计算...不确定这是否是他们想要做的事情跨度>
  • 我完全去掉了 if 语句,但是现在我正在填满每个方格;顶行向右移动。会更新图片
  • @MadProgrammer 如果您查看 OP 发布的代码,他并没有插入空白单元格 - 他只是拒绝绘制奇偶校验单元格。
  • @Patashu 这就是我的意思,对不起,它没有清楚地表达出来,但这意味着当他们使用int colorIndex = (row + col) % 4 时,他们会跳过一个颜色 - 这就是我要说的 ;)
【解决方案2】:

我看到有两个错误,第一个错误是你的图案,你想从黑色开始,“然后是蓝色,红色和黄色”但你做到了

 private Color[] colors = { Color.black, Color.yellow, Color.red, Color.blue };

换一个

第二个错误是你的程序计数均匀,意味着它均匀地填充矩形, 2、4、6、8.. 让你的程序运行在每一个灰色的矩形上...

【讨论】:

    【解决方案3】:

    我快速浏览了代码,其中有很多让我感到困惑的小东西..

    您的颜色计算被抛出,因为您的原始代码每隔一个单元格跳过...

    if ((row + col) % 2 == 0) {

    这意味着当您尝试确定颜色时,您没有得到您期望的颜色。

    您还在行循环中而不是在列循环中设置单元格的颜色,这对我来说似乎很奇怪......

    (我在其中添加了文本以进行调试,请随意摆脱它)

    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Insets;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Grid {
    
        private static final long serialVersionUID = 1L;
        public static final int GRID_COUNT = 8;
        private Color[] colors = {Color.black, Color.yellow, Color.red,
            Color.blue};
    
        public static void main(String[] args) {
            new Grid();
        }
    
        public Grid() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Grid");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.add(new GridPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
    
                }
            });
        }
    
        public class GridPane extends JPanel {
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D graphics = (Graphics2D) g;
                graphics.setColor(Color.black);
    
                Dimension size = getSize();
                Insets insets = getInsets();
                int w = size.width - insets.left - insets.right;
                int h = size.height - insets.top - insets.bottom;
    
                FontMetrics fm = graphics.getFontMetrics();
    
                int sqrWidth = (int) ((double) w / GRID_COUNT);
                int sqrHeight = (int) ((double) h / GRID_COUNT);
                int colorIndex = 0;
                for (int row = 0; row < GRID_COUNT; row++) {
                    for (int col = 0; col < GRID_COUNT; col++) {
                        int x = (int) (col * sqrWidth);
                        int y = (int) (row * sqrHeight);
                        colorIndex = (row + col) % 4;
                        graphics.setColor(colors[colorIndex]);
                        graphics.fillRect(x, y, sqrWidth, sqrHeight);
                        String text = row + "/" + col;
                        graphics.setColor(Color.WHITE);
                        graphics.drawString(
                                text,
                                x + ((sqrWidth - fm.stringWidth(text)) / 2),
                                y + ((sqrHeight - fm.getHeight()) / 2) + fm.getAscent());
                    }
                }
    
            }
        }
    }
    

    【讨论】:

    • 谢谢,我发现 if 语句不正确,但我不会猜测其他信息。谢谢!
    猜你喜欢
    • 2016-12-17
    • 2021-07-11
    • 2013-04-28
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多