五子棋设计
一.创建窗口1.创建一个类和对象public class Gameui { public static void main(String[] args) { Gameui uinew Gameui(); ui.showUI() } }2.创建showui方法public void showUI() { }3.创建一个窗口对象jf对窗口的属性进行设置Myframe jfnew Myframe();//创建Myframe类的窗口对象 jf jf.setSize(800,800);//设置窗口大小 jf.setLocationRelativeTo(null);//设置窗口居中 jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//创建关闭方法 jf.setLayout(null);这段代码中布局设为空而Myframe是重写父方法4.加入基本按钮添加startBtn和btnJButton startBtn new JButton(开始游戏); startBtn.setBounds(630, 100, 100, 30); jf.add(startBtn); JButton btn new JButton(悔棋); btn.setBounds(630, 50, 100, 30); jf.add(btn);5.显示窗口jf.setVisible(true);//将窗口显示6.获取窗口的绘图对象Graphics g jf.getGraphics();//获取窗口jf的绘图对象g二.重写父类方法 进行扩展1.重写一个类进行扩展public class Myframe extends JFrame { }2.设置基本变量来确定棋盘大小int X100,Y100,SIZE30,ROW15,COL15;XY为棋盘左上角的坐标值SIZE为每个格子的边长ROW和COL为行列数3.声明方法 调用原本父类方法 绘制窗口public void paint(Graphics gr) { super.paint(gr); }4.绘制棋盘gr.setColor(Color.ORANGE); gr.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZESIZE,ROW*SIZESIZE); gr.setColor(Color.BLACK); for (int i 0; i ROW ; i) { gr.drawLine(X,Yi*SIZE,XCOL*SIZE,Yi*SIZE); gr.drawLine(Xi*SIZE,Y,Xi*SIZE,YROW*SIZE); }此时我们绘制了一个矩形fillfect用横竖线来绘制棋盘网格。在绘制网格是采用了循环的方法来提高效率。下图为绘制结果三.创建监听器此时需要对鼠标和按钮进行监听要用到MouseListener和ActionListener两类1.创建监听类实现鼠标监听器接口和按钮监听器接口public class Mousel implements MouseListener, ActionListener { }输入基本变量创建对象int X100,Y100,SIZE30,ROW15,COL15;Graphics gr;2.实现方法public interface ActionListener extends EventListener { }此方法用以监控按钮public void mouseClicked(MouseEvent e);{ } public void mousePressed(MouseEvent e);{ } public void mouseReleased(MouseEvent e);{ } public void mouseEntered(MouseEvent e);{ }此方法用来监听鼠标3.在我们创建的类中接入监听在Gameui类中接入鼠标和按钮Mousel mlnew Mousel();//创建对象ml jf.addMouseListener(ml);//给窗口添加监听器ml btn.addActionListener(ml);// 按钮点击事件 startBtn.addActionListener(ml);//将开始游戏的按钮接入监听 ml.grg;//将绘图对象g赋值给监听器ml中的gr jf.mlml;在Myframe类中接入鼠标监听Mousel ml;此代码应该放在方法外四.记录棋子的位置信息在监听器类中在方法体外的设置1.记录下棋数棋子的黑白信息int chessIndex 0; int chessFlag0;2.创建数组来储存棋子位置int[][] carrnew int[ROW1][COL1];创建一个类来构造方法创建对象时使用public class Chess { int r,c,chessFlag; public Chess(int r,int c,int chessFlag){ this.rr; this.cc; this.chessFlagchessFlag; } }在监听器类中方法体里面1.将信息存入数组中在public void mousePressed(MouseEvent e)中需要知道鼠标点击的位置信息xyint xe.getX(); int ye.getY();并将坐标化为网格坐标int c(x-XSIZE/2)/SIZE; int r(y-YSIZE/2)/SIZE;已知r和c的信息就可以把此位置是否有棋的信息存入carr[r][c]chessFlag;同时还可以将此棋位置的信息存入chess中Chess chess new Chess(r,c,chessFlag); chessList[chessIndex]chess; chessIndex;3.按钮开始游戏的判定可以根据chessflag是否为来判断游戏是否开始if(chessFlag0){ JOptionPane.showMessageDialog(null,请先点击开始游戏); return; }在之后将会在按钮类监听来改变chessflag的值4.棋子重复位置的判定在范围外无法下棋判定并进行弹窗提醒if (rROW||cCOL){ JOptionPane.showMessageDialog(null,超出范围无法下棋); return; }对有棋子地方无法下棋的判定if (carr[r][c]!0){ JOptionPane.showMessageDialog(null,该位置有棋子无法下棋); return; }5.棋子的设置棋子有黑白棋可以利用chessflag的值来判断if (chessFlag1){ gr.setColor(Color.BLACK); chessFlag2; }else if (chessFlag2){ gr.setColor(Color.WHITE); chessFlag1; }要保证棋子落在网格交叉点上就需要调整棋子位置圆是以之前的rc为左上角int cxc*SIZEX-SIZE/2; int cyr*SIZEY-SIZE/2; gr.fillOval(cx,cy,SIZE, SIZE);五.对棋盘的刷新在实现悔棋等的功能时需要对棋盘的状态进行改变。可以使用刷新棋盘的操作来实现1.创建方法来实现刷新操作重新绘制表格使用循环操作来绘制出储存在chess中的棋子public void repaint(){ gr.setColor(Color.ORANGE); gr.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZESIZE,ROW*SIZESIZE); gr.setColor(Color.BLACK); for (int i 0; i ROW ; i) { gr.drawLine(X,Yi*SIZE,XCOL*SIZE,Yi*SIZE); gr.drawLine(Xi*SIZE,Y,Xi*SIZE,YROW*SIZE); } for (int i 0; i chessIndex; i) { Chess chess1 chessList[i]; gr.setColor(chess1.chessFlag1?Color.BLACK:Color.WHITE); gr.fillOval(X chess1.c * SIZE - SIZE / 2, Y chess1.r * SIZE - SIZE / 2, SIZE, SIZE); } }此操作中绘制棋盘和之前操作一致在绘制棋子时使用for循环来遍历chess中储存的棋子信息以此来确定棋子颜色六.接入按钮监听实现游戏操作在ActionListener类中的public void actionPerformed(ActionEvent e)方法中实现1.获取按钮信息创建对象ac来进行判定String ac e.getActionCommand();2.悔棋的实现悔棋需要去掉棋子即将chess中的最后一个信息去掉。注意到我们之前的黑白棋字的判定方法需要将chess flag的值返回之前的状态才能在悔棋后下出正确的棋子颜色最后需要刷新棋盘来更新状态。if(ac.equals(悔棋)){ Chess chess chessList[chessIndex-1]; carr[chess.r][chess.c]0; if (chessFlag1){ chessFlag2; }else{ chessFlag1; } chessIndex--; repaint(); }3.开始游戏和结束游戏的设计可以在点击开始游戏后将开始游戏的按钮变成结束游戏以此来判断游戏是否进行。在点击开始游戏后需要对chessflagchessIndexcarr的状态进行更新完成所有操作后刷新界面else if(ac.equals(开始游戏)){ chessFlag1; chessIndex0; carrnew int[ROW1][COL1]; repaint(); JButton btn (JButton) e.getSource(); btn.setText(结束对局); btn.setBackground(Color.RED); }else if(ac.equals(结束对局)){ chessFlag0; JButton btn (JButton) e.getSource(); btn.setText(开始游戏); btn.setBackground(Color.GREEN); }七.输赢方法的设计五子棋判断输赢为是否有一方的五颗棋子连成一条线可以将其分为3种判定横竖斜1.创建一个类Winpublic class Win { }2.对输赢进行判断判断时用boolean方法1.横向判断创建一个row方法public static boolean row(int[][] arr, int r, int c) { int count 0; for (int i c - 1; i 0; i--) { if (arr[r][i] arr[r][c]) { count; } else { break; } } for (int i c 1; i arr.length; i) { if (arr[r][i] arr[r][c]) { count; } else { break; } } count; return count 5; }利用循环的方法统计同色棋子的个数最后判断count然后返回值(2).竖向判断public static boolean col(int[][] arr, int r, int c) { int count 0; for (int i r - 1; i 0; i--) { if (arr[i][c] arr[r][c]) { count; } else { break; } } for (int i r 1; i arr.length; i) { if (arr[i][c] arr[r][c]) { count; } else { break; } } count; return count 5; }(3).斜向判断斜向分4个方向使用双重循环来统计棋子个数public static boolean left(int[][] arr, int r, int c) { int count0; for(int ir-1,jc-1;i0j0;i--,j--){ if(arr[i][j]arr[r][c]){ count; }else{ break; } } for(int ir1,jc1;iarr.lengthjarr.length;i,j){ if(arr[i][j]arr[r][c]){ count; }else{ break; } } for(int ir-1,jc1;i0jarr.length;i--,j){ if(arr[i][j]arr[r][c]){ count; }else{ break; } } for(int ir1,jc-1;iarr.lengthj0;i,j--){ if(arr[i][j]arr[r][c]){ count; }else{ break; } } count return count 5; } }3.输赢条件判断只用3种方法中1种方法的值为真就可以判为赢static boolean checkWin(int[][] arr, int r, int c) { if (row(arr,r,c)||col(arr,r,c)||left(arr,r,c)) { return true; } return false; }4.输赢棋子的判断在public void mousePressed(MouseEvent e)中调用Win类中的carr来判断棋子if (Win.checkWin(carr,r,c)) { if (carr[r][c] 1) { System.out.println(Black wins!); JOptionPane.showMessageDialog(null, 黑棋获胜); chessFlag1; chessIndex0; carrnew int[ROW1][COL1]; repaint(); } else { System.out.println(White wins!); JOptionPane.showMessageDialog(null, 白棋获胜); chessFlag1; chessIndex0; carrnew int[ROW1][COL1]; repaint(); } }在判断完输赢后将chessIndexcarr恢复初始值刷新后可以继续下棋

