这篇文章主要为大家详细介绍了Java实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古代的传统黑白棋种之一。发展于日本,流行于欧美。容易上手,老少皆宜,而且趣味横生,引人入胜;不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

前面在实现完一个JAVA的面板之后,就想着继续实现一个相较于面板更复杂一点的程序——五子棋。但是我在在搜索资料的时候,发现网上很多关于五子棋实现的博文都是一步到位,直接给个源代码,不是很适合新手学习。所以我这里打算记录一下自己实现五子棋的整个过程,大致会分为三四个阶段。今天我们先来实现第一个阶段的五子棋。同样的我们在着手写代码之前我们需要先做一些准备。

一个简单的JAVA小项目,主要实现的功能有:

一、下棋功能,在棋盘的交点处落子。

二、简单人机对战功能。

图示:

思路:1.首先构建一个Frame框架,来设置菜单选项与按钮点击事件。

MyFrame.java文件代码如下

package StartGame;import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JRadioButtonMenuItem;import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;//窗体框架类
public class MyFrame extends JFrame {// static boolean canPlay1 = false;判断是否可以开始游戏final MyPanel panel = new MyPanel();public MyFrame() {// 设置窗体的大小并居中this.setSize(500, 600); // 设置窗体大小this.setTitle("五子棋游戏"); // 设置窗体标题int width = Toolkit.getDefaultToolkit().getScreenSize().width;// 获取屏幕的宽度int height = Toolkit.getDefaultToolkit().getScreenSize().height;// 获取屏幕的高度this.setLocation((width - 500) / 2, (height - 500) / 2); // 设置窗体的位置(居中)this.setResizable(false); // 设置窗体不可以放大// this.setLocationRelativeTo(null);//这句话也可以设置窗体居中/** 菜单栏的目录设置*/// 设置菜单栏JMenuBar bar = new JMenuBar();this.setJMenuBar(bar);// 添加菜单栏目录JMenu menu1 = new JMenu("游戏菜单"); // 实例化菜单栏目录JMenu menu2 = new JMenu("设置");JMenu menu3 = new JMenu("帮助");bar.add(menu1); // 将目录添加到菜单栏bar.add(menu2);bar.add(menu3);JMenu menu4 = new JMenu("博弈模式"); // 将“模式”菜单添加到“设置”里面menu2.add(menu4);// JMenuItem item1=new JMenuItem("人人博弈");// JMenuItem item2=new JMenuItem("人机博弈");// 设置“”目录下面的子目录JRadioButtonMenuItem item1 = new JRadioButtonMenuItem("人人博弈");JRadioButtonMenuItem item2 = new JRadioButtonMenuItem("人机博弈");// item1按钮添加时间并且为匿名类item1.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setIsManAgainst(true);panel.Start();item1.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item2按钮的事件监听事件,也就是设置人机博弈item2.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setIsManAgainst(false);panel.Start();item2.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把人机博弈与人人博弈添加到一个按钮组里面ButtonGroup bg = new ButtonGroup();bg.add(item1);bg.add(item2);// 将按钮组添加到菜单里面menu4.add(item1);menu4.add(item2);item2.setSelected(true);// 先行设置JMenu menu5 = new JMenu("先行设置"); // 将“先行设置”菜单添加到“设置”里面menu2.add(menu5);// 设置黑子先行还是白字先行的按钮JRadioButtonMenuItem item3 = new JRadioButtonMenuItem("黑方先行");JRadioButtonMenuItem item4 = new JRadioButtonMenuItem("白字先行");// 设置item3的鼠标点击事件,设置黑方先行item3.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setIsBlack(true);panel.Start();item3.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置item4的鼠标点击事件item4.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setIsBlack(false);panel.Start();item4.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 设置按钮组并把人机博弈与人人博弈添加到一个按钮组里面ButtonGroup bg1 = new ButtonGroup();bg1.add(item3);bg1.add(item4);// 将按钮组添加到菜单里面menu5.add(item3);menu5.add(item4);item3.setSelected(true);// 设置“帮助”下面的子目录JMenuItem menu6 = new JMenuItem("帮助");menu3.add(menu6);/** 菜单栏的目录设置完毕*/// 开始游戏菜单设置JMenuItem menu7 = new JMenuItem("开始游戏");menu1.add(menu7);JMenuItem menu8 = new JMenuItem("重新开始");menu1.add(menu8);menu7.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubpanel.Start();// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});menu8.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否重新开始", "消息", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.Start();}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});// 退出游戏选项设置JMenuItem menu9 = new JMenuItem("退出游戏");menu1.add(menu9);menu9.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "退出游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否退出游戏", "消息", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {System.exit(0);// 退出程序}// panel.repaint();}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}});// 游戏难度设置JRadioButtonMenuItem item5 = new JRadioButtonMenuItem("傻瓜");// 添加按钮JRadioButtonMenuItem item6 = new JRadioButtonMenuItem("简单");JRadioButtonMenuItem item7 = new JRadioButtonMenuItem("普通");// JRadioButtonMenuItem item8= new JRadioButtonMenuItem("困难");ButtonGroup bg3 = new ButtonGroup();// 设置按钮组bg3.add(item5);bg3.add(item6);bg3.add(item7);// bg3.add(item8);JMenu menu10 = new JMenu("游戏难度设置");// 添加菜单到主菜单menu2.add(menu10);menu10.add(item5);// 添加选项到难度设置菜单menu10.add(item6);menu10.add(item7);// menu2.add(item8);item5.setSelected(true);// 默认选项按钮// 傻瓜难度设置的鼠标点击事件item5.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setGameDifficulty(0);panel.Start();item5.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 简单难度设置模式item6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "难度设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setGameDifficulty(1);panel.Start();item6.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});// 普通难度设置item7.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};Object[] options = { "保存并重新开始游戏", "不,谢谢" };int n = JOptionPane.showOptionDialog(null, "是否保存设置并重新开始", "人机博弈设置", 0, 1, icon, options, "保存并重新开始游戏");if (n == 0) {panel.setGameDifficulty(2);panel.Start();item7.setSelected(true);}}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});//游戏帮助提示信息menu6.addMouseListener(new MouseListener() {@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubIcon icon = new Icon() {@Overridepublic void paintIcon(Component c, Graphics g, int x, int y) {// TODO Auto-generated method stub}@Overridepublic int getIconWidth() {// TODO Auto-generated method stubreturn 0;}@Overridepublic int getIconHeight() {// TODO Auto-generated method stubreturn 0;}};JOptionPane.showMessageDialog(null, "制作人员:韩红剑");}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}});/** 窗口里面的容器设置*/Container con = this.getContentPane(); // 实例化一个容器父类con.add(panel); // 将容器添加到父类/** 窗口里面的容器设置完毕*/}}

第二步,设置显示棋盘的容器,文件源代码为MyPanel.java

package StartGame;import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.image.*;
import java.io.File;
import java.net.URL;
import java.util.Arrays;
import java.util.Random;import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;//设置窗体里面的容器操作
public class MyPanel extends JPanel implements MouseListener, Runnable {private static final Toolkit ResourceUtil = null;public Image boardImg; // 定义背景图片static int[][] allChess = new int[15][15]; // 棋盘数组static int[][] temporaryChess = new int[15][15];int x;// 保存棋子的横坐标int y;// 保存棋子的纵坐标Boolean canPlay = false; // 游戏是否继续,默认为继续Boolean isBlack = true;// 是否是黑子,默认为黑子Boolean isManAgainst = false; // 判断是否是人人对战String message = "用户下棋";Thread t = new Thread(this);int maxTime = 120;int blackTime = 120;int whiteTime = 120;String blackMessage = "无限制";String whiteMessage = "无限制";static int gameDifficulty = 0;// 设置游戏难度,0为傻瓜模式,1为简单,2为普通,3为困难// 获取isBlack的值
public boolean getIsBlack() {return this.isBlack;}// 设置isBlack的值public void setIsBlack(boolean isBlack) {this.isBlack = isBlack;}// 获取isManAgainst的值public boolean getIsManAgainst() {return this.isManAgainst;}// 获取isManAgainst的值public void setIsManAgainst(boolean isManAgainst) {this.isManAgainst = isManAgainst;}// 获取isManAgainst的值public int getGameDifficulty() {return this.gameDifficulty;}// 设置setGameDifficulty的值public void setGameDifficulty(int gameDifficulty) {this.gameDifficulty = gameDifficulty;}// 构造函数public MyPanel() {boardImg = Toolkit.getDefaultToolkit().getImage("./src/StartGame/fiveCHessBourd.jpg");this.repaint();// 添加鼠标监视器addMouseListener((MouseListener) this);// addMouseMotionListener((MouseMotionListener) this);// this.requestFocus();t.start();t.suspend();// 线程挂起// t.resume();}// 数据初始化@Overridepublic void paint(Graphics g) {super.paint(g);int imgWidth = boardImg.getWidth(this); // 获取图片的宽度int imgHeight = boardImg.getHeight(this); // 获取图片的高度int FWidth = getWidth();int FHeight = getHeight();String message; // 标记谁下棋int x = (FWidth - imgWidth) / 2;int y = (FHeight - imgHeight) / 2;g.drawImage(boardImg, x, y, null); // 添加背景图片到容器里面g.setFont(new Font("宋体", 0, 14));g.drawString("黑方时间:" + blackTime, 30, 470);g.drawString("白方时间:" + whiteTime, 260, 470);// 绘制棋盘for (int i = 0; i < 15; i++) {g.drawLine(30, 30 + 30 * i, 450, 30 + 30 * i);g.drawLine(30 + 30 * i, 30, 30 + 30 * i, 450);}// 绘制五个中心点g.fillRect(240 - 5, 240 - 5, 10, 10); // 绘制最中心的正方形g.fillRect(360 - 5, 360 - 5, 10, 10); // 绘制右下的正方形g.fillRect(360 - 5, 120 - 5, 10, 10); // 绘制右上的正方形g.fillRect(120 - 5, 360 - 5, 10, 10);// 绘制左下的正方形g.fillRect(120 - 5, 120 - 5, 10, 10);// 绘制左上的正方形// 定义棋盘数组for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {// if (allChess[i][j] == 1) {// // 黑子// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.fillOval(tempX - 7, tempY - 7, 14, 14);// }// if (allChess[i][j] == 2) {// // 白子// int tempX = i * 30 + 30;// int tempY = j * 30 + 30;// g.setColor(Color.WHITE);// g.fillOval(tempX - 7, tempY - 7, 14, 14);// g.setColor(Color.BLACK);// g.drawOval(tempX - 7, tempY - 7, 14, 14);// }draw(g, i, j); // 调用下棋子函数}}}// 鼠标点击时发生的函数@Overridepublic void mousePressed(MouseEvent e) {// x = e.getX();// 获取鼠标点击坐标的横坐标// y = e.getY();// 获取鼠标点击坐标的纵坐标// if (x >= 29 && x <= 451 && y >= 29 && y <= 451) { // 鼠标点击在棋子框里面才有效//// }if (canPlay == true) {// 判断是否可以开始游戏x = e.getX(); // 获取鼠标的焦点y = e.getY();if (isManAgainst == true) {// 判断是否是人人对战manToManChess();} else { // 否则是人机对战,人机下棋manToMachine();}}}// 判断是否输赢的函数private boolean checkWin(int x, int y) {// TODO Auto-generated method stubboolean flag = false;// 保存共有多少相同颜色棋子相连int count = 1;// 判断横向 特点:allChess[x][y]中y值相同int color = allChess[x][y];// 判断横向count = this.checkCount(x, y, 1, 0, color);if (count >= 5) {flag = true;} else {// 判断纵向count = this.checkCount(x, y, 0, 1, color);if (count >= 5) {flag = true;} else {// 判断右上左下count = this.checkCount(x, y, 1, -1, color);if (count >= 5) {flag = true;} else {// 判断左下右上count = this.checkCount(x, y, 1, 1, color);if (count >= 5) {flag = true;}}}}return flag;}// 判断相同棋子连接的个数private int checkCount(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 1;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14&& color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14&& color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}// 机器人判断黑棋相连的数量private int checkCountMachine(int x, int y, int xChange, int yChange, int color) {// TODO Auto-generated method stubint count = 0;int tempX = xChange;int tempY = yChange;while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0 && y + yChange <= 14&& color == allChess[x + xChange][y + yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}xChange = tempX;yChange = tempY;while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0 && y - yChange <= 14&& color == allChess[x - xChange][y - yChange]) {count++;if (xChange != 0) {xChange++;}if (yChange != 0) {if (yChange > 0) {yChange++;} else {yChange--;}}}return count;}public void paintConmponents(Graphics g) {super.paintComponents(g);}// 绘制黑白棋子public void draw(Graphics g, int i, int j) {if (allChess[i][j] == 1) {g.setColor(Color.black);// 黑色棋子g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}if (allChess[i][j] == 2) {g.setColor(Color.white);// 白色棋子g.fillOval(30 * i + 30 - 7, 30 * j + 30 - 7, 14, 14);g.drawString(message, 230, 20);}}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseReleased(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void run() {// TODO Auto-generated method stub// 判断是否有时间限制if (maxTime > 0) {while (true) {// System.out.println(canPlay + "11");if (isManAgainst) {if (isBlack) {blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");}} else {whiteTime--;if (whiteTime == 0) {JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");}}} else {// 监控黑子下棋的时间,也就是用户下棋的时间blackTime--;if (blackTime == 0) {JOptionPane.showMessageDialog(this, "用户超时,游戏结束!");}// 不监控电脑白字下棋}blackMessage = blackTime / 3600 + ":" + (blackTime / 60 - blackTime / 3600 * 60) + ":"+ (blackTime - blackTime / 60 * 60);whiteMessage = whiteTime / 3600 + ":" + (whiteTime / 60 - whiteTime / 3600 * 60) + ":"+ (whiteTime - whiteTime / 60 * 60);this.repaint();try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}// 点击开始游戏设置属性,游戏开始public void Start() {this.canPlay = true;for (int i = 0; i < 14; i++) {for (int j = 0; j < 14; j++) {allChess[i][j] = 0;}}if (canPlay == true) {t.resume();}this.repaint();JOptionPane.showMessageDialog(this, "游戏开始了,请开始下棋");if (isBlack == false && isManAgainst == false) {machineChess(gameDifficulty);}// 另一种方式 allChess=new int[19][19]// message = "黑方先行";//// isBlack = true;// blackTime = maxTime;// whiteTime = maxTime;// if (maxTime > 0) {// blackMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600// * 60) + ":"// + (maxTime - maxTime / 60 * 60);// whiteMessage = maxTime / 3600 + ":" + (maxTime / 60 - maxTime / 3600// * 60) + ":"// + (maxTime - maxTime / 60 * 60);// t.resume();// } else {// blackMessage = "无限制";// whiteMessage = "无限制";// }// this.repaint();// 如果不重新调用,则界面不会刷新}// 人人对战下棋函数public void manToManChess() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋子if (isBlack == true) {allChess[x][y] = 1;isBlack = false;blackTime = 120;message = "轮到白方";} else {allChess[x][y] = 2;isBlack = true;whiteTime = 120;message = "轮到黑方";}}// 判断这个棋子是否和其他棋子连成5个boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋子if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");canPlay = false;}} else {// JOptionPane.showMessageDialog(this,// "当前位子已经有棋子,请重新落子!!!");}}// 人机对战下棋函数public void manToMachine() {if (x >= 29 && x <= 451 && y >= 29 && y <= 451) {// System.out.println("在棋盘范围内:"+x+"--"+y);x = (x + 15) / 30 - 1; // 是为了取得交叉点的坐标y = (y + 15) / 30 - 1;if (allChess[x][y] == 0) {// 判断当前要下的是什么棋子if (isBlack == true) {allChess[x][y] = 1;this.repaint(); // 绘制棋子machineChess(gameDifficulty);isBlack = true;blackTime = 120;message = "用户下棋";whiteTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋子if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");canPlay = false;}} else {allChess[x][y] = 1;// allChess[x][y] = 2;this.repaint();isBlack = false;whiteTime = 120;blackTime = 120;boolean winFlag = this.checkWin(x, y);this.repaint(); // 绘制棋子if (winFlag == true) {JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜!");canPlay = false;}machineChess(gameDifficulty);}}// 判断这个棋子是否和其他棋子连成5个// boolean winFlag = this.checkWin(x, y);// this.repaint(); // 绘制棋子//// if (winFlag == true) {// JOptionPane.showMessageDialog(this, "游戏结束," + (allChess[x][y] ==// 1 ? "黑方" : "白方") + "获胜!");// canPlay = false;// }}}// 机器人下棋算法public void machineChess(int gameDifficulty) {if (gameDifficulty == 0) {int i, j;boolean chessSucceed = true;// 下棋成功的标志while (chessSucceed) {i = (int) (Math.random() * 15);j = (int) (Math.random() * 15);if (allChess[i][j] == 0) {allChess[i][j] = 2;chessSucceed = false;}}} else if (gameDifficulty == 1) {int max = 0;int m = 0, n = 0;int figureSort[] = new int[4];// 对棋子的四个方向进行打分for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (allChess[i][j] == 0) {figureSort[0] = checkCountMachine(i, j, 0, 1, 1);figureSort[1] = checkCountMachine(i, j, 1, 0, 1);figureSort[2] = checkCountMachine(i, j, 1, -1, 1);figureSort[3] = checkCountMachine(i, j, 1, 1, 1);sortFourFigure(figureSort);temporaryChess[i][j] = figureSort[0] * 12 + figureSort[1] * 25 + figureSort[2] * 50// 算出空白棋子的最大分+ figureSort[3] * 100;}// System.out.print(temporaryChess[i][j] + " ");}// System.out.print("\n");}// System.out.print("=============================\n");for (int i = 0; i < 15; i++) {for (int j = 0; j < 15; j++) {if (temporaryChess[i][j] > max && allChess[i][j] != 2 && allChess[i][j] != 1) {m = i;n = j;max = temporaryChess[i][j];}}}allChess[m][n] = 2;} else if (gameDifficulty == 2) {} else {}this.repaint();}// 对数组排序public void sortFourFigure(int n[]) {Arrays.sort(n);// 正序排序}
}

最后设置整个游戏的入口主函数StartEntrance.java

package StartGame;import javax.swing.JFrame;public class StartEntrance {//public static boolean canPlay =false;public static void main(String[] args) {// 实例化一个窗口MyFrame myFrame = new MyFrame();myFrame.setVisible(true); // 设置窗口为可见myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作属性}}

以上所有代码均调试通过,人机算法较为简单,可实现简单的防守功能。

Java实现五子棋(附详细源码)相关推荐

  1. JUC.Condition学习笔记[附详细源码解析]

    JUC.Condition学习笔记[附详细源码解析] 目录 Condition的概念 大体实现流程 I.初始化状态 II.await()操作 III.signal()操作 3个主要方法 Conditi ...

  2. 自动化测试如何保持登录状态_自动化测试po模式是什么?自动化测试po分层如何实现?-附详细源码...

    一.什么是PO模式 全称:page object model 简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage ...

  3. 实战|Python轻松实现动态网页爬虫(附详细源码)

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识. 项目背景 事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码) ...

  4. beautifulsoup解析动态页面div未展开_实战|Python轻松实现动态网页爬虫(附详细源码)...

    用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.项目背景事情是这样的,前几天我公众号写了篇爬虫入门的实战文章,叫做<实战|手把手教你用Python爬虫(附详细源码)&g ...

  5. Python编程:实现词云生成(附详细源码)

    Python编程:实现词云生成(附详细源码) 词云是一种数据可视化的方式,它可以用来展示某个主题下的主要关键词汇.在Python中,我们可以使用 wordcloud 库来实现词云的生成.本文将带您一步 ...

  6. 通俗易懂玩QT:Qpaint绘制开关按钮(内附详细源码)

    Qpaint 绘制开关按钮(内附详细源码) 一.实验效果与开发环境 效果图如下: 开发环境: 二.实验代码 switch.h #ifndef SWITCH_H #define SWITCH_H#inc ...

  7. 微信小程序开发【前端+后端(Java)】附完整源码,拿来接私活简直不要太香

    一.前言 现在微信小程序越来越火了,相信不少人都通过各种途径学习过微信小程序或者尝试开发,作者就是曾经由于兴趣了解开发过微信小程序,所以现在用这篇博客记录我之前开发的一些经验和一些心得吧. 二.主要内 ...

  8. python爬虫技术源码_实战|手把手教你用Python爬虫(附详细源码)

