java简单五子棋源代码

2023-11-02

package com.renyou;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
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.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class FiveChess extends JFrame {
 ImageIcon icon = new ImageIcon("images//start.PNG"); // 相对路径
 ImageIcon icon5 = new ImageIcon("images//help1.jpg");
 ImageIcon icon6 = new ImageIcon("images//board.png");
 ImageIcon icon7 = new ImageIcon("images//function.png");
 ImageIcon icon8 = new ImageIcon("images//regret.png");
 ImageIcon icon9 = new ImageIcon("images//rstart.png");
 Graphics g = null;
 int count = 0;// 悔棋步
 Color color;
 // ArrayList list=new ArrayList();
 MyContainer list = new MyContainer();
 boolean flag_renren = false;
 boolean flag_renji = false;
 boolean flag_regret = false;
 boolean flag_color = false;
 boolean flag = true;
 int[][] chese = new int[12][12];
 public void start() {// 开始界面
  JFrame f1 = new JFrame();
  f1.setTitle("五子棋小游戏");
  f1.setSize(380, 500);
  f1.setResizable(false);
  f1.setLocationRelativeTo(null);
  JPanel co = new JPanel() {
   protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(icon.getImage(), 0, 0, null);
   }
  };
  co.setLayout(null);
  f1.add(co);
  MouseAdapter mouse_listener = new MouseAdapter() {
   // 鼠标按下
   public void mousePressed(MouseEvent e) {
    if (e.getX() >= 247 && e.getX() <= 428 && e.getY() >= 345 && e.getY() <= 385) // 人机
    {
    }
    if (e.getX() >= 95 && e.getX() <= 280 && e.getY() >= 280 && e.getY() <= 335) // 人人
    {
     showUI();
     flag_renren = true;
     f1.setVisible(false);
    }
    if (e.getX() >= 95 && e.getX() <= 280 && e.getY() >= 345 && e.getY() <= 390) // 帮助
    {
     JFrame f = new JFrame();
     f.setTitle("游戏帮助");
     f.setLayout(new FlowLayout());
     f.setResizable(false);
     f.setSize(420, 280);
     f.setLocation(0, 200);
     f.setVisible(true);
     JButton btn = new JButton();
     btn.setIcon(icon5);
     btn.setPreferredSize(new Dimension(420, 280));
     f.add(btn);
    }
    if (e.getX() >= 95 && e.getX() <= 280 && e.getY() >= 410 && e.getY() <= 455) // 退出
    {
     f1.setVisible(false);
    }
   }
  };
  f1.addMouseListener(mouse_listener);
  f1.setVisible(true);
 }
 public void showUI() {// 游戏主界面
  setTitle("五子棋小游戏");
  setSize(557, 670);
  setResizable(false);// 不可全屏
  setLocationRelativeTo(null);// 居中
  setLayout(new FlowLayout());// 流线型
  setDefaultCloseOperation(3);// 设置任务管理器默认关闭操作//1,2,3
  JPanel board_panel = new JPanel() {
   public void paint(Graphics g) {// 画棋盘
    super.paint(g);
    g.drawImage(icon6.getImage(), 0, 0, null);
    for (int i = 0; i < 13; i++)// 画棋盘线
    {
     g.drawLine(38, 38 + 40 * i, 518, 38 + 40 * i);// 横线
    }
    for (int i = 0; i < 13; i++) {
     g.drawLine(38 + 40 * i, 38, 38 + 40 * i, 518);// 纵线
    }
    if (flag_regret == true) {
     for (int i = 0; i < list.getLength(); i++) {
      // 取出每个棋子对象
      Chess chess = (Chess) list.get(i);
      // 画棋子
      chess.drawChese(g);
     }
     flag_regret = false;
    }
   }
  };
  board_panel.setPreferredSize(new Dimension(557, 554));
  JPanel function_panel = new JPanel() {
   @Override
   protected void paintComponent(Graphics g) {
    // TODO Auto-generated method stub
    super.paintComponent(g);
    g.drawImage(icon7.getImage(), 0, 0, null);
   }
  };
  function_panel.setPreferredSize(new Dimension(557, 100));
  function_panel.setLayout(new FlowLayout(1, 100, 20));
  add(board_panel);
  add(function_panel);
  JButton regret = new JButton();
  regret.setPreferredSize(new Dimension(75, 25));
  regret.setIcon(icon8);
  JButton rstart = new JButton();
  rstart.setPreferredSize(new Dimension(71, 28));
  rstart.setIcon(icon9);
  function_panel.add(regret);
  function_panel.add(rstart);
  rstart.addActionListener(new ActionListener() {// 重新开始
   public void actionPerformed(ActionEvent e) {
    for (int i = 0; i < 11; i++)// 棋盘清空
     for (int j = 0; j < 11; j++)
      chese[i][j] = 0;
    repaint();
    for (int i = 0; i < 50; i++)
     list.delete(); // 删除所有元素
   }
  });
  regret.addActionListener(new ActionListener() {// 悔棋
   public void actionPerformed(ActionEvent e) {
    count++;
    System.out.println(count);
    flag_regret = true;
    Chess chess = (Chess) list.get(list.getLength() - 1);
    chese[chess.i()][chess.j()] = 0;// 悔过的棋置0
    list.delete(); // 删除最后的元素
    // 刷新棋盘
    board_panel.repaint();
   }
  });
  setVisible(true);
  g = board_panel.getGraphics();
  MouseListener mouse_listener = new MouseListener() {
   public void mouseEntered(MouseEvent e) {
    System.out.println("进入");
   } // 进入
   public void mouseExited(MouseEvent e) {
    System.out.println("离开");
   } // 离开
   public void mousePressed(MouseEvent e) {
    System.out.println("按压");
   } // 按压
   public void mouseReleased(MouseEvent e) {
    System.out.println("释放");
   }// 释放
   // 单击
   public void mouseClicked(MouseEvent e) {
    if (flag_renren) {// 点击了人人按钮
     // 获取鼠标单击时的坐标
     int x = e.getX();
     int y = e.getY();
     // 得到所有交叉点的通式
     for (int i = 0; i < 10; i++) {
      for (int j = 0; j < 10; j++) {
       int x0 = 30 + 40 * j;
       int y0 = 30 + 40 * i;
       // 判断 当前鼠标点击的坐标是否在误差范围内
       if (x < x0 + 18 && x > x0 - 18 && y < y0 + 18 && y > y0 - 18) {
        if (chese[i][j] == 0) {// 判断 该处是否有棋子
         if (flag_color == false) {// 黑棋子
          color = Color.black;
          chese[i][j] = 1;
          flag_color = true;
         }
         else if (flag_color == true) {// 白棋子
          color = Color.white;
          chese[i][j] = 2;
          flag_color = false;
         }
         if (count % 2 != 0) // 悔了奇数步棋,保持颜色不变
          if (color == Color.white) {
           color = Color.black;
           chese[i][j] = 1;
          } else {
           color = Color.white;
           chese[i][j] = 2;
          }
         // 下棋
         Chess chess = new Chess(x0, y0, color);
         // 将棋子保存到容器中
         list.add(chess);
         // 画棋子
         chess.drawChese(g);
         renji(i, j);
         win(i, j);
        }
       }
      }
     }
    }
   }
  };
  // 给棋盘面板添加鼠标监听器
  board_panel.addMouseListener(mouse_listener);
 }
 public void renji(int x, int y) {
 }
 // 判断输赢的方法 hang 代表当前棋子所在的行 lie代表当前棋子所在的列
 public void win(int hang, int lie) {
  // 计数器
  // 判断行
  int count = 1;// 统计相同棋子的个数
  int m = 1;// 控制列值的改变
  // 水平向左
  while (lie - m >= 0 && chese[hang][lie] == chese[hang][lie - m]) {
   m++;
   count++;
  }
  m = 1;
  // 水平向右
  while (lie + m <= 10 && chese[hang][lie] == chese[hang][lie + m]) {
   m++;
   count++;
  }
  // 判断列
  int count1 = 1;
  m = 1;
  // 水平向上
  while (hang - m >= 0 && chese[hang][lie] == chese[hang - m][lie]) {
   m++;
   count1++;
  }
  m = 1;
  while (hang + m <= 10 && chese[hang][lie] == chese[hang + m][lie]) {
   m++;
   count1++;
  }
  // 判断右斜
  int count2 = 1;
  m = 1;
  while (lie + m <= 10 && hang - m >= 0 && chese[hang][lie] == chese[hang - m][lie + m]) {
   m++;
   count2++;
  }
  m = 1;
  //
  while (lie - m >= 0 && hang + m <= 10 && chese[hang][lie] == chese[hang + m][lie - m]) {
   m++;
   count2++;
  }
  // 判断左斜
  int count3 = 1;
  m = 1;
  while (lie - m >= 0 && hang - m >= 0 && chese[hang][lie] == chese[hang - m][lie - m]) {
   m++;
   count3++;
  }
  m = 1;
  //
  while (lie + m <= 10 && hang + m <= 10 && chese[hang][lie] == chese[hang + m][lie + m]) {
   m++;
   count3++;
  }
  // 判断结果
  if (chese[hang][lie] == 1 && (count >= 5 || count1 >= 5 || count2 >= 5 || count3 >= 5)) {// 黑棋胜利
   // 提示用户
   JOptionPane.showMessageDialog(null, "黑棋胜利!");
   for (int i = 0; i <= 10; i++)
    for (int j = 0; j <= 10; j++)
     chese[i][j] = 0;
   repaint();
   for (int i = 0; i < 50; i++)
    list.delete(); // 删除所有元素
   count = count1 = count2 = count3 = 1;
  }
  if (chese[hang][lie] == 2 && (count >= 5 || count1 >= 5 || count2 >= 5 || count3 >= 5)) {// 白棋胜利
   // 提示用户
   JOptionPane.showMessageDialog(null, "白棋胜利!");
   for (int i = 0; i <= 10; i++)
    for (int j = 0; j <= 10; j++)
     chese[i][j] = 0;
   repaint();
   for (int i = 0; i < 50; i++)
    list.delete(); // 删除所有元素
   count = count1 = count2 = count3 = 1;
  }
 }
}
package com.renyou;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.ImageIcon;
public class Chess {
 ImageIcon icon3=new ImageIcon("images//b1.png"); //相对路径
 ImageIcon icon4=new ImageIcon("images//h1.png"); //相对路径
int x,y;
Color color;
int i,j;
Chess (int x,int y ,Color color){
 this.x=x;
 this.y=y;
 this.color=color;
}
public void drawChese(Graphics g){
 
 if(color==Color.white)
 g.drawImage(icon3.getImage(),x-15,y-15,null);
 
 else
  g.drawImage(icon4.getImage(),x-15,y-15,null);
 
}
public int i(){
 
 i=(y-15)/40;
 return i;
 
}
public int j(){
 
 j=(x-15)/40;
 
 return j;
 
}
}
package com.renyou;
/**
 * 自定义容器
 *
 *
 */
public class MyContainer {
 //原始数组   初始大小为0
 Chess[] srcArray = new Chess[0];
 
 //在末尾添加元素的方法
 public void add(Chess element){
  //创建新数组  长度比srcArray大1
  Chess[] newArray = new Chess[srcArray.length+1];
  //将srcArray中的元素拷贝到newArray中
  for(int i=0;i<srcArray.length;i++){
   newArray[i] = srcArray[i];
  }
  //将element添加到newArray末尾
  newArray[srcArray.length] = element;
  //数组交换
  srcArray = newArray;
 }
 
 
 
 //获取指定下标的元素的方法
 public Chess get(int index){
  return srcArray[index];
 }
 
 //获取容器大小的方法
 public int getLength(){
  return srcArray.length;
 }
 
 //删除末尾元素的方法
 public void delete(){
  Chess[] newArray = new Chess[srcArray.length-1];
  
  for(int i=0;i<srcArray.length-1;i++)
   
   newArray[i] = srcArray[i];
  
  //数组交换
  srcArray = newArray;
 }
 
}
package com.renyou;
public class Test {
 public static void main(String[] args) {
  new FiveChess().start();
 }
}
以上就是五子棋源代码
以上是我的资源,都是网上搜的,再处理一下。
本人是java初学者,编的程序可能有很多的不足之处,还望大家多多指教,目前还没有写人机算法,以后会逐渐跟上,目前的代码值得一提的是我用的容器是自定义容器,
因为悔棋的时候要用到容器,刚开始用到的是ArrayList容器,并调用里面的add(),remove()等方法。后来用自定义容器实现了悔棋功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java简单五子棋源代码 的相关文章

