常识可得,一个玩家获胜肯定是当前的一颗棋子,和之前的棋子组成了连续的五个棋子。

所以只要从当前棋子出发,从四个方向分别找到最边界的棋子,然后往后数相同颜色的棋子个数即可判断输赢。

例:如下图所示,现在有四个白棋:

然后现在再下一个白棋,我们从刚下的位置开始向左上方移动,找到最左上的白棋,然后从最左上的白棋,向右下移动。在途径都是白棋的情况下,开始计数,超过五个即可得白棋获胜。

代码实现如下图所示:

首先声明一个二维数组,存储五子棋的位置

 private int [][]broadChess= new int[broadScale][broadScale];
//0表示无棋,1表示白棋,2表示黑棋
sidePosX=posX;sidePosY=posY;tempMaxChess=0;
//这里的sidePosX与sidePosY表示边界棋子(最左上的棋子在数组中的位置)
//tempMaxChess即这个方向的有多少个连续且相同颜色的棋子和刚下的棋子相连
//posX,posY是刚下的棋子在二维数组的坐标
for(i =posX-1,j=posY-1;i>=0 && j>=0;i--,j--){//查找行最上边同色棋子if(broadChess[i][j] == broadChess[posX][posY]){sidePosX -=1;sidePosY -=1;}elsebreak;}
for(i =sidePosX,j=sidePosY;i<broadScale && j<broadScale;i++,j++){//查找斜行\if(broadChess[i][j] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;//查找到不同颜色就突出}
maxChess = Math.max(tempMaxChess, maxChess);//与之前的方向得到的最大数据进行比较

一共四个方向(—,|,\,/)

这四个方向的代码实现:

    private int [][]broadChess= new int[broadScale][broadScale];//0表示无棋,1表示白棋,2表示黑棋public int keepPlaying(int posX,int posY){//输入为1查找白棋,输入为2查找黑棋if(broadChess[posX][posY] == 0)//需要输入刚下的棋子在二维数组的序号return 0;int tempMaxChess;int maxChess=0;int sidePosX;int sidePosY;int i,j;sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posX-1;i>=0;i--){//查找行if(broadChess[i][posY] == broadChess[posX][posY]){sidePosX -=1;}elsebreak;}for(i =sidePosX;i<broadScale;i++){if(broadChess[i][posY] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posY-1;i>=0;i--){//查找列if(broadChess[posX][i] == broadChess[posX][posY]){sidePosY -=1;}elsebreak;}for(i =sidePosY;i<broadScale;i++){if(broadChess[posX][i] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posX-1,j=posY-1;i>=0 && j>=0;i--,j--){//查找斜率-1的斜行\if(broadChess[i][j] == broadChess[posX][posY]){sidePosX -=1;sidePosY -=1;}elsebreak;}for(i =sidePosX,j=sidePosY;i<broadScale && j<broadScale;i++,j++){if(broadChess[i][j] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posX+1,j=posY-1;i<broadScale && j>=0;i++,j--){//查找斜率为1的斜行/if(broadChess[i][j] == broadChess[posX][posY]){sidePosX +=1;sidePosY -=1;}elsebreak;}for(i =sidePosX,j=sidePosY;i>=0 && j<broadScale;i--,j++){if(broadChess[i][j] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);return maxChess>=5?broadChess[posX][posY]:0;//返回是否胜利,若有胜者则返回胜者棋子颜色}

都写到这个,就给个五子棋游戏的实现:

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class BroadGame {BufferedImage broad ;BufferedImage whiteChess;BufferedImage blackChess;BufferedImage choiceChess ;Frame frame = new Frame("五子棋游戏");Panel p1 = new Panel();private int broadWidth = 535;//broad.getWidth();private int broadHeight = 536;//broad.getHeight();private final int broadScale=15;private final int heightExc=6;private final int widthExc=5;//0表示无棋,1表示白棋,2表示黑棋private int [][]broadChess= new int[broadScale][broadScale];Button buttonWhite = new Button("white");Button buttonBlack= new Button("black");Button buttonRetract = new Button("retract");private int firstOne=1;//0表示悔棋,1表示白棋,2表示黑棋private int choiceX=-1;private int choiceY=-1;private final int RATE = broadHeight/broadScale;private int is_end = 0;int x1,y1,x2,y2;int xPos,yPos;private class ChessPaint extends JPanel {public void not_end(Graphics g){//画图板g.drawImage(broad, 0, 0, null);//画选择红框if (choiceX > 0 && choiceY > 0) {g.drawImage(choiceChess, choiceX * RATE + widthExc, choiceY * RATE + heightExc, null);}for (int i = 0; i < broadScale; ++i) {for (int j = 0; j < broadScale; ++j) {if (broadChess[i][j] == 1) {g.drawImage(whiteChess, i * RATE + widthExc, j * RATE + heightExc, null);} else if (broadChess[i][j] == 2) {g.drawImage(blackChess, i * RATE + widthExc, j * RATE + heightExc, null);}}}//二维循环}@Overridepublic void paint(Graphics g) {not_end(g);if(is_end != 0) {//设置颜色并绘制小球//g.setColor(Color.RED);//g.drawLine(x1 * RATE + widthExc,y1 * RATE + heightExc,x2 * RATE + widthExc,y2 * RATE + widthExc);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}g.setColor(Color.WHITE);g.fillRect(0,0,broadWidth,broadHeight);g.setColor(Color.BLACK);g.setFont(new Font("Times",Font.BOLD,30));if(is_end == 1)g.drawString("游戏结束!"+"白棋胜利",broadWidth/2-120,200);else if(is_end == 2)g.drawString("游戏结束!"+"黑棋胜利",broadWidth/2-120,200);}}//paint重写}//类定义public void updateBtnColor(Color whiteBtnColor,Color blackBtnColor,Color clearBtnColor){buttonWhite.setBackground(whiteBtnColor);buttonBlack.setBackground(blackBtnColor);buttonRetract.setBackground(clearBtnColor);}public int keepPlaying(int posX,int posY){//输入为1查找白棋,输入为2查找黑棋if(broadChess[posX][posY] == 0)return 0;int tempMaxChess;int maxChess=0;int sidePosX;int sidePosY;sidePosX=posX;sidePosY=posY;tempMaxChess=0;int i,j;for(i =posX-1;i>=0;i--){//查找行最左边同色棋子if(broadChess[i][posY] == broadChess[posX][posY]){sidePosX -=1;}elsebreak;}for(i =sidePosX;i<broadScale;i++){//查找行if(broadChess[i][posY] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);if(maxChess == tempMaxChess){x1=sidePosX;y1=sidePosY;x2=i-1;y2=sidePosY;}sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posY-1;i>=0;i--){//查找行最上边同色棋子if(broadChess[posX][i] == broadChess[posX][posY]){sidePosY -=1;}elsebreak;}for(i =sidePosY;i<broadScale;i++){//查找列if(broadChess[posX][i] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);if(maxChess == tempMaxChess){x1=sidePosX;y1=sidePosY;x2=sidePosX;y2=i-1;}sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posX-1,j=posY-1;i>=0 && j>=0;i--,j--){//查找行最上边同色棋子if(broadChess[i][j] == broadChess[posX][posY]){sidePosX -=1;sidePosY -=1;}elsebreak;}for(i =sidePosX,j=sidePosY;i<broadScale && j<broadScale;i++,j++){//查找斜行\if(broadChess[i][j] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);if(maxChess == tempMaxChess){x1=sidePosX;y1=sidePosY;x2=i-1;y2=j-1;}sidePosX=posX;sidePosY=posY;tempMaxChess=0;for(i =posX+1,j=posY-1;i<broadScale && j>=0;i++,j--){//查找行最上边同色棋子if(broadChess[i][j] == broadChess[posX][posY]){sidePosX +=1;sidePosY -=1;}elsebreak;}for(i =sidePosX,j=sidePosY;i>=0 && j<broadScale;i--,j++){//查找斜行/if(broadChess[i][j] == broadChess[posX][posY]){tempMaxChess +=1;}elsebreak;}maxChess = Math.max(tempMaxChess, maxChess);if(maxChess == tempMaxChess){x1=sidePosX;y1=sidePosY;x2=i+1;y2=j-1;}return maxChess>=5?broadChess[posX][posY]:0;}//按钮添加监听public void init() throws IOException {updateBtnColor(Color.BLUE,Color.GRAY,Color.GRAY);ActionListener listener=(e) -> {String actionCommand=e.getActionCommand();switch (actionCommand){case "white":firstOne=1;updateBtnColor(Color.BLUE,Color.GRAY,Color.GRAY);break;case "black":firstOne=2;updateBtnColor(Color.GRAY,Color.BLUE,Color.GRAY);break;case "retract":firstOne=0;updateBtnColor(Color.GRAY,Color.GRAY,Color.BLUE);break;}};buttonWhite.addActionListener(listener);buttonBlack.addActionListener(listener);buttonRetract.addActionListener(listener);p1.add(buttonWhite);p1.add(buttonBlack);p1.add(buttonRetract);frame.add(p1,BorderLayout.SOUTH);ChessPaint chessPaint = new ChessPaint();//初始化黑棋,白棋,棋盘,选中框broad = ImageIO.read(new File("..\\img\\board.jpg"));whiteChess = ImageIO.read(new File("..\\img\\white.gif"));blackChess = ImageIO.read(new File("..\\img\\black.gif"));choiceChess = ImageIO.read(new File("..\\img\\selected.gif"));//初始化二维数组,默认情况下,所有位置处都没有棋子//设置chessPaint的最佳大小chessPaint.setPreferredSize(new Dimension(broadWidth,broadHeight));//给chessPaint注册鼠标监听器chessPaint.addMouseListener(new MouseAdapter() {//鼠标单击会触发@Overridepublic void mouseClicked(MouseEvent e) {//将用户鼠标的坐标,转换成棋子的坐标xPos = (e.getX()-heightExc)/RATE;yPos = (e.getY()-widthExc)/RATE;broadChess[xPos][yPos] = firstOne;if(firstOne == 1)firstOne=2;elsefirstOne=1;//重绘chessPaintchessPaint.repaint();is_end=keepPlaying(xPos,yPos);}//当鼠标退出棋盘区域后,复位选中坐标,重绘chessPaint,要保证红色选中框显示正确@Overridepublic void mouseExited(MouseEvent e) {choiceX=-1;choiceY=-1;chessPaint.repaint();}});//给chessPaint注册鼠标移动监听器chessPaint.addMouseMotionListener(new MouseMotionAdapter() {//当鼠标移动时,修正choiceX和choicetY,重绘chessPaint,要保证红色选中框显示正确@Overridepublic void mouseMoved(MouseEvent e) {//将鼠标的坐标,转换成棋子的索引choiceX = (e.getX()-widthExc)/RATE;choiceY = (e.getY()-heightExc)/RATE;chessPaint.repaint();}});//把chessPaint添加到frame中frame.add(chessPaint);//设置frame最佳大小并可见frame.pack();frame.setVisible(true);frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}public static void main(String[] args) throws IOException {new BroadGame().init();}
}

其中的图片元素:

记得把File类参数填完喔

图片是B站一个UP @黑马程序员 提供的,五子棋的实现也是基于其改进的

五子棋规则的实现及代码相关推荐

  1. element-UI框架使用validate.js的form校验规则(+自定义验证代码)- 应用篇

    文章目录 element-UI除了官方给出的校验规则,还可以自定义(举例如下) 代码示例: 参考文章: element-UI除了官方给出的校验规则,还可以自定义(举例如下) element-UI框架f ...

  2. java五子棋项目创新点_五子棋规则的改革创新方法

    五子棋规则最近几年来,关于五子棋规则改革的讨论掀起了一阵阵高潮,形态各异的新规则层出无穷,可谓是对各种规则改革方案的大胆设想.下面小编给你介绍五子棋规则的改革创新,欢迎阅读. 五子棋大多数新规则跟流星 ...

  3. 五子棋人机对战完整代码

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转 目录 〇,前言 一,五子棋棋盘 二,五子棋比赛规则 1,行棋顺序 2,判断胜负 三,重要棋型解释 1,五连 ...

  4. canvas学习之五子棋规则法部分实现

    前言 想学习下vue中使用canvas,直接学习感觉太无聊,通过实现五子棋增加些乐趣,过程中发现规则算法实现起来还是有一些复杂度的 代码实现 初步代码结构 <template><ca ...

  5. c语言五子棋蒙特卡洛,五子棋对弈——MCTS学习(示例代码)

    初识AlphaZero AlphaZero能够基于强化学习实现较高技巧的棋类博弈,我看过nb网友实现的基于MCTS的五子棋模型后,惊叹不已!特此记录一下其中训练的一些方法和技巧. MCTS MCTS是 ...

  6. 【Groovy】集合遍历 ( 使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 | 代码示例 )

    文章目录 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 二.代码示例 一.使用集合的 collect 循环遍历集合并根据指定闭包规则生成新集合 调用集合的 collect ...

  7. 前缀、中缀和后缀表达式详解,中缀表达式到后缀表达式的转换规则,以及后缀表达式的计算规则,附计算代码

    1. 中缀.前缀和后缀表达式 1.1 中缀表达式 首先,中缀表达式的这个"缀"指运算符在两个操作数的位置.中缀表达式其实就是我们常用的算术表达式,比如 2 + 9 - (32 * ...

  8. 资深程序猿冒死揭开软件潜规则:无法维护的代码

    原始博文公布于: Roedy Green's Mindproducts (http://mindprod.com/unmain.html ).  翻译链接: 点击打开链接 2014年11月25日 03 ...

  9. php 采集 过滤,dedecms采集过滤规则 万能采集过滤代码 常用过滤

    织梦dedecms自带的采集系统确实很不错,可以免去一些手工添加信息的麻烦,设置一下dede采集规则.采集点,然后点采集,OK,几百篇文章就搞定了! 呵呵,确实很省事的!下面介绍几种常用采集规则的过滤 ...

最新文章

  1. AnimatorController即动画控制器创建的BUG
  2. ArrayList,LinkedList,Vector的异同点
  3. matlab and操作,系统建模 | Control Tutorials for Matlab and Simulink
  4. WINCE下I/O操作基础
  5. linux netcat测试udp端口,使用nc(netcat)测试udp协议与端口连通性
  6. ios客户端做屏蔽_Transmission 屏蔽迅雷反吸血脚本
  7. python基础:集合操作
  8. 提高效率: Atom ,介绍几个实用插件,组合使用
  9. ssm医院人事管理系统设计与实现 毕业设计源码111151
  10. Netty权威指南2.2伪异步IO,Demo代码
  11. R语言之dpqr概率函数
  12. 跨平台显示MMD模型
  13. 前端加速必备之BootCDN
  14. ( 转)关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
  15. c语言void要用什么头文件,什么是C语言头文件?
  16. 红米10a和12c哪个好 红米10a和红米12c区别
  17. 2022最新酒桌小游戏小程序源码(附带流量主)
  18. 解决win10下localhost打不开的问题
  19. mysql的mgr是什么意思_MySQL之MGR简介
  20. FIR 基础应用 - AM 调幅波调制解调(FIR 低通滤波)

热门文章

  1. cenos快捷键大全
  2. word上传博客教程
  3. k8s qos实现分析
  4. Msu 系统补丁文件安装方法
  5. JDBC数据库连接池练习题
  6. 计算机dmax函数怎么用,Excel教程中DMAX 函数和DMIN 函数的用法和实例
  7. 介绍一款HCIA、HCIP、HCIE的刷题软件
  8. table标签去除默认边框
  9. Waves区块链—自动做市商Swop.fi治理代币SWOP价格何如?
  10. Arcmap投影旋转角度