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

另外还有好多朋友说为什么报错等等,我希望你们在问这种问题的时候最好把在哪报的错,报的什么错给贴出来呀,直接就回复说程序有问题我也不可能知道你的问题出在哪。。。,搞得我也很懵。                                                2019.11.09

本程序适用于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++;elsebreak;}for (int i = x; i >= 0; i--)// 向右判断是否棋子一样{if (bx[i][y] == bx[x][y])count++;elsebreak;}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++;elsebreak;}for (int i = y; i >= 0; i--)// 向上判断是否棋子一样{if (bx[x][i] == bx[x][y])count++;elsebreak;}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++;elsebreak;}for (int i = x, j = y; i >= 0 && j < bx.length; i--, j++)// 向上判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}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++;elsebreak;}for (int i = x, j = y; i < bx.length && j < bx.length; i++, j++)// 向上判断是否棋子一样{if (bx[i][j] == bx[x][y])count++;elsebreak;}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();}}
友情提示:本代码仅适用于或者双人对战。
由于时间安排原因,CSDN上的评论我没有办法秒回,如果需要及时联系到我,可以通过我的公众号找到我的微信:

Java小程序 —— 简单五子棋相关推荐

  1. Java小程序——简单五子棋(人机对战)

    有关五子棋人人对战的代码,以及其他一些我想说的话请参考 Java小程序 -- 简单五子棋_如切如磋,如琢如磨-CSDN博客_java小程序 由于某些原因,这里我给出的AI算法算是比较简单的,所以导致了 ...

  2. JAVA小程序简单学籍系统参考代码,登陆小程序,Jtree //Jtree,JDBC,Jframe

    JAVA小程序简单学籍系统//Jtree,JDBC,Jframe 我们可以先在JAVA写一个类打开数据库获取连接 package sql; import java.sql.Connection; im ...

  3. 基于微信小程序的五子棋小程序(含简单人机)

    基于微信小程序的五子棋小程序(含简单人机) 运行截图 项目结构目录 基本思路 实现过程 棋盘的生成 落子 判断胜负 悔棋 人机对战的实现 权值表 机器人落子逻辑 改进胜负判断方法 更多功能 结语 运行 ...

  4. 简单Java小程序----有界面ATM机

    继<简单Java小程序---无界面ATM机>以后,尝试对有界面ATM机改写,对面向对象的了解又深了一层! 桌面的创建过程       由于使用的NetBean软件没有提供专用的控件拖拽使用 ...

  5. 做一个简单的java小游戏--单机版五子棋

    做一个简单的java小游戏–单机版五子棋 学了java有一段时间了,今天就来搞一个简单的单机版五子棋游戏. 实现功能:那必须能进行基础的输赢判断.还有重新开始的功能,悔棋的功能,先手设置的功能和退出的 ...

  6. 大学java课程设计-简单五子棋

    大学java课程设计-简单五子棋 前言 效果图 课设要求 五子棋介绍 五子棋介绍 游戏玩法 系统需求分析 系统的设计与实现 项目工程结构 运行环境 代码设计 前言 第一次写博客,不知道写些什么,就打算 ...

  7. java 获取文件所在的文件夹_带你0基础编写一个Java小程序,领略Java程序从编写到编译再到运行的全流程...

    在学习Java之前我们需要先认识下什么是计算机语言?计算机语言又有哪些分类?在了解这些后对我们理解学习帮助是很大的. 要知道计算机语言是人与计算机之间进行信息交流沟通的一种特殊语言,又分为机械语言.汇 ...

  8. java小程序之学生信息_java小程序之学生信息录入界面

    小程序我的项目下载链接:点击打开链接 因为这学期比赛太多,蓝桥杯,团体程序设计大赛,ACM省赛等原因基本这学期的课程都没上,比赛完后开始去上课,java老师让用java写一个学生信息录入界面,把界面中 ...

  9. 【微信小程序系列】小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet)

    [微信小程序系列]小程序简单连接后端数据库完整示例(附免费下载的源码)(Servlet) 登录页面 login.wxml <view class="page">< ...

最新文章

  1. Python 发送 email 的三种方式
  2. 计算机硬盘冒烟了,电脑硬盘冒烟损坏了怎么办?
  3. VMware安装Centos7过程
  4. 跑三小时的monkey测试该怎么算_百亿次的锤炼 - 带逛Dragonboat的各类测试
  5. 《实时控制软件设计》第一周作业
  6. 设计模式(二)之装饰器模式
  7. 标准MD5 .Net,实现!的对与错!
  8. Ethercat解析(九)之过程数据
  9. 最近一周交易所钱包比特币数量减少18425枚
  10. OpenCV4.5.1 | 使用一行代码将图像匹配性能提高14%
  11. C语言练习题 时钟指针
  12. 8000401a 因为配置标识不正确,系统无法开始服务器进程。请检查用户名和密码
  13. python bytes是什么类型_python的Bytes类型
  14. MySQL最全整理!java技术总监面试常见问题及答案
  15. 爬虫---涨跌停股票池信息----(东方财富)
  16. websocket握手失败_WebSocket通信之握手协议
  17. 小而美的ToDo 待办事项便签工具,高效管理工作生活一切琐事
  18. 各种奇葩3389连接不上的解决方法
  19. vue2和vue3 面试题
  20. php 静态配置文件问题,Nginx+PHP 配置漏洞:静态文件都可以当作 PHP 解析

热门文章

  1. AlexNet网络结构学习
  2. Vue对单独的页面的body样式设置
  3. 图书馆管理系统代码html语言,html图书管理系统
  4. 用python实现生成验证码图片
  5. 锐捷Wlan——AC热备实验(DHCP在核心交换机)
  6. 无人驾驶--实时定位与地图构建(SLAM)仿真与实战(附源码)
  7. 如何免费安装并激活序列号iMazing软件
  8. Apache的配置与应用【Apache访问控制】以及apache日志管理【日志分割、awstats日志分析】
  9. Meter应用中对于中文乱码的主要解决方法(转)
  10. PHP date() 和 strtotime() 使用详解