首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 五子棋:Graphics 繪製棋盤與棋子精準落點實現

     編輯:程式設計疑難解答

需求分析

使用 Graphics 繪製棋盤格線,滑鼠點擊在對應格線交叉點顯示棋子,無視覺偏移。

核心實現邏輯

  1. 棋盤模型:定義常量 GRID_SIZE(格寬/高)、MARGIN(邊距)、ROWS/COLS(行列數)。
  2. 繪製棋盤:paintComponent(Graphics g) 循環畫橫豎線。
  3. 坐標轉換(關鍵):
    • 滑鼠點擊像素座標 (mx, my) → 最近格線交叉點索引 (row, col):
      int col = Math.round((mx - MARGIN) / (float)GRID_SIZE);
      int row = Math.round((my - MARGIN) / (float)GRID_SIZE);
      
    • 邊界校驗:0 <= row < ROWS && 0 <= col < COLS。
    • 落子像素座標:cx = MARGIN + col * GRID_SIZE, cy = MARGIN + row * GRID_SIZE。
  4. 狀態存儲:int[][] board = new int[ROWS][COLS],0=空,1=黑,2=白。
  5. 重繪觸發:落子後 repaint(),paintComponent 遍歷 board 畫棋子(g.fillOval(cx-R, cy-R, 2R, 2R))。

關鍵代碼片段


public class BoardPanel extends JPanel {
    static final int GRID = 40, MARGIN = 30, ROWS = 15, COLS = 15, R = 16;
    int[][] board = new int[ROWS][COLS];
    int currentPlayer = 1;

    public BoardPanel() {
        addMouseListener(new MouseAdapter() {
            @Override public void mouseClicked(MouseEvent e) {
                int col = Math.round((e.getX() - MARGIN) / (float)GRID);
                int row = Math.round((e.getY() - MARGIN) / (float)GRID);
                if (row>=0 && row=0 && col2
                    repaint();
                }
            }
        });
    }

    @Override protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        // 畫格線
        for (int i=0; i<=ROWS; i++) g.drawLine(MARGIN, MARGIN+i*GRID, MARGIN+COLS*GRID, MARGIN+i*GRID);
        for (int j=0; j<=COLS; j++) g.drawLine(MARGIN+j*GRID, MARGIN, MARGIN+j*GRID, MARGIN+ROWS*GRID);
        // 畫棋子
        for (int r=0; r

參考資源

完整項目源碼可參考:Java 五子棋實現

核心秘訣:**浮點除法 + Math.round 找最近格點**,而非整數除法截斷,消除邊緣偏移,棋子精準落在格線交叉點中心。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved