2026/5/18 20:24:35
网站建设
项目流程
研究生做家教什么网站,兰州网站建设方案详细,中国建设银行官方网站登录入口,网站推广有哪些方法关注公号“陈橘又青”#xff0c;后台回复“五子棋”获取完整源代码#xff01; 前言
大家好#xff0c;今天用swing技术写一个单机版的五子棋对战小游戏#xff0c;文中示例思路清晰、代码完整#xff0c;适合Java初学者尝试实战#xff0c;供大家参考。 效果展示 目录…关注公号“陈橘又青”后台回复“五子棋”获取完整源代码前言大家好今天用swing技术写一个单机版的五子棋对战小游戏文中示例思路清晰、代码完整适合Java初学者尝试实战供大家参考。效果展示目录效果展示一、游戏界面二、悔棋与重开功能项目介绍总体需求实现过程代码展示主框架棋子类棋盘类项目结构总结效果展示一、游戏界面二、悔棋与重开功能项目介绍五子棋是一种两人对弈的纯策略型棋类游戏亦称串珠连五子是中国民间非常熟知的一个古老棋种它因操作简单、逻辑性强深受喜爱本项目基于Java技术开发了一个操作简单、界面简洁、功能较完整的“五子棋”游戏。通过本游戏的开发达到初学者学习和熟悉软件开发流程的目的。总体需求本程序主要完成五子棋游戏的简单操作用户通过鼠标完成游戏过程。需要满足以下几点要求1实现五子棋简易窗口界面。2实现黑白棋轮流下棋功能。3实现自动判断获胜方功能。4实现悔棋与重开游戏功能。实现过程1.绘制窗体对象。2.UI设计包括游戏区域、黑白棋子、按钮和标题区域。3.使用鼠标监听事件实现下棋。4.连成五子判定获胜的实现。代码展示主框架在主框架里有面板对象和两个按钮对象分别是重新开始游戏按钮悔棋按钮。还设置一个按钮事件类用来监听两个按钮并作出相应的动作代码如下import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class ChessJFrame extends JFrame { private ChessBord chessbord;//声明一个棋盘对象 private Panel tool; //声明一个面板对象 private Button StartButton;//声明开始按钮 private Button BackButton;//声明悔棋按钮 private Button exitButton;//声明退出按钮 public ChessJFrame() {//构造函数 setTitle(单机版五子棋);//设置标题 MyButtonLister mbnew MyButtonLister();//按钮事件处理对象 toolnew Panel();//面板对象 chessbordnew ChessBord();//棋盘对象 StartButtonnew Button(Reopen);//设置开始按钮 BackButtonnew Button(Regret);//设置悔棋按钮 //exitButtonnew Button(EXIT);//设置退出游戏按钮 tool.setLayout(new FlowLayout(FlowLayout.CENTER ));//流式布局 tool.add(StartButton); tool.add(BackButton); // tool.add(exitButton);//将三个按钮添加到面板对象 StartButton.addActionListener(mb); BackButton.addActionListener(mb); // exitButton.addActionListener(mb);//将三个按钮添加到事件监听 add(tool,BorderLayout.SOUTH);//按钮所在的位置 add(chessbord);//添加棋盘对象 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭 pack();//自适应 } private class MyButtonLister implements ActionListener{ //按钮处理事件类 Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub Object obje.getSource();//获取事件源 if(objStartButton) {//事件源是重新开始按钮 System.out.println(重新开始); chessbord.restartGame(); } else if(objBackButton) {//事件源是悔棋按钮 System.out.println(悔棋); chessbord.goback(); } else if(objexitButton) {//事件源是退出按钮 System.exit(0); } } } public static void main(String[] args) { ChessJFrame jfnew ChessJFrame();//声明框架对象 jf.setLocationRelativeTo(null);//居中显示 jf.setVisible(true);//设置为可见 } }棋子类棋子类里有棋子的坐标半径和颜色还有棋子的构造函数。代码如下import java.awt.Color; public class Chess { private int x;//棋子的x坐标索引 private int y;//棋子的y坐标索引 private Color color;//棋子颜色 public static int DIAMETER30;//直径 public Chess(int x,int y,Color color){//棋子构造函数 this.xx; this.yy; this.colorcolor; } public int getX() { return x; } public int getY() { return y; } public Color getColor() { return color; } }棋盘类我们要对棋盘的边距网格的距离进行赋值设定棋盘的初始状态如默认黑子先下定义一个棋子类数组来保存棋子对象再定义一个字符串二维数组函数来保存颜色用来判断输赢用匿名内部类来处理当棋子在面板上移动时的一些状态。再对下棋时鼠标按下时的动作事件类进行解析当在网格上下棋时判断是否在棋盘内和判断网格上有没有棋子当棋子在棋盘内并且网格上没有棋子我们就开始画棋子将棋子对象和颜色保存接下来判断是否胜利判断棋盘是否下满如果没有继续下棋。使用函数paintComponent来对棋盘和棋子进行画图对棋子进行绘图时将最后一个棋子设为红色。最后就是判断棋子输赢的函数win用字符串数组保存的棋子的颜色来进行判断所在行和列有没有五个棋子相连判断撇和捺行的棋子有没有五个相连的如果有则某位棋子胜利。代码如下import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChessBord extends JPanel implements MouseListener{//继承面板类和鼠标事件接口 public static int MARGIN30;//定义边距 public static int ROWS15;//定义行数 public static int COLS15;//定义列数 public static int GRID_SPAN35;//网格间距 Chess[] chessListnew Chess[(ROWS1)*(COLS1)];//定义一个棋子数组 String[][] boardnew String[MARGIN*2GRID_SPAN*COLS][MARGIN*2GRID_SPAN*COLS];//声明一个字符串数组用来判断输赢 int chessCount;//棋子数目 int xindex,yindex;//棋子的坐标索引 boolean starttrue;//开始默认黑子先下 boolean GameOverfalse;//定义是否游戏结束 public ChessBord() {//棋盘类构造函数 setBackground(Color.LIGHT_GRAY);//设置背景颜色 addMouseListener(this);//将棋盘类添加到鼠标事件监听器 addMouseMotionListener(new MouseMotionListener() {//匿名内部类 Override public void mouseMoved(MouseEvent e) {//根据鼠标的移动所在的坐标来设置鼠标光标形状 int x1(e.getX()-MARGINGRID_SPAN/2)/GRID_SPAN;//对鼠标光标的x坐标进行转换 int y1(e.getY()-MARGINGRID_SPAN/2)/GRID_SPAN;//对鼠标光标的y坐标进行转换 if(x10||x1ROWS||y10||y1COLS||GameOver||findchess(x1, y1)) { setCursor(new Cursor(Cursor.DEFAULT_CURSOR));//设置鼠标光标为默认形状 }else { setCursor(new Cursor(Cursor.HAND_CURSOR));//设置鼠标光标为手型 } } Override public void mouseDragged(MouseEvent e) { } }); for(int i0;iMARGIN*2GRID_SPAN*COLS;i) {//对board[][]赋初值 for (int j 0; j MARGIN*2GRID_SPAN*COLS; j) { board[i][j]0; } } } Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } Override public void mousePressed(MouseEvent e) {//鼠标点击事件 if(GameOver)//游戏结束不能按 return ; String colorNamestart?黑棋:白棋;//判断是什么颜色的棋子 xindex(e.getX()-MARGINGRID_SPAN/2)/GRID_SPAN;//得到棋子x坐标 yindex(e.getY()-MARGINGRID_SPAN/2)/GRID_SPAN;//得到棋子y坐标 board[xindex][yindex]colorName;//以棋子x坐标y坐标做索引将棋子的颜色添加到board中 if(xindex0||xindexROWS||yindex0||yindexCOLS) {//棋子在棋盘外不能下 return ; }else if(findchess( xindex, yindex)) {//所下位置已有棋子不能下 return ; } Chess ponew Chess(xindex,yindex,start?Color.black:Color.WHITE);//对棋子对象进行初始化 chessList[chessCount]po;//将棋子对象添加到棋子数组中 repaint();//重画图型 if(win( xindex,yindex,start)) {//判断是否胜利 String msgString.format(恭喜 %s赢了,colorName); JOptionPane.showMessageDialog(this, msg); //gameOvertrue; GameOvertrue; }else if(chessCount(COLS1)*(ROWS1)) {//判断是否全部下满 String msgString.format(恭喜 %s赢了,colorName); JOptionPane.showMessageDialog(this, msg); GameOvertrue; } start!start;//改变棋子先下棋状态 } Override public void mouseReleased(MouseEvent e) { } Override public void mouseEntered(MouseEvent e) { } Override public void mouseExited(MouseEvent e) { } Override protected void paintComponent(Graphics g) {//画棋盘和棋子 super.paintComponent(g); for(int i0;iROWS;i) {//画横线 g.drawLine(MARGIN, MARGINi*GRID_SPAN, MARGINCOLS*GRID_SPAN, MARGINi*GRID_SPAN); } for(int j0;jCOLS;j) {//画竖线 g.drawLine(MARGINj*GRID_SPAN, MARGIN, MARGINj*GRID_SPAN, MARGINROWS*GRID_SPAN); } for(int i0;ichessCount;i) {//画棋子 int xposchessList[i].getX()*GRID_SPANMARGIN;//得到棋子x坐标 int yposchessList[i].getY()*GRID_SPANMARGIN;//得到棋子y坐标 g.setColor(chessList[i].getColor());//设置棋子颜色 g.fillOval(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER);//画棋子 if(ichessCount-1){ g.setColor(Color.red);//标记最后一个棋子为红色 g.drawRect(xpos-Chess.DIAMETER/2, ypos-Chess.DIAMETER/2, Chess.DIAMETER, Chess.DIAMETER); } } } private boolean findchess(int index,int yindex) {//查找所在位置是否有棋子 for (Chess c : chessList) { if(c!nullc.getX()xindexc.getY()yindex) return true; } return false; } private boolean win(int x,int y,boolean start) {//对棋子输赢的判断 String strstart?黑棋:白棋; //棋子所在行和列是否有五子相连的情况 for(int i0;i16;i){ if((board[x][i].equals(str)board[x][i1].equals(str)board[x][i2].equals(str)board[x][i3].equals(str)board[x][i4].equals(str))||(board[i][y].equals(str)board[i1][y].equals(str)board[i2][y].equals(str)board[i3][y].equals(str)board[i4][y].equals(str))) return true; } //棋子所在撇行是否有五子相连的情况 if(xy4xy30){ int i(xy19)?xy:xy-20; if(xy19){ for(int k0;ki-4;k){ if(board[k][i-k].equals(str)board[k1][i-k-1].equals(str)board[k2][i-k-2].equals(str)board[k3][i-k-3].equals(str)board[k4][i-k-4].equals(str)) return true; } }else{ for(int ki;k15;k){ if(board[k][20-k].equals(str)board[k1][20-k-1].equals(str)board[k2][20-k-2].equals(str)board[k3][20-k-3].equals(str)board[k4][20-k-4].equals(str)) return true; } } } //棋子所在捺行是否有五子相连的情况 if(y-x15x-y15){ int i(xy)?y-x:x-y; if(xy){ for(int k0;k19-4-i;k){ if(board[k][ik].equals(str)board[k1][ik1].equals(str)board[k2][ik2].equals(str)board[k3][ik3].equals(str)board[k4][ik4].equals(str)) return true; } }else{ for(int ki;k15;k){ if(board[k][ik].equals(str)board[k1][ik1].equals(str)board[k2][ik2].equals(str)board[k3][ik3].equals(str)board[k4][ik4].equals(str)) return true; } } } return false; } public void goback() {//悔棋函数 if(chessCount0) { return ; } chessList[chessCount-1]null; chessCount--; if(chessCount0) { xindexchessList[chessCount-1].getX(); yindexchessList[chessCount-1].getY(); } start!start; repaint(); } public void restartGame() {//重新开始函数 for(int i0;ichessList.length;i)//设置为初始状态 chessList[i]null; for(int i0;iMARGIN*2GRID_SPAN*COLS;i) { for (int j 0; j MARGIN*2GRID_SPAN*COLS; j) { board[i][j]0; } } starttrue; GameOverfalse; chessCount0; repaint(); } public Dimension getPreferredSize(){//画矩形 return new Dimension(MARGIN*2GRID_SPAN*COLS,MARGIN*2GRID_SPAN*ROWS); } }项目结构本程序用于Java初学者学习共封装三个类分别是主框架ChessJFrame类、棋子Chess类、棋盘ChessBord类结构简单框架明了。总结本项目的设计思路与“五子棋”游戏一致程序在界面设计与功能实现上还有许多不足但该项目的实现对于Java编程新手实战能力的提升有很大作用在编写该项目的过程中对编程者算法的设计能力与面向对象编程的理解都有深刻的考验。程序在一定程序上还有还有缺陷仅用于初学者学习欢迎各位指正。Java开发的就业市场正在经历结构性调整竞争日益激烈传统纯业务开发岗位如仅完成增删改查业务的后端工程师的需求特别是入门级岗位正显著萎缩。随着企业技术需求升级市场对Java人才的要求已从通用技能转向了更深入的领域经验如云原生、微服务或前沿的AI集成能力。这也导致岗位竞争加剧在一、二线城市求职者不仅面临技术内卷还需应对学历与项目经验的高门槛。大模型为核心的AI领域正展现出前所未有的就业热度与人才红利2025年AI相关新发岗位数量同比激增543%单月增幅最高超过11倍大模型算法工程师位居热门岗位前列。行业顶尖人才的供需严重失衡议价能力极强跳槽薪资涨幅可达30%-50%。值得注意的是市场并非单纯青睐算法研究员而是急需能将大模型能力落地于复杂业务系统的工程人才。这使得具备企业级架构思维和复杂系统整合经验的Java工程师在向“Java大模型”复合人才转型时拥有独特优势成为企业竞相争夺的对象其薪资天花板也远高于传统Java岗位。说真的这两年看着身边一个个搞Java、C、前端、数据、架构的开始卷大模型挺唏嘘的。大家最开始都是写接口、搞Spring Boot、连数据库、配Redis稳稳当当过日子。结果GPT、DeepSeek火了之后整条线上的人都开始有点慌了大家都在想“我是不是要学大模型不然这饭碗还能保多久”先给出最直接的答案一定要把现有的技术和大模型结合起来而不是抛弃你们现有技术掌握AI能力的Java工程师比纯Java岗要吃香的多。即使现在裁员、降薪、团队解散的比比皆是……但后续的趋势一定是AI应用落地大模型方向才是实现职业升级、提升薪资待遇的绝佳机遇如何学习AGI大模型作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享**一、2025最新大模型学习路线一个明确的学习路线可以帮助新人了解从哪里开始按照什么顺序学习以及需要掌握哪些知识点。大模型领域涉及的知识点非常广泛没有明确的学习路线可能会导致新人感到迷茫不知道应该专注于哪些内容。我们把学习路线分成L1到L4四个阶段一步步带你从入门到进阶从理论到实战。L1级别:AI大模型时代的华丽登场L1阶段我们会去了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理关键技术以及大模型应用场景通过理论原理结合多个项目实战从提示工程基础到提示工程进阶掌握Prompt提示工程。L2级别AI大模型RAG应用开发工程L2阶段是我们的AI大模型RAG应用开发工程我们会去学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。L3级别大模型Agent应用架构进阶实践L3阶段大模型Agent应用架构进阶实现我们会去学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造我们自己的Agent智能体同时还可以学习到包括Coze、Dify在内的可视化工具的使用。L4级别大模型微调与私有化部署L4阶段大模型的微调和私有化部署我们会更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。整个大模型学习路线L1主要是对大模型的理论基础、生态以及提示词他的一个学习掌握而L3 L4更多的是通过项目实战来掌握大模型的应用开发针对以上大模型的学习路线我们也整理了对应的学习视频教程和配套的学习资料。二、大模型经典PDF书籍书籍和学习文档资料是学习大模型过程中必不可少的我们精选了一系列深入探讨大模型技术的书籍和学习文档它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。书籍含电子版PDF三、大模型视频教程对于很多自学或者没有基础的同学来说书籍这些纯文字类的学习教材会觉得比较晦涩难以理解因此我们提供了丰富的大模型视频教程以动态、形象的方式展示技术概念帮助你更快、更轻松地掌握核心知识。四、大模型项目实战学以致用当你的理论知识积累到一定程度就需要通过项目实战在实际操作中检验和巩固你所学到的知识同时为你找工作和职业发展打下坚实的基础。五、大模型面试题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我们将提供精心整理的大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。因篇幅有限仅展示部分资料需要点击下方链接即可前往获取2025最新版CSDN大礼包《AGI大模型学习资源包》免费分享