完整代码如下:(增加了开始、暂停、存储棋局功能)

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.awt.geom.RadialGradientPaint;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

public class ChessPanel extends JPanel implements MouseListener, GameInterface {

    private static final long serialVersionUID = 1L;

    private static final int MARGIN = 30; // 边距
    private static final int GRID_SPAN = 35; // 网格间距
    private static final int ROWS = 15; // 行数
    private static final int COLS = 15; // 列数
    private static final int POINT_SIZE = 10; // 点的直径
    private static final int PIECE_SIZE = 34; // 棋子的直径

    private Point[] chessList = new Point[(ROWS + 1) * (COLS + 1)]; // 存储棋子的数组
    private int chessCount = 0; // 当前棋盘棋子个数
    private boolean isBlack = true; // 当前棋手是否为黑棋
    private boolean gameOver = false; // 游戏是否结束
    private int xIndex; // 当前下棋子的索引
    private int yIndex;

    private JButton restartButton; // 重新开始按钮
    private JButton backButton; // 悔棋按钮
    private JButton saveButton; // 存储棋局按钮
    private JButton startButton; // 开始游戏按钮

    private List<Point> historyList = new ArrayList<Point>(); // 存储棋谱

    public ChessPanel() {
        setBackground(Color.WHITE);
        addMouseListener(this);

        restartButton = new JButton("重新开始");
        backButton = new JButton("悔棋");
        saveButton = new JButton("存储棋局");
        startButton = new JButton("开始游戏");

        restartButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                restartGame();
            }
        });

        backButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                goback();
            }
        });

        saveButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                saveGame();
            }
        });

        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                startGame();
            }
        });

        add(restartButton);
        add(backButton);
        add(saveButton);
        add(startButton);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 绘制棋盘
        for (int i = 0; i <= ROWS; i++) {
            g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS * GRID_SPAN, MARGIN + i * GRID_SPAN);
        }
        for (int i = 0; i <= COLS; i++) {
            g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN, MARGIN + ROWS * GRID_SPAN);
        }

        // 绘制点
        g.fillOval(MARGIN + 3 * GRID_SPAN - POINT_SIZE / 2, MARGIN + 3 * GRID_SPAN - POINT_SIZE / 2, POINT_SIZE,
                POINT_SIZE);
        g.fillOval(MARGIN + 11 * GRID_SPAN - POINT_SIZE / 2, MARGIN + 3 * GRID_SPAN - POINT_SIZE / 2, POINT_SIZE,
                POINT_SIZE);
        g.fillOval(MARGIN + 7 * GRID_SPAN - POINT_SIZE / 2, MARGIN + 7 * GRID_SPAN - POINT_SIZE / 2, POINT_SIZE,
                POINT_SIZE);
        g.fillOval(MARGIN + 3 * GRID_SPAN - POINT_SIZE / 2, MARGIN + 11 * GRID_SPAN - POINT_SIZE / 2, POINT_SIZE,
                POINT_SIZE);
        g.fillOval(MARGIN + 11 * GRID_SPAN - POINT_SIZE / 2, MARGIN + 11 * GRID_SPAN - POINT_SIZE / 2, POINT_SIZE,
                POINT_SIZE);

        // 绘制棋子
        for (int i = 0; i < chessCount; i++) {
            int xPos = chessList[i].getX() * GRID_SPAN + MARGIN;
            int yPos = chessList[i].getY() * GRID_SPAN + MARGIN;
            Color colortemp;
            g.setColor(chessList[i].getColor());
            colortemp = chessList[i].getColor();
            if (colortemp == Color.black) {
                RadialGradientPaint paint = new RadialGradientPaint(xPos - PIECE_SIZE / 2 + 25,
                        yPos - PIECE_SIZE / 2 + 10, 20, new float[] { 0f, 1f }, new Color[] { Color.WHITE, Color.BLACK });
                ((Graphics2D) g).setPaint(paint);
                ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
                        RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);

            } else if (colortemp == Color.white) {
                RadialGradientPaint paint = new RadialGradientPaint(xPos - PIECE_SIZE / 2 + 25,
                        yPos - PIECE_SIZE / 2 + 10, 70, new float[] { 0f, 1f }, new Color[] { Color.WHITE, Color.BLACK });
                ((Graphics2D) g).setPaint(paint);
                ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                ((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION,
                        RenderingHints.VALUE_ALPHA_INTERPOLATION_DEFAULT);

            }

            Ellipse2D e = new Ellipse2D.Float(xPos - PIECE_SIZE / 2, yPos - PIECE_SIZE / 2, 34, 35);
            ((Graphics2D) g).fill(e);

            // 标记最后一个棋子的红矩形框
            if (i == chessCount - 1) {
                g.setColor(Color.red);
                g.drawRect(xPos - PIECE_SIZE / 2, yPos - PIECE_SIZE / 2, 34, 35);
            }
        }
    }

    public void mousePressed(MouseEvent e) {
        // 游戏结束时,不再能下
        if (gameOver)
            return;

        // 如果未点击开始按钮,提示当前处于暂停情况
        if (!startButton.isEnabled()) {
            JOptionPane.showMessageDialog(this, "当前处于暂停情况,请点击开始按钮继续游戏。");
            return;
        }

        String colorName = isBlack ? "黑棋" : "白棋";

        // 将鼠标点击的坐标位置转换成网格索引
        xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;
        yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;

        // 落在棋盘外不能下
        if (xIndex < 0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS) {
            JOptionPane.showMessageDialog(this, "落子位置不合法,请重新落子!");
            return;
        }

        // 如果点击的位置已经有棋子存在,不能下
        if (findChess(xIndex, yIndex)) {
            JOptionPane.showMessageDialog(this, "该位置已经有棋子,请重新落子!");
            return;
        }

        // 可以进行时的处理
        Point ch = new Point(xIndex, yIndex, isBlack ? Color.black : Color.white);
        chessList[chessCount++] = ch;
        repaint();// 通知系统重新绘制

        // 将当前落子加入棋谱
        historyList.add(ch);

        // 如果胜出则给出提示信息,不能继续下棋
        if (isWin()) {
            String msg = String.format("恭喜,%s赢了!", colorName);
            JOptionPane.showMessageDialog(this, msg);
            gameOver = true;
        }
        isBlack = !isBlack;
    }

    // 覆盖mouseListener
gsetColorchessListigetColor;设置颜色 gfillOvalxPos-PointDIAMETER2 yPos-PointDIAMETER2 PointDIAMETER PointDIAMETER; gdrawImageshadows xPos-PointDIAMETER2 yPos-PointDIAMETE

原文地址: https://www.cveoy.top/t/topic/gC4j 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录