Java中的棋盘

3
这是我的代码如下:
import javax.swing.*;
import java.awt.*;

public class board2 {

JFrame frame;
JPanel squares[][] = new JPanel[8][8];

public board2() {
    frame = new JFrame("Simplified Chess");
    frame.setSize(500, 500);
    frame.setLayout(new GridLayout(8, 8));

    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            squares[i][j] = new JPanel();

            if ((i + j) % 2 == 0) {
                squares[i][j].setBackground(Color.black);
            } else {
                squares[i][j].setBackground(Color.white);
            }   
            frame.add(squares[i][j]);
        }
    }

    squares[0][0].add(new JLabel(new ImageIcon("rookgreen.png")));
    squares[0][2].add(new JLabel(new ImageIcon("bishopgreen.png")));
    squares[0][4].add(new JLabel(new ImageIcon("kinggreen.png")));
    squares[0][5].add(new JLabel(new ImageIcon("bishopgreen.png")));
    squares[0][7].add(new JLabel(new ImageIcon("rookgreen.png")));

    squares[7][0].add(new JLabel(new ImageIcon("rookred.png")));
    squares[7][2].add(new JLabel(new ImageIcon("bishopred.png")));
    squares[7][4].add(new JLabel(new ImageIcon("kingred.png")));
    squares[7][5].add(new JLabel(new ImageIcon("bishopred.png")));
    squares[7][7].add(new JLabel(new ImageIcon("rookred.png")));

    for (int i = 0; i < 8; i++) {
        squares[1][i].add(new JLabel(new ImageIcon("pawngreen.png")));
        squares[6][i].add(new JLabel(new ImageIcon("pawnred.png")));
    }

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}

public static void main(String[] args) {
    new board2();
}
}

我正在尝试创建一款类似于国际象棋的游戏,我需要帮助为棋盘的所有边缘添加标签,以便用A-H或1-8标记行和列。我不知道该怎么做。之后,我还将添加一个拖放棋子的功能。最好使用JLabels吗?无论如何,我该如何在侧面放置标签呢?谢谢!


如果我是你,我会在这个项目中使用更多的 MVP 和一些类。 - Humphrey Bogart
我同意保罗的观点。我的意思是,如果你不能在棋盘上标记,那就尽情地研究AI的极小化定理吧,或者干脆放弃AI,为每个玩家确定移动是否有效。 - Cam
我应该使用什么代替标签?我应该使用面板或其他形式的容器吗? - ranzy
请参考此实现 - Andrew Thompson
6个回答

5
我想提交一个使用Unicode字符绘制简单国际象棋棋盘的示例。这个小项目涉及到3个类。
ChessLabel.java
import java.awt.Color;
import java.awt.Font;
import javax.swing.JLabel;
import javax.swing.SwingConstants;


public class ChessLabel extends JLabel {

    Font font     = new Font("Ariel", Font.PLAIN, 24);
    Color bgLight = new Color(222, 184, 135);
    Color bgDark  = new Color(139, 69, 19);

    ChessLabel(String s)
    {
        super(s);
    }

    void set(int idx, int row)
    {
      setFont(font);
          setOpaque(true);
          setBackground((idx+row)%2 == 0 ? bgDark : bgLight);
          setHorizontalAlignment( SwingConstants.CENTER );
    }

}

Board.java

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


public class Board extends JFrame {


   //Initialise arrays to hold panels and images of the board

    private ChessLabel[] labels = new ChessLabel[] {

    // white
    new ChessLabel("\u2656"), new ChessLabel("\u2658"), new ChessLabel("\u2657"), 
    new ChessLabel("\u2655"), new ChessLabel("\u2654"), new ChessLabel("\u2657"), 
    new ChessLabel("\u2658"), new ChessLabel("\u2656"), new ChessLabel("\u2659"), 
    new ChessLabel("\u2659"), new ChessLabel("\u2659"), new ChessLabel("\u2659"),
    new ChessLabel("\u2659"), new ChessLabel("\u2659"), new ChessLabel("\u2659"), 
    new  ChessLabel("\u2659"), 
    // empty
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "),
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "), new ChessLabel(" "), 
    new ChessLabel(" "), new ChessLabel(" "),
    // black
    new ChessLabel("\u265F"), new ChessLabel("\u265F"), new ChessLabel("\u265F"), 
    new ChessLabel("\u265F"), new ChessLabel("\u265F"), new ChessLabel("\u265F"), 
    new ChessLabel("\u265F"), new ChessLabel("\u265F"), new ChessLabel("\u265C"), 
    new ChessLabel("\u265E"), new ChessLabel("\u265D"), new ChessLabel("\u265B"), 
    new ChessLabel("\u265A"), new ChessLabel("\u265D"), new ChessLabel("\u265E"), 
    new ChessLabel("\u265C")
    };

    public Board() 
    {

    } // Board()

    void display()
    {
        setTitle("Chess board with unicode images");

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        Container contentPane = getContentPane();
        GridLayout gridLayout = new GridLayout(8, 8);

        contentPane.setLayout(gridLayout);

        int row = -1;
        for (int i = 0; i < labels.length; i++) 
        {
            if(i % 8 == 0) row ++; // increment row number
            labels[i].set(i, row);
            contentPane.add(labels[i]);
        } // i

        setSize(600, 600);
        setLocationRelativeTo(null);
        setVisible(true);
     } // display()

} // class Board

"而且 ChessBoardTest.java"
public class ChessBoardTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
        Board board = new Board();

        board.display();
    }

}

+1 - 将字体更改为“DejaVu Sans”即可正常工作。窗口大小需要微调,但非常简单易用 - 谢谢。 - OldCurmudgeon
请参阅如何在标签中“填充”Unicode字符。链接:https://dev59.com/umMl5IYBdhLWcg3wHTug#18686753。 - Andrew Thompson

3

请点击这里,了解一些不同的布局方式。其中一个你可能会感兴趣的是网格布局。使用它可以轻松地为方块添加JPanels。你也可以用它在棋盘周围添加标签,但这只是一种方法。请浏览网站上的示例代码和实例。


1
+1: GridLayout 可以确保所有方格的大小相同,因此它也可能是有用的。值得注意的是,并不需要一个 JPanel 的数组;代码可以直接将表示黑色/白色方块的 JLabel 添加到一个表示整个棋盘的单个 JPanel 中。 - Adamski

1
public class Pieces {

}

class Pawn_1 extends JComponent {

        private BufferedImage img;
        private Point imgPoint = new Point(0, 65);

        public Pawn_1() {
            try {
                img = ImageIO.read(new File("C:\\imgs\\b_pawn.png"));

            } catch (IOException ex) {
                ex.printStackTrace();
            }

            MouseAdapter ma = new MouseAdapter() {

                private Point offset;

                @Override
                public void mousePressed(MouseEvent e) {
                    Rectangle bounds = getImageBounds();
                    Point mp = e.getPoint();
                    if (bounds.contains(mp)) {
                        offset = new Point();
                        offset.x = mp.x - bounds.x;
                        offset.y = mp.y - bounds.y;
                    }
                }

                @Override
                public void mouseReleased(MouseEvent e) {
                    offset = null;
                }

                @Override
                public void mouseDragged(MouseEvent e) {
                    if (offset != null) {
                        Point mp = e.getPoint();
                        imgPoint.x = mp.x - offset.x;
                        imgPoint.y = mp.y - offset.y;
                        repaint();
                    }
                }

            };
            addMouseListener(ma);
            addMouseMotionListener(ma);
        }

        protected Rectangle getImageBounds() {
            Rectangle bounds = new Rectangle(0, 0, 0, 0);
            if (img != null) {
                bounds.setLocation(imgPoint);
                bounds.setSize(img.getWidth(), img.getHeight());
            }
            return bounds;
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(65, 65);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (img != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(img, imgPoint.x, imgPoint.y, this);
                g2d.dispose();
            }
        }
    }

0
 public void paintComponent(Graphics g) {                
    Graphics2D g2 = (Graphics2D)g;
    g2.setColor(Color.WHITE);
    int row = 0; 
    int col = 0;
    int sq = 65;

    while(row != (sq * 8)){
        if(row % 10 != 0 && col % 10 == 0)g2.setColor(Color.BLACK);
        if(row % 10 != 0 && col % 10 != 0)g2.setColor(Color.WHITE);
        if(row % 10 == 0 && col % 10 == 0)g2.setColor(Color.WHITE);
        if(row % 10 == 0 && col % 10 != 0)g2.setColor(Color.BLACK);

        g2.fillRect(row, col, sq, sq);
        row = row + sq;
        if(row == (sq * 8)){
            row = 0;
            col = col + sq;
            if(col == (sq * 8))break;
        }
    }


}

0
import java.awt.*;
import java.applet.*;
public class MyChes extends Applet
{
    public void paint(Graphics g)
    {
        for(int i=50;i<=400;i+=50)
        {
           for(int j=50;j<=400;j+=50)
           {
               if((i+j)%100==0)
               {
                  g.setColor(Color.black);
                  g.fillRect(i,j,50,50);
               }
           }
           g.drawRect(50,50,400,400);
         }
     }
}


请详细阐述您的答案。 - Divyang Desai

-1
import java.applet.*;
import java.lang.*;
import java.awt.*;

public class E10_2 extends Applet
{
    public void paint(Graphics g)
    {
        for(int x = 10; x < 330; x+=80)
        {
            for(int y = 10; y < 330; y+=80)
            {
                g.drawRect(8,8,322,322);
                g.drawRect(9,9,322,322);
                g.fillRect(x,y,40,40);
                g.fillRect(x+40,y+40,40,40);
            }
        }
    }
}

虽然这段代码可能回答了问题,但提供有关它如何解决问题以及为什么解决问题的额外上下文信息将会提高答案的长期价值。 - spongebob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接