0

私は多色のボードを作成します。最初の正方形は黒、次に青、赤、黄色で始まり、正方形は斜めに塗りつぶされ、空の色付きの正方形はありません。アルゴリズムが間違っていることはわかっていますが、それを修正する方法についての手がかりがありません。現在、私のコードは次のように出力されます

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

}

}

4

3 に答える 3

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、タイルごとに計算し、ルックアップ テーブルを使用してこれらの数値を色に変換することで簡単に作成できます (列挙を使用するか、整数値をタイルに割り当てる代わりに、整数をテーブルのルックアップとして使用します)。タイルに色を割り当てます)

% 4 は「4 で割り、その余りを返す」という意味です。

于 2013-04-09T01:05:12.113 に答える
1

私はコードをすばやく実行しましたが、私には混乱しているように見える小さなことがたくさんあります..

元のコードが 1 つおきのセルをスキップしていたため、色の計算が無効になりました...

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

        }
    }
}
于 2013-04-09T01:24:14.110 に答える