Java+Swing实现五子棋游戏(下)

简介: Java+Swing实现五子棋游戏

Chess.java

package com.sjsq;
import java.awt.Color;//设置棋子颜色和棋子的落子位置
public class Chess extends Object implements Gobang{
  int coloum,row; //输入列数,行数
  Color color; //棋盘颜色的设置
  public Chess(int coloum,int row,Color color) {
    this.coloum=coloum;
    this.row=row;
    this.color=color;
  }
}

Gobang.java

package com.sjsq;
public interface Gobang {  //接口  申明全局变量
  public static final int size = 40; // 设置格子大小为40
  public static final int X = 20, Y = 20; // 设置棋盘右上角的位置
  public static final int coloum = 15;    //设置行数
  public static final int row = 15;       //设置列数
  public static final int[][] array1 = new int[coloum][row];   //记录棋子位置的数组
  public static final int[][] weightArray = new int[coloum][row];    //记录棋盘每个位置的权值
  public static final boolean flag[] = new boolean[2];    //记录选择的模式
  public static final boolean co[] = new boolean[2];    //记录选择的棋色
}

GobangListener.java

package com.sjsq;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Arrays;
import javax.swing.JOptionPane;
public class GobangListener extends MouseAdapter implements ActionListener,Gobang{
  private GobangMain gm;    // 棋盘面板对象
  private Graphics g;       // 画笔对象
  boolean cco=true;       //记录玩家下棋还是电脑下棋
  boolean fff=true;         //记录是否能悔棋
  boolean  ggg=true;        //记录是否能认输
  private MyArrayList<Chess> array;
  int coloum1,row1;
  int xx,yy,max;
  public GobangListener(GobangMain gm,MyArrayList<Chess> array) {  //从GobangMain传窗体对象和记录棋子的数组
    this.gm = gm;
    this.array=array;
  }
    public void actionPerformed(ActionEvent e) {
      if (e.getActionCommand().equals("悔棋")) {
        if(flag[0]) {           //人人对战悔棋
          if(fff) {
            if(array.getSize()>1) {
              array1[coloum1][row1]=0;
              Chess aaa=array.get(array.getSize()-2);
              coloum1=aaa.coloum;
              row1=aaa.row;
              array.Delete();
              cco=!cco;
              gm.repaint();
            }
          }
        }
        if(flag[1]) {      //人机对战悔棋
          if(fff) {
            if(cco) {
              if(array.getSize()>2) {
                array1[xx][yy]=0;
                Chess aaa=array.get(array.getSize()-2);
                coloum1=aaa.coloum;
                  row1=aaa.row;
                array.Delete();
                array1[coloum1][row1]=0;
                Chess bbb=array.get(array.getSize()-2);
                xx=bbb.coloum;
                  yy=bbb.row;
                  array.Delete();
                gm.repaint();
              }
            }
          }
        }
      }
      if (e.getActionCommand().equals("认输")) {
        if(ggg) {
          if(flag[0]){
          if(cco) {
            JOptionPane.showMessageDialog(gm, "白棋获胜");
          }else {
            JOptionPane.showMessageDialog(gm, "黑棋获胜");
          }
          gm.removeMouseListener(this);
          fff=false;
          ggg=false;
          }
          if(flag[1]) {
            if(co[0]) {
                if(cco) {
                  JOptionPane.showMessageDialog(gm, "黑棋获胜");
                }else {
                  JOptionPane.showMessageDialog(gm, "白棋获胜");
                }
                gm.removeMouseListener(this);
                fff=false;
                ggg=false;
            }
            if(co[1]) {
                if(cco) {
                  JOptionPane.showMessageDialog(gm, "白棋获胜");
                }else {
                  JOptionPane.showMessageDialog(gm, "黑棋获胜");
                }
                gm.removeMouseListener(this);
                fff=false;
                ggg=false;
                  array.Reset();
            }
          }
          }
        }
      if (e.getActionCommand().equals("退出")) {   //退出游戏
        System.exit(0);
    }
      if (e.getActionCommand().equals("人人对战")) {  //选择人人对战模式 flag[0]为true,flag[1]为false
        flag[0]=true;
        flag[1]=false;
        for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
        cco=true;
        fff=true;
        ggg=true;
        array.Reset();
        gm.repaint();
      }
      if (e.getActionCommand().equals("人机对战")) {  //选择人机对战模式 flag[0]为false,flag[1]为true
        flag[0]=false;
        flag[1]=true;
        for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
        cco=true;
        fff=true;
        ggg=true;
        array.Reset();
        gm.repaint();
      }
      if (e.getActionCommand().equals("黑子(先手)")) {  
        co[0]=false;
        co[1]=true;
        for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
        cco=true;
        fff=true;
        ggg=true;
        array.Reset();
        gm.repaint();
      }
      if (e.getActionCommand().equals("白子(后手)")) {  
        co[0]=true;
        co[1]=false;
        for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
        cco=false;
        fff=true;
        ggg=true;
        array.Reset();
        gm.repaint();
      }
      if (e.getActionCommand().equals("开始新游戏")) {
        if(flag[1]) {
        if (co[1]){
        for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
        gm.addMouseListener(this);
        array.Reset();
        gm.repaint();
      }
      if(co[0]) {
      for(int i=0;i<array1.length;i++) {
          Arrays.fill(array1[i], 0);
        }
//      cco=false;
        gm.addMouseListener(this);
        array.Reset();
        gm.repaint();
//        g.setColor(Color.BLACK);
//      g.fillOval(X+8*size-size/2, Y+8*size-size/2, size, size);
      array1[7][7]=-1;   //AI先手第一个子落点
      Chess sh=new Chess(7,7,Color.BLACK);
      array.add(sh);
      cco=true;
      fff=true;
      ggg=true;
      }
    }
        if(flag[0]) {
          for(int i=0;i<array1.length;i++) {
              Arrays.fill(array1[i], 0);
            }
          cco=true;
          fff=true;
            ggg=true;
            gm.addMouseListener(this);
            array.Reset();
            gm.repaint();
        }
        }
      }
  public void mouseReleased(MouseEvent e) {     //鼠标松开的时候进行的操作
    if(flag[0]) {  //选择人人对战模式进行的操作
      if (g == null)
        g = gm.getGraphics();
      int x = e.getX();
      int y = e.getY();
      coloum1 = (x-X+size/2)/size; 
      row1 = (y-Y+size/2)/size;
      if(coloum1<coloum&&row1<row) {
        if(array1[coloum1][row1]==0) {
          if(cco) {
            g.setColor(Color.BLACK);
            g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
            array1[coloum1][row1]=1;
            Chess sh=new Chess(coloum1,row1,Color.BLACK);
            array.add(sh);
          }
          else {
            g.setColor(Color.WHITE);
            g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
            array1[coloum1][row1]=-1;
            Chess sh=new Chess(coloum1,row1,Color.WHITE);
            array.add(sh);
          }
          Judge jd=new Judge(coloum1,row1);
          if(jd.judge()) {
            if(cco) {
              JOptionPane.showMessageDialog(gm, "黑棋获胜");
            }else {
              JOptionPane.showMessageDialog(gm, "白棋获胜");
            }
            gm.removeMouseListener(this);
            fff=false;
            ggg=false;
              array.Reset();
          }
          cco=!cco;
        }
      }
    }
    if(flag[1]) { //选择人机对战进行的操作
      if (g == null)
        g = gm.getGraphics();
      if(co[1]) {
      if(cco) { //若cco为true,则人下棋
        int x = e.getX();
        int y = e.getY();
        coloum1 = (x-X+size/2)/size; 
        row1 = (y-Y+size/2)/size;
        if(coloum1<coloum&&row1<row) {
          if(array1[coloum1][row1]==0) {
            g.setColor(Color.BLACK);
            g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
            array1[coloum1][row1]=1;
            Chess sh=new Chess(coloum1,row1,Color.BLACK);
            array.add(sh);
            Judge jd=new Judge(coloum1,row1);
            if(jd.judge()) {
              if(cco) {
                JOptionPane.showMessageDialog(gm, "黑棋获胜");
              }else {
                JOptionPane.showMessageDialog(gm, "白棋获胜");
              }
              gm.removeMouseListener(this);
              fff=false;
              ggg=false;
                array.Reset();
              cco=!cco;
            }
            cco=!cco;
          }
        }
      }
      if(!cco) {  //若cco为false,则机器下棋
        AIX();
      }
    }
      if(co[0]) {
        if(cco) { //若cco为true,则人下棋
          int x = e.getX();
          int y = e.getY();
          coloum1 = (x-X+size/2)/size; 
          row1 = (y-Y+size/2)/size;
          if(coloum1<coloum&&row1<row) {
            if(array1[coloum1][row1]==0) {
              g.setColor(Color.WHITE);
              g.fillOval(X+coloum1*size-size/2, Y+row1*size-size/2, size, size);
              array1[coloum1][row1]=1;
              Chess sh=new Chess(coloum1,row1,Color.WHITE);
              array.add(sh);
              Judge jd=new Judge(coloum1,row1);
              if(jd.judge()) {
                if(cco) {
                  JOptionPane.showMessageDialog(gm, "白棋获胜");
                }else {
                  JOptionPane.showMessageDialog(gm, "黑棋获胜");
                }
                gm.removeMouseListener(this);
                fff=false;
                ggg=false;
                  array.Reset();
                cco=!cco;
              }
              cco=!cco;
            }
          }
        }
        if(!cco) {  //若cco为false,则机器下棋
          AIX();
        }
      }
    }
  }
  //调用AI进行下棋
  public void AIX() {
    if(co[1]) {
    for(int i=0;i<weightArray.length;i++) {
      for(int j=0;j<weightArray[i].length;j++) {
        weightArray[i][j]=0;
      }
    }
    max=-1;
    AI.Quan();  
    for(int i=0;i<weightArray.length;i++) {
      for(int j=0;j<weightArray[i].length;j++) {
        if(i<5&&j<5) {
          if(max<=weightArray[i][j]&&array1[i][j]==0) {
            max=weightArray[i][j];
            xx=i;yy=j;
          }
        }else {
          if(max<weightArray[i][j]&&array1[i][j]==0) {
            max=weightArray[i][j];
            xx=i;yy=j;
          }
        }
      }
    }
    if(array1[xx][yy]==0) {
      g.setColor(Color.WHITE);
      g.fillOval(X+xx*size-size/2, Y+yy*size-size/2, size, size);
      array1[xx][yy]=-1;
      Chess sh=new Chess(xx,yy,Color.WHITE);
      array.add(sh);
      Judge jd=new Judge(xx,yy);
      if(jd.judge()) {
        if(cco) {
          JOptionPane.showMessageDialog(gm, "黑棋获胜");
        }else {
          JOptionPane.showMessageDialog(gm, "白棋获胜");
        }
        gm.removeMouseListener(this);  //移除监听,这时将不能对棋盘进行操作
        fff=false;         //设置不能进行悔棋
        ggg=false;         //设置不能进行认输
          array.Reset();
      }
      cco=!cco;
    }
  }
    if(co[0]) {
      for(int i=0;i<weightArray.length;i++) {
        for(int j=0;j<weightArray[i].length;j++) {
          weightArray[i][j]=0;
        }
      }
      max=-1;
      AI.Quan();
      for(int i=0;i<weightArray.length;i++) {
        for(int j=0;j<weightArray[i].length;j++) {
          if(i<5&&j<5) {
            if(max<=weightArray[i][j]&&array1[i][j]==0) {
              max=weightArray[i][j];
              xx=i;yy=j;
            }
          }else {
            if(max<weightArray[i][j]&&array1[i][j]==0) {
              max=weightArray[i][j];
              xx=i;yy=j;
            }
          }
        }
      }
      if(array1[xx][yy]==0) {
        g.setColor(Color.BLACK);
        g.fillOval(X+xx*size-size/2, Y+yy*size-size/2, size, size);
        array1[xx][yy]=-1;
        Chess sh=new Chess(xx,yy,Color.BLACK);
        array.add(sh);
        Judge jd=new Judge(xx,yy);
        if(jd.judge()) {
          if(cco) {
            JOptionPane.showMessageDialog(gm, "白棋获胜");
          }else {
            JOptionPane.showMessageDialog(gm, "黑棋获胜");
          }
          gm.removeMouseListener(this);  //移除监听,这时将不能对棋盘进行操作
          fff=false;         //设置不能进行悔棋
          ggg=false;         //设置不能进行认输
            array.Reset();
        }
        cco=!cco;
      }
    }
}
  }