相关新闻

ponytail技术解析:从基础概念到工程应用

ponytail技术解析:从基础概念到工程应用

我无法根据当前输入生成符合要求的博文。原因如下:项目标题仅为“ponytail”,这是一个英文单词,直译为“马尾辫”,属于常见发型术语;项目正文为空;关键词为空;摘要描述为空;所谓“相…

2026/10/7 10:05:46 阅读更多 →
代码驱动白板视频:rough.js+Playwright+FFmpeg全链路实现

代码驱动白板视频:rough.js+Playwright+FFmpeg全链路实现

1. 这不是动画软件,是用代码一笔一划“写”出来的白板视频你见过的白板视频,大概率是用After Effects加手绘插件、或者用Explain Everything这类工具录屏生成的。但这次我要说的,是另一种路径:整条视频里每一根线条、每一个文字、…

2026/10/7 10:05:46 阅读更多 →
C# WinForm 数据库备份与恢复实战:SQL语句与文件操作两种方式详解

C# WinForm 数据库备份与恢复实战:SQL语句与文件操作两种方式详解

简介:这份资源是面向C# WinForm开发者的数据库备份与恢复实战Demo,基于VS2008实现,适合需要为桌面应用增加数据安全保障能力的初中级开发者参考。示例围绕两种主流方案展开:一是借助SQLDMO这一COM对象模型,通过SQLServ…

