Java小程序 —— 简单五子棋

简介: 看到好多后台留言问背景图片的问题,在这里统一补充一下:所有的图片都是读取的本地图片文件,图片文件可以去网上下载,有一大堆(记得调好长宽),代码中的路径只是当时我的电脑的图片路径,你们运行的时候记得修改

本程序适用于java初学者巩固类与对象、事件响应、awt包中各种工具的相关概念以及对逻辑能力的锻炼

需要注意的有:

①要加入java界面的重绘(基本原则)

②由于玩家需要通过鼠标点击,计算机响应出棋子的位置,但却不能保证每次点击都正中棋盘点位,所以要有一定的误差范围

③要保存更新棋盘上的棋子信息,因为棋盘格数是固定的故本例中采取最简单的数组



直接上代码:

分为三个类,同一包下,相信大家都能明白

package Study0326;
public interface WZQConfig {
  /*
   * 起始位置X
   */
  public static final int START_X = 60;
  /*
   * 起始位置Y
   */
  public static final int START_Y = 60;
  /*
   * 五子棋盘线条数
   */
  public static final int H_LINE = 15;
  /*
   * 五子棋盘竖线条数
   */
  public static final int V_LINE = 15;
  /*
   * 五子棋盘格子大小
   */
  public static final int SIZE = 60;
  /*
   * 储存棋子的x位置信息
   */
  public static final int[][] bx = new int[17][17];
}


