Java五子棋(人机版),昨天买的棋子今天就用不上了
Posted 编程界小明哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java五子棋(人机版),昨天买的棋子今天就用不上了相关的知识,希望对你有一定的参考价值。
Java五子棋,老程序员也花了3天
作者简介
作者名:编程界明世隐
简介:CSDN博客专家,从事软件开发多年,精通Java、javascript,博主也是从零开始一步步把学习成长、深知学习和积累的重要性,喜欢跟广大ADC一起打野升级,欢迎您关注,期待与您一起学习、成长、起飞!
热门专栏推荐
【1】Java小游戏(俄罗斯方块、飞机大战、植物大战僵尸等)
【2】JavaWeb项目实战(图书管理、在线考试、宿舍管理等)
【3】JavaScript精彩实例(飞机大战、贪吃蛇、验证码等)
【4】Java小白入门200例
【5】从零学Java、趣学Java
【6】Idea从零到精通
系列目录
1. Java俄罗斯方块
2. 老Java程序员花2天写了个连连看
3. 老Java程序员花一天时间写了个飞机大战
4. Java植物大战僵尸
5. Java消消乐(天天爱消除)
6. Java贪吃蛇小游戏
7. Java扫雷小游戏
8. 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();
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");
//重新开始
public void restart()
//游戏开始标记
gameFlag="start";
@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);
运行一下
绘制棋盘
重写paint方法
@Override
public void paint(java.awt.Graphics g)
super.paint(g);
绘制横竖相交接的线
定义15行、15列
public static final int ROWS=15;
public static final int COLS=15;
绘制网格
//绘制网格
private void drawGrid(Graphics g)
Graphics2D g_2d=(Graphics2D)g;
int start=26;
int x1=start;
int y1=20;
int x2=586;
int y2=20;
for (int i = 0; i < ROWS; i++)
y1 = start + 40*i;
y2 = y1;
g_2d.drawLine(x1, y1, x2, y2);
y1=start五子棋人机对战