四、其他


1.更多系统


JavaSwing系统系列实现


Java+Swing实现斗地主游戏


Java+Swing实现图书管理系统


Java+Swing实现医院管理系统


Java+Swing实现考试管理系统


Java+Swing实现酒店管理系统


Java+Swing实现超市管理系统


Java+Swing实现电影购票系统


Java+Swing实现仓库管理系统-1


Java+Swing实现仓库管理系统-2


Java+Swing实现进销存管理系统


Java+Swing实现自助取款机系统


Java+Swing实现通讯录管理系统


Java+Swing实现停车场管理系统


Java+Swing实现学生信息管理系统


Java+Swing实现学生宿舍管理系统


Java+Swing实现学生选课管理系统


Java+Swing实现学生成绩管理系统


Java+Swing实现学校教材管理系统


Java+Swing实现学校教务管理系统


Java+Swing实现企业人事管理系统


Java+Swing实现电子相册管理系统


Java+Swing实现超市管理系统-TXT存储数据


Java+Swing实现自助取款机系统-TXT存储数据


Java+Swing实现宠物商店管理系统-TXT存储数据


Java+JSP系统系列实现

Java+JSP实现学生图书管理系统


Java+JSP实现学生信息管理系统


Java+JSP实现用户信息管理系统


Java+Servlet系统系列实现

