gsetColorchessListigetColor;设置颜色 gfillOvalxPos-PointDIAMETER2 yPos-PointDIAMETER2 PointDIAMETER PointDIAMETER; gdrawImageshadows xPos-PointDIAMETER2 yPos-PointDIAMETE
完整代码如下:(增加了开始、暂停、存储棋局功能)
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
原文地址: https://www.cveoy.top/t/topic/gC4j 著作权归作者所有。请勿转载和采集!