    大家好,我是J哥,专注原创,致力于用浅显易懂的语言分享爬虫.数据分析及可视化等干货,希望人人都能学到新知识.最近J哥做了个爬虫小项目,感觉还挺适合新手入门的,于是迫不及待想分享给大家. 什么是爬虫? ...

  9. 实战|手把手教你用Python爬虫(附详细源码)

    什么是爬虫? 实践来源于理论,做爬虫前肯定要先了解相关的规则和原理,要知道互联网可不是法外之地,你一顿爬虫骚操作搞不好哪天就- 首先,咱先看下爬虫的定义:网络爬虫(又称为网页蜘蛛,网络机器人,在FOA ...

最新文章

  1. [YTU]_2417 C语言习题 字符串长度
  2. python数据库操作nosql_用Python写一个NoSQL数据库
  3. vs下 string输出中文 打印中文
  4. 如何用最简单的方式理解傅立叶变换?
  5. 3 地理位置定位_IP地理定位API的十大用途和应用
  6. mysql修改密码后phpmyadmin 出现#1045
  7. [初级]Java中的switch对整型、字符型、字符串的具体实现细节
  8. 样式缓存没更新_差点没认出来:Office 2019/365桌面新图标来啦
  9. 大数据行业到底有多少种工作岗位,各自的技能需求是什么?
  10. 使用 Helm - 每天5分钟玩转 Docker 容器技术(163)
  11. 浅谈java中的接口
  12. 穿越计算机的迷雾--读书笔记二
  13. pta平台c语言作业答案,C语言PTA平台习题与答案.pdf
  14. 校园表白墙、微信表白墙、大学生树洞,交流圈子,用Fotoo创建
  15. 如何下载网站的在线视频
  16. 【网关】什么是网关、网桥和交换机(集线器、网桥、交换机、路由器、网关大解析)
  17. 一分钟学会手工注册BHO
  18. strcat函数的用法
  19. matlab中sym看不到值和属性,matlab 用sym定义了x,但是输入函数却显示“未定义函数或变量 'x'”?...
  20. vue-public文件夹

热门文章

  1. 制作6D姿态数据集常用的BCH码背景图下载
  2. mysql repeatableread_关于 MySQL 的事务隔离级别(REPEATABLE READ)
  3. annaconda安装
  4. 行列式,矩阵的秩,迹,范数,条件数
  5. C语言进阶之路:strtod()函数的用法!
  6. 关于字符串结束符'\0'
  7. 测评国内免费网站监控服务 - 监控宝,阿里云监控,百度云观测,360监控等对比
  8. 装系统相关 windows 爱纯净
  9. Unity中,Destory()和DestroyImmediate()的一些坑
  10. TensorFlow 加载多个模型的方法 - 知乎 https://zhuanlan.zhihu.com/p/53642222