Java五子棋(人机版),昨天买的棋子今天就用不上了

效果图

由于篇长的原因有需要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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值