package Study0326;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JOptionPane;
public class LoginListener implements MouseListener, WZQConfig, ActionListener {
  private int x, y;// 鼠标点击的位置
  private int x1, y1, xx, yy;// 鼠标点击附近格子交点的坐标
  private Graphics g;
  private int a = 0, i = 0, j = 0, count1 = 0;// count统计当前下的棋子数
  private String Str;// 定义全局变量获取按钮上的字符串
  private JButton jbu1, jbu2;
  private int GetX[] = new int[256];
  private int GetY[] = new int[256];
  WZQFrame ui;
  public void setG(Graphics g) {
    this.g = g;
  }
  public void setT(JButton b) {
    jbu1 = b;
  }
  public void setU(WZQFrame u) {
    ui = u;
  }
  public void mouseClicked(MouseEvent e) {
  }
  public void mousePressed(MouseEvent e) {
  }
  public void mouseReleased(MouseEvent e) {
    x = e.getX();
    y = e.getY();
    x1 = Math.abs(x - START_X);
    y1 = Math.abs(y - START_Y);
    xx = x1 % SIZE;
    if (xx >= SIZE / 2) {
      x1 = (x1 / SIZE) + 2;
    } else {
      x1 = (x1 / SIZE) + 1;
    }
    yy = y1 % SIZE;// 判断横坐标是否超过格子长度的一半(防止玩家点偏)
    if (yy >= SIZE / 2) {
      y1 = (y1 / SIZE) + 2;
    } else {
      y1 = (y1 / SIZE) + 1;
    }
    if ((count1 + 1) % 2 == 1) {// 单数步数时下黑棋,双数时下白棋
      g.setColor(Color.BLACK);
      if (bx[x1][y1] == 0) {
        bx[x1][y1] = 1;// 表示黑棋
        g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
            50, 50);
        count1++;// 所下棋子数加一
        GetX[count1] = x1;// 记录第count1步的棋子x值
        GetY[count1] = y1;// 记录第count1步的棋子y值
        if (CheckRow(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
        }
        if (CheckList(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
        }
        if (UpperRight(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
        }
        if (UpperLeft(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "BLACK   WIN!!");
        }
      }
    } else {
      g.setColor(Color.WHITE);
      if (bx[x1][y1] == 0) {
        bx[x1][y1] = 2;// 表示白棋
        g.fillOval(Math.abs(x1 * SIZE - 25), Math.abs(y1 * SIZE - 25),
            50, 50);
        count1++;// 所下棋子数加一
        GetX[count1] = x1;// 记录第count1步的棋子x值
        GetY[count1] = y1;// 记录第count1步的棋子y值
        if (CheckRow(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
        }
        if (CheckList(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
        }
        if (UpperRight(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
        }
        if (UpperLeft(x1, y1) >= 5) {
          JOptionPane.showMessageDialog(null, "WHITE   WIN!!");
        }
      }
    }
  }
  public void actionPerformed(ActionEvent e) {
    setT(jbu1);
    Str = e.getActionCommand();// 读取点击按钮上的字符串
    if ("悔棋".equals(Str)) {
      if (g.getColor() == Color.BLACK) {
        g.setColor(Color.WHITE);
      }
      if (g.getColor() == Color.WHITE) {
        g.setColor(Color.BLACK);
      }
      Regret();
      ui.repaint();
    } else if ("重新开始".equals(Str)) {
      Restart();
      ui.repaint();
    }
  }
  public void mouseEntered(MouseEvent e) {
  }
  public void mouseExited(MouseEvent e) {
  }
  public int CheckRow(int x, int y)// 横着五子连成一条直线
  {
    int count = 0;
    for (int i = x + 1; i < bx.length; i++)// 向右判断是否棋子一样
    {
      if (bx[i][y] == bx[x][y])
        count++;
      else
        break;
    }
    for (int i = x; i >= 0; i--)// 向右判断是否棋子一样
    {
      if (bx[i][y] == bx[x][y])
        count++;
      else
        break;
    }
    return count;
  }
  public int CheckList(int x, int y)// 竖着五子连成一条直线
  {
    int count = 0;
    for (int i = y + 1; i < bx.length; i++)// 向下判断是否棋子一样
    {
      if (bx[x][i] == bx[x][y])
        count++;
      else
        break;
    }
    for (int i = y; i >= 0; i--)// 向上判断是否棋子一样
    {
      if (bx[x][i] == bx[x][y])
        count++;
      else
        break;
    }
    return count;
  }
  public int UpperRight(int x, int y)// 右上到左下五子连成一条直线
  {
    int count = 0;
    for (int i = x + 1, j = y - 1; i < bx.length && j >= 0; i++, j--)// 向下判断是否棋子一样
    {
      if (bx[i][j] == bx[x][y])
        count++;
      else
        break;
    }
    for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判断是否棋子一样
    {
      if (bx[i][j] == bx[x][y])
        count++;
      else
        break;
    }
    return count;
  }
  public int UpperLeft(int x, int y)// 左上到右下五子连成一条直线
  {
    int count = 0;
    for (int i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--)// 向下判断是否棋子一样
    {
      if (bx[i][j] == bx[x][y])
        count++;
      else
        break;
    }
    for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判断是否棋子一样
    {
      if (bx[i][j] == bx[x][y])
        count++;
      else
        break;
    }
    return count;
  }
  public void Regret() {// 悔棋
    bx[GetX[count1]][GetY[count1]] = 0;
    if (count1 > 0) {
      count1--;
    }
  }
  public void Restart() {//重新开始
    {
      for (int k = 0; k <= count1; k++) {
        bx[GetX[k]][GetY[k]] = 0;
      }
    }
  }
}


package Study0326;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
/*
 * 五子棋的界面类,该类继承JFrame,然后实现WZQConfig接口
 */
import javax.swing.JPanel;
public class WZQFrame extends JPanel implements WZQConfig {
  public void WZQFrame() {
    // WZQFrame ui = new WZQFrame();
    JFrame jf = new javax.swing.JFrame();
    jf.setTitle("五子棋");
    jf.setDefaultCloseOperation(3);
    jf.setSize(1246, 1080);
    jf.setLocationRelativeTo(null);
    jf.setResizable(false);
    jf.setLayout(new FlowLayout());
    this.setLayout(new FlowLayout());
    this.setPreferredSize(new Dimension(1030, 1080));
    // this.setBackground(Color.CYAN);
    // 把面板对象添加到窗体上
    jf.add(this);
    JPanel jp1 = new JPanel();
    jp1.setPreferredSize(new Dimension(200, 1080));
    jp1.setLayout(new FlowLayout());
    jf.add(jp1);
    LoginListener ll = new LoginListener();
    String[] str = { "悔棋", "重新开始" };
    for (int i = 0; i < str.length; i++) {
      JButton jbu1 = new JButton(str[i]);
      jbu1.setPreferredSize(new Dimension(150, 80));
      jbu1.setFont(new Font("楷体", Font.BOLD,20));//设置字体
      jp1.add(jbu1);
      jbu1.addActionListener(ll);
    }
    jf.setVisible(true);
    Graphics g = this.getGraphics();
    this.addMouseListener(ll);
    ll.setG(g);
    ll.setU(this);
  }
  /*
   * 重写窗体绘制容器的方法
   */
  public void paint(Graphics g) {
    super.paint(g);
    ImageIcon im2 = new ImageIcon(this.getClass().getResource("2.jpg"));
    g.drawImage(im2.getImage(), 0, 0, 1030, 1080, null);
    for (int i = 1; i < 17; i++) {
      Graphics2D g2 = (Graphics2D) g;
      g2.setStroke(new BasicStroke(4));
      g2.drawLine(START_X, START_Y * i, START_X + SIZE * V_LINE, START_Y
          * i);// 横线
      g2.drawLine(START_X * i, START_Y, START_X * i, START_Y + SIZE
          * V_LINE);// 竖线
      g2.setStroke(new BasicStroke(8));
      // 画边框
      g2.drawLine(35, 35, 990, 35);
      g2.drawLine(35, 990, 990, 990);
      g2.drawLine(35, 35, 35, 990);
      g2.drawLine(990, 35, 990, 990);
    }
    for (int k = 0; k < 17; k++) {
      for (int k1 = 0; k1 < 17; k1++) {
        if (bx[k][k1] == 1) {
          g.setColor(Color.BLACK);
          g.fillOval(Math.abs(k * SIZE - 25),
              Math.abs(k1 * SIZE - 25), 50, 50);
        } else if (bx[k][k1] == 2) {
          g.setColor(Color.WHITE);
          g.fillOval(Math.abs(k * SIZE - 25),
              Math.abs(k1 * SIZE - 25), 50, 50);
        }
      }
    }
  }
  public static void main(String[] args) {
    WZQFrame l = new WZQFrame();
    l.WZQFrame();
  }
}

100.png

友情提示:本代码仅适用于或者双人对战。


相关文章
|
4天前
|
Java Android开发
五子棋【小游戏】(Java课设)
五子棋【小游戏】(Java课设)
17 1
|
4天前
|
小程序 前端开发 JavaScript
基于Java的校园二手交易小程序的设计与实现
基于Java的校园二手交易小程序的设计与实现
30 2
|
4天前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
|
2天前
|
移动开发 监控 供应链
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
一开始接触MES系统,很多人会和博主一样,对MES细节的应用不了解,这样很正常,因为MES系统相对于其他系统来讲应用比较多!
14 1
JAVA智慧工厂制造生产管理MES系统,全套源码,多端展示(app、小程序、H5、台后管理端)
|
4天前
|
JavaScript 小程序 Java
Java智慧校园系统源码springboot + vue智慧学校源码 微信小程序+电子班牌
智慧校园的建设逐渐被师生、家长认可接受,智慧校园通过对在校师生、教务等所有人员的信息以及各种信息搜集与储存,进行数据优化与管理,为师生们提供更加智能化的校园服务。未来智慧校园将不再是一个陌生词,而会真正地应用在更多的校园管理中,让我们的校园生活变得更加美好
34 2
|
4天前
|
人工智能 小程序 Java
Java智慧校园系统源码 微信小程序+电子班牌
通过设备管理对百纳智慧校园的智慧班牌以及百纳智慧屏(校牌)进行统一集中式管理,支持浏览所有设备的基本信息以及在离线状态,支持添加设备、设备一键开关机、一键重启、设置节假日开关机时间、设置日常开关机时间、远程班牌截屏、远程班牌升级等操作。
23 0
|
4天前
|
Java Android开发
五子棋小游戏【小游戏】(Java课设)
五子棋小游戏【小游戏】(Java课设)
14 0
|
4天前
|
存储 小程序 前端开发
Java代码能搭建小程序
Java代码能搭建小程序
21 0
|
4天前
|
人工智能 小程序 数据挖掘
Java智慧中小学校管理系统源码带微信小程序
微信小程序端包括家长端和教师端;设有首页、发现、个人中心;首页里设有学校简介、组织架构、师资力量、学校荣誉、网上报修、电子班牌;发现页面可以看到最新的动态,班级圈等;个人中心设有上班打卡、我的课表、请假、班级考勤、通知公告、倒计时、积分商城、放学管理、体温检测、班级德育、图片视频管理、教学班,校内各大活动一目了然。
40 0
|
4天前
|
小程序 Java 数据挖掘
Java校园智慧管理云平台源码 小程序+android电子班牌系统
智慧校园技术架构 ❀后端:Java ❀框架:springboot ❀前端页面:vue +element-ui ❀小程序:小程序原生开发 ❀电子班牌:Java Android
42 0

热门文章

最新文章