效果图

由于篇长的原因有需要LeetCode刷题笔记+视频中源码资料+Java全栈开发学习路线图私信回复“java笔记”
实现思路
1.创建运行窗口并添加背景色。
2.绘制棋盘。
3.用二维数组来控制起码落子位置、绘制指示器。
4.鼠标在落子位置处点击可落子。
5.落子后检查是否获得胜利。
6.机器判断下一步,并落子。
7.机器判断是否获得胜利。
代码实现
创建窗口
首先创建一个游戏窗体类GameFrame,继承至JFrame,用来显示在屏幕上(window的对象),每个游戏都有一个窗口,设置好窗口标题、尺寸、布局等就可以。
/*
* 游戏窗体类
*/
public class GameFrame extends JFrame {
public GameFrame() {
setTitle("五子棋");//设置标题
setSize(620, 670);//设定尺寸
getContentPane().setBackground(new Color(209,146,17));//添加背景色
setLayout(new BorderLayout());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//点击关闭按钮是关闭程序
setLocationRelativeTo(null); //设置居中
setResizable(false); //不允许修改界面大小
}
}
创建面板容器GamePanel继承至JPanel
import javax.swing.JFrame;
import javax.swing.JPanel;
/*
* 画布类
*/
public class GamePanel extends JPanel {
private static final long serialVersionUID = 1L;
GamePanel gamePanel=this;
private JFrame mainFrame=null;
//构造里面初始化相关参数
public GamePanel(JFrame frame){
this.setLayout(null);
this.setOpaque(false);
mainFrame = frame;
mainFrame.requestFocus();
mainFrame.setVisible(true);
}
}
再创建一个Main类,来启动这个窗口。
public class Main {
//主类
public static void main(String[] args) {
GameFrame frame = new GameFrame();
GamePanel gamePanel = new GamePanel(frame);
frame.add(gamePanel);
frame.setVisible(true);//设定显示
}
}
右键执行这个Main类,窗口建出来了

创建菜单及菜单选项创建菜单
private void initMenu(){
// 创建菜单及菜单选项
jmb = new JMenuBar();
JMenu jm1 = new JMenu("游戏");
jm1.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
JMenu jm2 = new JMenu("帮助");
jm2.setFont(new Font("思源宋体", Font.BOLD, 18));// 设置菜单显示的字体
JMenuItem jmi1 = new JMenuItem("开始新游戏");
JMenuItem jmi2 = new JMenuItem("退出");
jmi1.setFont(new Font("思源宋体", Font.BOLD, 18));
jmi2.setFont(new Font("思源宋体", Font.BOLD, 18));
JMenuItem jmi3 = new JMenuItem("操作说明");
jmi3.setFont(new Font("思源宋体", Font.BOLD, 18));
JMenuItem jmi4 = new JMenuItem("成功/失败判定");
jmi4.setFont(new Font("思源宋体", Font.BOLD, 18));
jm1.add(jmi1);
jm1.add(jmi2);
jm2.add(jmi3);
jm2.add(jmi4);
jmb.add(jm1);
jmb.add(jm2);
mainFrame.setJMenuBar(jmb);// 菜单Bar放到JFrame上
jmi1.addActionListener(this);
jmi1.setActionCommand("Restart");
jmi2.addActionListener(this);
jmi2.setActionCommand("Exit");
jmi3.addActionListener(this);
jmi3.setActionCommand("help");
jmi4.addActionListener(this);
jmi4.setActionCommand("lost");
}
实现ActionListener并重写方法actionPerformed

此时GamePanel是报错的,重写actionPerformed方法。
actionPerformed方法的实现
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
System.out.println(command);
UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体", Font.ITALIC, 18)));
if ("Exit".equals(command)) {
Object[] options = { "确定", "取消" };
int response = JOptionPane.showOptionDialog(this, "您确认要退出吗", "",
JOptionPane.YES_OPTION, JOptionPane.QUESTION_MESSAGE, null,
options, options[0]);
if (response == 0) {
System.exit(0);
}
}else if("Restart".equals(command)){
if(!"end".equals(gamePanel.gameFlag)){
JOptionPane.showMessageDialog(null, "正在游戏中无法重新开始!",
"提示!", JOptionPane.INFORMATION_MESSAGE);
}else{
if(gamePanel!=null) {
gamePanel.restart();
}
}
}else if("help".equals(command)){
JOptionPane.showMessageDialog(null, "鼠标在指示器位置点下,则落子!",
"提示!", JOptionPane.INFORMATION_MESSAGE);
}else if("lost".equals(command)){
JOptionPane.showMessageDialog(null, "五子连珠方获得胜利!",
"提示!", JOptionPane.INFORMATION_MESSAGE);
}
}
此时的GamePanel代码如下:
package main;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.plaf.FontUIResource;
/*
* 画布类
*/
public class GamePanel extends JPanel implements ActionListener{
private static final long serialVersionUID = 1L;
GamePanel gamePanel=this;
private JFrame mainFrame=null;
JMenuBar jmb=null;
public String gameFlag="";
//构造里面初始化相关参数
public GamePanel(JFrame frame){
this.setLayout(null);
this.setOpaque(false);
mainFrame = frame;
//创建按钮
initMenu();
mainFrame.requestFocus();
mainFrame.setVisible(true);
}
private void initMenu(){
// 创建菜单及菜单选项
jmb = new JMenuBar