2026/10/7 10:04:45 阅读更多 →

最新新闻

Java版驰骋BPM(JFlow)工作流引擎集成实战:从配置到组织同步

Java版驰骋BPM(JFlow)工作流引擎集成实战:从配置到组织同步

简介:这是一套基于Java的低代码BPM工作流引擎项目资源,集成表单引擎、流程引擎与权限控制,适合国内企业快速搭建业务审批与自动化流程。包内含2000个文件,其中Java源代码约1694个,构成核心业务逻辑;另有HTM…

2026/10/7 10:41:24 阅读更多 →
Linux内核心智模型:宏内核设计哲学与一切皆文件的本质

Linux内核心智模型:宏内核设计哲学与一切皆文件的本质

1. 为什么“Linux内核”不是一段代码,而是一套活的生存策略你打开终端敲下uname -r,看到一串像6.8.0-50-generic这样的版本号,这背后不是冷冰冰的二进制指令堆叠,而是一套持续演化了三十年、被全球数百万工程师用真实业务压力反复…

2026/10/7 10:41:24 阅读更多 →
2026降AI率工具实测:自考论文如何改出人味?

2026降AI率工具实测:自考论文如何改出人味?

2026年自考、成考、国开这几类群体里,“降AI率”突然成了刚需。原因很简单:提交毕业论文、课程报告、甚至部分实践作业之前,不少学校开始用AIGC检测系统做筛查,红字标出“疑似AI生成比例”。我也被问过太多次“到底哪个降AI率工具…

2026/10/7 10:41:24 阅读更多 →
Spring Boot社区康养系统开发全流程:从数据库设计到答辩通关指南

Spring Boot社区康养系统开发全流程:从数据库设计到答辩通关指南

每年到课程设计和毕业设计的季节,总能看到一批同学在“社区健康管理/康养管理”这类题目上反复挣扎。题目看着不难,但真正动手时才发现,它跟普通的增删改查系统不太一样——你要面对的不是一张简单的业务表,而是“老人档案 健康数…

2026/10/7 10:41:24 阅读更多 →
反转链表全攻略:迭代、递归与区间反转一次讲透

反转链表全攻略:迭代、递归与区间反转一次讲透

最近刷力扣热题 100(Hot 100)时,我反复在评论区看到同一个现象:好几道中等难度题目的题解里,大家都会绕回来先补一遍“反转链表”。链表这种结构,不反转时觉得哪儿都顺,一涉及反转,指…

2026/10/7 10:41:24 阅读更多 →
Altium Designer中DXF导入与PCB板框生成全流程指南

Altium Designer中DXF导入与PCB板框生成全流程指南

1. 结构图导入与板框生成的整体思路拆解搞PCB设计的人都有一个共识:板框这东西,看着简单,实际上是最容易埋雷的环节之一。尤其是当你拿到一份结构工程师给的DXF文件,里面可能有几十条甚至上百条线段、圆弧、样条曲线,还…

2026/10/7 10:40:23 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 7:15:40 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 5:29:09 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 8:21:32 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 4:21:51 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 1:18:13 阅读更多 →