随机推荐

  • 微信小程序从入坑到放弃二十五:记一次在WXS中使用正则表达式的坑

    摘要 WXS WeiXin Script 是小程序的一套脚本语言 结合 WXML 可以构建出页面的结构 在此次开发中 由于接口返回数据不统一 所以要对某些字段进行过滤 但直接使用replace时竟然报错了 原来在WXS中要生成regexp对
  • 网络编程day3作业

    tftp下载 include
  • 【NLP】第 3 章 :BERT

    在本章中 您将学习由 Google 开发的 Transformer 架构的实现之一 称为 BERT Google AI Language 的研究人员最近所做的工作导致发表了一篇名为 BERT 来自变形金刚的双向编码器表示 的论文 BERT取
  • 模拟get和post请求

    一 模拟请求 浏览器及工具模拟 http请求有很多种 常用的请求方式有两种 get请求和post请求 今天先介绍浏览器以及工具模拟请求 下次会介绍代码模拟 1 get请求格式 url param1 value1 param2 value2
  • 阿里云OSS使用Java上传文件

    一 准备工作 1 1登录阿里云点击对象存储OSS 1 2 先点击Bucket 列表 在点击创建Bucket 1 3 根据自己需求勾选 然后点击确定 1 4 新建好之后 点击bucket名称 1 5 点击文件管理 1 6 在这个页面就可以实现
  • 常用正则表达式

    英文单词 public static final String REGEX WORD EN w 中文 public static final String REGEX WORD CN u4E00 u9FA5 6到30位 数字 字符 常用于用
  • 解决windows 您没有权限访问\\192.168.1.X(局域网) 请与网络管理员联系请求访问权限

    解决windows 您没有权限访问 192 168 1 X 局域网 请与网络管理员联系请求访问权限 今天哥们发来一张图 就是下图 说无法访问局域网内的数据了 这个问题咋处理 那就重头说这个事儿 先写一篇这个问题 正好本博客内还木有 出现这个
  • QueryWrapper查询查询时间空值排序空值放在最后

    代码如下 QueryWrapper
  • RFID智能汽车制造管理系统解决方案

    RFID智能汽车制造管理系统解决方案 1 项目背景 1 1 行业背景 在汽车行业快速发展竞争日益激励的背景下 各个汽车制造商都在追求管理系统的优化 已从开始的只追求最终结果的最优 发展到目前要求使制造汽车的每个环节都达到最优的目的 这就给管
  • 图像处理之卷积模式及C++实现

    1 卷积的三种模式 深度学习框架中通常会实现三种不同的卷积模式 分别是 SAME VALID FULL 这三种模式的核心区别在于卷积核进行卷积操作的移动区域不同 进而导致输出的尺寸不同 我们以一个例子来看这三种模式的区别 输入图片的尺寸是5
  • 服务器iis如何开启tlsv1.2协议,利用IIS Crypto V3.2开启IIS服务器TLS1.2的具体操作流程...

    今天客户给我反馈了一个在网站安装SSL证书后 网站https显示异常的问题 就是在谷歌浏览器下 会提示 您的连接存在安全隐患 访问被阻止 如下 如果继续强制浏览 会提示 你与此网站之间建立的连接并非完全安全 攻击者可能能够看到您正在此网站上
  • Command Prompt 常用命令

    一 CD Change Directory 改变现在指向的文件夹 1 去到最根的目录 cd 例如去到C盘 2 去某一文件夹 例如去C盘的logs文件夹 cd windows logs 3 返回上一级文件夹 cd 二 指向去另一个盘 指向另一
  • 解决PCCAD出现的致命错误Unhandled Access Violation ....

    最近公司电脑貌似很多的员工在打开pccad里面的TK的时候出现如下的界面 于是就开始认为是office的问题 在卸载了office之后 问题是解决了 不过总不能不叫员工使用office软件吧 于是乎不得不又装上了office 但是不是off
  • AD20-DRC检查

    点击下图中的红圈内选项 就会出现 第一个红圈可不勾选 可以不创建报告文件 第二个红圈中的填的稍微大一点 接下来就是 红圈中是安全间距检查 勾选可以检查板子中的安全间距 之后点击左下角的运行DRC 就行了 板子中有错误的话就会报错 有错改错就
  • adopt_lock 和 defer_lock 的区别

    c 中 lock guard 通过 raii 机制实现了自动上锁和解锁互斥量 基本用法为 static std mutex io mutex std lock guard
  • IDEA如何添加多Git源

    一 添加多Git源 选择IDEA顶部VCS菜单 再选择Git 点击Remotes 然后弹窗中点击 号添加 再弹窗中输入名字和git的地址 最后点击OK 另外一个Git源就加进来了 二 如何添加新的Git源的远程分支 选择IDEA顶部VCS菜
  • java搜索文本内容_JAVA 搜索文本文件中的关键字

    原文链接 http blog net blog abel article details 40858245 用JAVA实现对文本文件中的关键字进行搜索 依据每一行 得到每一行中出现关键词的个数 使用java io LineNumberRea
  • 如何理解js中基本数据类型的值不可变

    js的数据类型 在讲解我们要说明的问题之前 需要知道js有哪些数据类型 js有两种数据类型 基本数据类型和引用数据类型 基本数据类型 number string boolean undefined null symbol 在 Java 中
  • 入门学习-Python-小甲鱼学习资料-Day010-列表:一个打了激素的数组1

    标题 根据视频自己练习 Append 和 extend Appen 添加单个元素 extend添加多个元素 但是要以数组形式 Insert 插入元素的时候可以定义插入的位置 注意 是从0开始计数 从0开始才是python的默认 标题 课后练
  • java简单五子棋源代码

    package com renyou import java awt Color import java awt Dimension import java awt FlowLayout import java awt Graphics i