Java+Servlet+JSP实现航空订票系统


Java+Servlet+JSP实现新闻发布系统


Java+Servlet+JSP学生宿舍管理系统


Java+Servlet+JSP实现图书管理系统


Java+Servlet+JSP实现停车场管理系统


Java+Servlet+JSP实现房屋租赁管理系统


Java+Servlet+JSP实现学生信息管理系统


Java+Servlet+JSP实现学生选课管理系统


Java+Servlet+JSP实现宠物诊所管理系统


Java+Servlet+JSP实现学生成绩管理系统-1


Java+Servlet+JSP实现学生成绩管理系统-2


Java+SSM系统系列实现

Java+SSM+JSP实现图书管理系统


Java+SSM+JSP实现超市订单系统


Java+SSM+JSP实现网上考试系统


Java+SSM+JSP实现宠物商城系统


Java+SSM+Layui实现学生成绩管理系统


Java+SSM+Bootstrap实现学生信息管理系统


Java+SSH系统系列实现

Java+SSH+JSP实现在线考试系统


Java+SSH+JSP实现医院在线挂号系统


Java+Springboot系统系列实现

Java+Springboot+H-ui+Maven实现营销管理系统


Java+Springboot+Bootstrap+Maven实现网上商城系统


Java+Springboot+Bootstrap+Maven实现景区旅游管理系统


