介绍
JavaSE实践五子棋和中国象棋游戏,棋盘,棋子绘制,输赢判定重置棋盘,单机博弈。
五子棋棋盘
中国象棋棋盘
使用说明
- 启动类 Main.java, 面板类 Panel.java绘制棋盘和玩法,实体类 ChessPiecesNode.java
- 启动类 Main.java中的 listener 方法监听五子棋结束状态
//监听游戏结束自动重绘面板
public static void listener(Panel panel, JFrame jFrame) {
panel.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("status") && evt.getNewValue() != null && (Boolean) evt.getNewValue()) {
com.xq.cn.views.Panel panelNew = new Panel(TypeEnum.GOMOKU.getType(), 800, 800, 15, 15);
jFrame.add(new JLabel("This is Panel 2"));
jFrame.remove(panel);
jFrame.add(panelNew);
jFrame.revalidate(); // 重新验证布局
jFrame.repaint();// 请求重绘组件
listener(panelNew, jFrame);
}
}
});
}
- 面板类 Panel.java绘制棋盘和玩法
五子棋判断五子一线的算法如上图,观察数据后得出结论为:五子一线时组成的数列刚好是一组等差数列,由此得出下方的算法
//获取任意节点连成五子的所有可能
public List<Integer> arithmeticSequence(Integer id, Integer step) {
//1、等差步长为step的等差数列
List<Integer> listStep = new ArrayList<>();
for (int i = 1; i <= 5; i++) {
listStep.add(id + ((i - 1) * step));
}
for (int i = 1; i <= 5; i++) {
int num = id - ((i - 1) * step);
if (num <= 0) {
break;
}
listStep.add(num);
}
eturn listStep;
}
- 实体类 ChessPiecesNode.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChessPiecesNode {
/**
* 坐标点(交点索引,从左往右,从上往下计数)
*/
private Integer id;
/**
* 坐标点x
*/
private Integer x;
/**
* 坐标点y
*/
private Integer y;
/**
* 在棋盘中对应的最小点击点位对应的坐标点x
*/
private Integer minX;
/**
* 在棋盘中对应的最小点击点位对应的坐标点y
*/
private Integer minY;
/**
* 在棋盘中对应的最大点击点位对应的坐标点x
*/
private Integer maxX;
/**
* 在棋盘中对应的最大点击点位对应的坐标点y
*/
private Integer maxY;
/**
* 坐标点使用状态(0-未被使用,1-已使用)
*/
private Integer status;
/**
* 棋子对应的颜色
*/
private Color color;
/**
* 被使用的类型(黑/白)
*/
private Integer type;
}
视频展示
项目地址
传送门