1.更多JavaWeb系统请关注专栏。


https://blog.csdn.net/helongqiang/category_10020130.html

https://blog.csdn.net/helongqiang/category_10020130.html


2.更多JavaSwing系统请关注专栏。


https://blog.csdn.net/helongqiang/category_6229101.html

https://blog.csdn.net/helongqiang/category_6229101.html


2.源码下载

Java+Swing实现五子棋游戏


3.运行项目

请点击以下链接,部署你的项目。


Eclipse如何导入JavaSwing项目超详细图文教程


Eclipse如何导入JavaSwing项目超详细视频教程


4.备注

如有侵权请联系我删除。


5.支持博主

如果您觉得此文对您有帮助,请点赞加关注加收藏。祝您生活愉快!


相关文章
|
5月前
|
Java 索引
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
Java实现扑克牌游戏 | 随机发牌 ( 过程拆分详解+完整代码 )
118 3
|
2月前
|
开发框架 IDE Java
java制作游戏,如何使用libgdx,入门级别教学
本文是一篇入门级教程,介绍了如何使用libgdx游戏开发框架创建一个简单的游戏项目,包括访问libgdx官网、设置项目、下载项目生成工具,并在IDE中运行生成的项目。
58 1
java制作游戏,如何使用libgdx,入门级别教学
|
4月前
|
安全 Java API
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
54 1
|
4月前
|
SQL Java 数据库连接
【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】
【Java】Java Swing 图书管借阅管理系统(源码+论文)【独一无二】
236 0
|
4月前
|
存储 数据可视化 Java
【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】
【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】
|
6月前
|
前端开发 Java UED
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
Java中的图形用户界面编程:Swing与JavaFX的比较与应用
|
Java
编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出
编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出
236 0
编写Java程序,模拟五子棋博弈过程中的异常声明和异常抛出
|
6天前
|
安全 Java API
java如何请求接口然后终止某个线程
通过本文的介绍,您应该能够理解如何在Java中请求接口并根据返回结果终止某个线程。合理使用标志位或 `interrupt`方法可以确保线程的安全终止,而处理好网络请求中的各种异常情况,可以提高程序的稳定性和可靠性。
36 6
|
21天前
|
设计模式 Java 开发者
Java多线程编程的陷阱与解决方案####
本文深入探讨了Java多线程编程中常见的问题及其解决策略。通过分析竞态条件、死锁、活锁等典型场景,并结合代码示例和实用技巧,帮助开发者有效避免这些陷阱,提升并发程序的稳定性和性能。 ####
下一篇
DataWorks