开发五子棋小游戏3.0
效果展示功能改进1、窗体画面不丢失在ChessTools类中编写drawChessBoard、drawAllChess方法并在MyFrame类中重写的paint里调用这样窗体每刷新一次棋盘、棋子就重绘一次。2、结合一维数组和二维数组实现功能创建一维数组记录落子顺序解决重复落子、悔棋问题创建二维数组记录棋子的位置重复落子、悔棋、判断输赢3、关键代码提醒实现悔棋功能时需要定义一个全局变量size来记录落子顺序MouseReleased方法中有一处代码chess[r][c] chessColor;即将chessColor赋给每个棋子这样在实现判断输赢功能时颜色相同即可转化为二维数组相等GoBangListener类中的画笔需要由MyFrame类来传递在GoBangUI中实现传递是因为该类中早已创建GoBangListener的对象和MyFrame的对象固定格式如下Graphics g mf.getGraphics(); gbl.g g;当一个类创建的对象需要在多个类当中使用时往往只在其中那一个已经创建了其他多个类的对象的类中创建对象其他需要调用该对象的类只需设置引用变量然后在创建这个对象的类中分别将该对象传给其他类中的引用变量即可,相关代码举例/*写在GoBangUI类中*/ ChessTools ct new ChessTools(); //将棋子工具类的对象传给窗体对象和监听器对象 myFrame.ct ct; gbl.ct ct;代码展示一基础版Data接口package GoBang.v1; public interface Data { final int X50,Y50,SIZE40,ROW15,COL15; }Chess类package GoBang.v1; public class Chess { int row; int col; int color; }MyFrame类继承JFrame类package GoBang.v1; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame implements Data { GoBangListener gol; ImageIcon ii new ImageIcon(D:\\谢智宁\\其他\\编程入门\\图片素材\\3865cd33e305922fcebd3c28aa422396 (1).jpeg); Override public void paint(Graphics g) { super.paint(g); g.drawImage(ii.getImage(),0,0,850,800,null); //绘制棋盘图 Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZE,ROW*SIZE); //画线 Color col1 new Color(0,0,0); g.setColor(col1); for(int i0;iCOL;i){ g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE); g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE); } //画点 g.setColor(Color.black); g.fillOval(X3*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X3*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X7*SIZE-5,Y7*SIZE-5,10,10); // 绘制已经保存的棋子 调用监听器中的棋子数组 int size gol.size; Chess[] cs gol.cs; for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } }GoBangListener类package GoBang.v1; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GoBangListener implements MouseListener, ActionListener, Data { Graphics g; int chessColor 1;//初始值为黑色1为黑2为白0为空 int size 0; //创建一个二维数组存储棋子的位置 int chess[][] new int[ROW][COL]; //创建一个一维数组保存棋子信息 Chess[] cs new Chess[225]; public void actionPerformed(ActionEvent e){ String hq e.getActionCommand(); if(hq.equals(悔棋)){ if(size 0){ JOptionPane.showMessageDialog(null,没有可悔的棋子); }else{ Chess lastChess cs[size-1];//取出最后一个子 int c lastChess.col; int r lastChess.row; chess[r][c] 0;//清空二维数组中的存储数据保证可再在此处落子 cs[size-1] null;//删除最后一颗棋子 size--; chessColor lastChess.color;//切换下子方 flushUI(); } } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ //获取鼠标释放处的坐标值 int x e.getX(); int y e.getY(); //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; //判断落子是否越界 if(xX-SIZE/2||cCOL||yY-SIZE/2||rROW||c0||r0){ JOptionPane.showMessageDialog(null,该区域无法落子); return; } //将行列值还原成坐标 int cx c*SIZEX; int ry r*SIZEY; if(chess[r][c]!0){ JOptionPane.showMessageDialog(null,此处已有棋子); return; } //将棋子颜色保存到二维数组中 chess[r][c] chessColor; //创建棋类对象,将棋子存储到数组中 Chess CS new Chess(); CS.row r; CS.col c; CS.color chessColor; cs[size] CS; size; //交替落子 if(chessColor 1){ g.setColor(Color.black); chessColor 2; }else if(chessColor 2){ g.setColor(Color.white); chessColor 1; } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); }public void flushUI() { //绘制棋盘图 Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X - SIZE / 2, Y - SIZE / 2, COL * SIZE, ROW * SIZE); //画线 Color col1 new Color(0, 0, 0); g.setColor(col1); for (int i 0; i COL; i) { g.drawLine(X, Y i * SIZE, X (COL - 1) * SIZE, Y i * SIZE); g.drawLine(X i * SIZE, Y, X i * SIZE, Y (ROW - 1) * SIZE); } //画点 g.setColor(Color.black); g.fillOval(X 3 * SIZE - 5, Y 3 * SIZE - 5, 10, 10); g.fillOval(X 11 * SIZE - 5, Y 11 * SIZE - 5, 10, 10); g.fillOval(X 3 * SIZE - 5, Y 11 * SIZE - 5, 10, 10); g.fillOval(X 11 * SIZE - 5, Y 3 * SIZE - 5, 10, 10); g.fillOval(X 7 * SIZE - 5, Y 7 * SIZE - 5, 10, 10); // 绘制已经保存的棋子 调用监听器中的棋子数组 for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }GoBangUI类package GoBang.v1; import javax.swing.*; import java.awt.*; public class GoBangUI implements Data { public void showUI(){ MyFrame myFrame new MyFrame(); myFrame.setTitle(五子棋2.0); myFrame.setSize(850,800); myFrame.setDefaultCloseOperation(3); myFrame.setLocationRelativeTo(null); myFrame.setPreferredSize(null); //将鼠标监听器绑定在窗体上 GoBangListener gbl new GoBangListener(); myFrame.addMouseListener(gbl); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 myFrame.setLayout(null);// 设置布局 为null 自己指定每个组件的尺寸与位置 JButton jb new JButton(悔棋); jb.addActionListener(gbl); jb.setBackground(Color.white); jb.setBounds(XSIZE*COL,YSIZE,SIZE*2,SIZE); Font font new Font(微软雅黑,Font.BOLD,20); jb.setFont(font); myFrame.add(jb); myFrame.setVisible(true); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 myFrame.gol gbl;//将监听器对象传给myFrame中的监听器成员变量确保myFrame中调用的和这里的监听器是同一个 } static void main() { GoBangUI gbui new GoBangUI(); gbui.showUI(); } }二整理升级版Data接口package GoBang.v2; public interface Data { final int X50,Y50,SIZE40,ROW15,COL15; }Chess类package GoBang.v2; public class chess { int row; int col; int color; }MyFrame类继承JFrame类package GoBang.v2; import javax.swing.*; import java.awt.*; public class MyFrame extends JFrame implements Data { ImageIcon ii new ImageIcon(D:\\谢智宁\\其他\\编程入门\\图片素材\\3865cd33e305922fcebd3c28aa422396 (1).jpeg); chessTools ct; Override public void paint(Graphics g) { super.paint(g); g.drawImage(ii.getImage(),0,0,850,800,null); ct.drawChessBoard(g); ct.drawAllChess(g); } }GoBangListener类package GoBang.v2; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; public class GoBangListener implements MouseListener, ActionListener { chessTools ct; Graphics g; public void actionPerformed(ActionEvent e){ String ac e.getActionCommand();//获取按钮的文本 if(ac.equals(悔棋)){ ct.rebackChess(g); } //获取按钮 JButton playJbt (JButton)e.getSource(); if(ac.equals(开始对局)){ ct.startGame(g); playJbt.setText(对局结束); ct.drawChessBoard(g); }else if(ac.equals(对局结束)){ ct.gameOver(); playJbt.setText(开始对局); } } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e){ } public void mouseReleased(MouseEvent e){ //获取鼠标释放处的坐标值 int x e.getX(); int y e.getY(); ct.playChess(x,y,g); } public void mouseEntered(MouseEvent e){ } public void mouseExited(MouseEvent e){ } }ChessTools类package GoBang.v2; import javax.swing.*; import java.awt.*; public class chessTools implements Data{ //创建一个二维数组存储棋子的位置 private int chess[][] new int[ROW][COL]; //创建一个一维数组记录棋子顺序 private chess[] cs new chess[225]; private int chessColor 0;//初始值为空1为黑2为白0为空 private int size 0; //绘制棋盘图 public void drawChessBoard(Graphics g){ Color col new Color(246, 149, 56); g.setColor(col); g.fillRect(X-SIZE/2,Y-SIZE/2,COL*SIZE,ROW*SIZE); //画线 Color col1 new Color(0,0,0); g.setColor(col1); for(int i0;iCOL;i){ g.drawLine(X,Yi*SIZE,X(COL-1)*SIZE,Yi*SIZE); g.drawLine(Xi*SIZE,Y,Xi*SIZE,Y(ROW-1)*SIZE); } //画点 g.setColor(Color.black); g.fillOval(X3*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X3*SIZE-5,Y11*SIZE-5,10,10); g.fillOval(X11*SIZE-5,Y3*SIZE-5,10,10); g.fillOval(X7*SIZE-5,Y7*SIZE-5,10,10); } //开始下棋 public void startGame(Graphics g) { chessColor 1; chess new int[ROW][COL];//重新创建数组达到清空二维数组效果 cs new chess[225];//清空一维数组 size 0; drawChessBoard(g); } //结束对局 public void gameOver(){ chessColor 0;//后续无法落子 } //画所有保存的棋子 public void drawAllChess(Graphics g){ // 绘制已经保存的棋子 调用监听器中的棋子数组 for (int i 0; i size; i) { int r cs[i].row; int c cs[i].col; int color cs[i].color; int cx c*SIZEX; int ry r*SIZEY; if (color 1) { g.setColor(Color.black); }else if (color 2) { g.setColor(Color.white); } //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } } public void rebackChess(Graphics g) { if (size 0) { JOptionPane.showMessageDialog(null, 没有可悔的棋子); } else { chess lastChess cs[size - 1];//取出最后一个子 int c lastChess.col; int r lastChess.row; chess[r][c] 0;//清空二维数组中的存储数据保证可再在此处落子 cs[size - 1] null;//删除最后一颗棋子 size--; chessColor lastChess.color;//切换下子方 drawChessBoard(g); drawAllChess(g); } } public boolean checkPlayChess(int x,int y){ if (chessColor 0) { JOptionPane.showMessageDialog(null, 请先开始对局); return false; } //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; //判断落子是否越界 if(xX-SIZE/2||cCOL||yY-SIZE/2||rROW||c0||r0){ JOptionPane.showMessageDialog(null,该区域无法落子); return false; } if(chess[r][c]!0){ JOptionPane.showMessageDialog(null,此处已有棋子); return false; } return true; } public void saveChessData(int r,int c){ //将棋子颜色保存到二维数组中 chess[r][c] chessColor; //创建棋类对象,将棋子存储到数组中 chess CS new chess(); CS.row r; CS.col c; CS.color chessColor; cs[size] CS; size; } public void drawChess(int c,int r,Graphics g){ //交替落子 if(chessColor 1){ g.setColor(Color.black); chessColor 2; }else if(chessColor 2){ g.setColor(Color.white); chessColor 1; } //将行列值还原成坐标 int cx c*SIZEX; int ry r*SIZEY; //绘制棋子 g.fillOval(cx-SIZE/2,ry-SIZE/2,SIZE,SIZE); } public void playChess(int x,int y,Graphics g){ //将坐标值通过算法转化为行列值 int c (x-XSIZE/2)/SIZE; int r (y-YSIZE/2)/SIZE; if(!checkPlayChess(x,y)){ return; } saveChessData(r,c);//先保存再绘制棋子不然chessColor会先改变保存的棋子颜色有误 drawChess(c,r,g); isWin(c,r); } //r,c为最后一颗落子的行列值 public int Row(int r,int c) { int count 1; //向左寻找连续的颜色相同的棋子 for (int i c - 1; i 0; i--) { if (chess[r][i] chess[r][c]) { count; }else{ break; } } //向右寻找 for (int i c 1; i COL; i) { if (chess[r][i] chess[r][c]) { count; }else{ break; } } return count; } public int Col(int r,int c){ int count 0; //向上寻找 for(int ir-1;i0;i--){ if(chess[i][c]chess[r][c]){ count; }else{ break; } } //向下寻找 for(int ir1;iROW;i){ if(chess[i][c]chess[r][c]){ count; }else{ break; } } count; return count; } // 左斜向判断 左上到右下 public int Left(int r, int c) { int count 1; //向左上寻找 for(int ir-1,jc-1;i0j0;i--,j--){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } //向右下寻找 for(int ir1,jc1;iROWjCOL;i,j){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } return count; } //右斜下判断 public int Right(int r,int c){ int count 1; //向右上寻找 for(int ir-1,jc1;i0jCOL;i--,j){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } //向左下寻找 for(int ir1,jc-1;iROWj0;i,j--){ if(chess[i][j]chess[r][c]){ count; }else{ break; } } return count; } public boolean isWin(int c,int r){ int rc Row(r,c); int cc Col(r,c); int lc Left(r,c); int rtc Right(r,c); if(rc5||cc5||lc5||rtc5){ if(chess[r][c]1){ JOptionPane.showMessageDialog(null,黑棋胜利); chessColor0; }else { JOptionPane.showMessageDialog(null, 白棋胜利); chessColor0; } return true; }else{ return false; } } }GoBangUI类package GoBang.v2; import GoBang.v1.Data; import javax.swing.*; import java.awt.*; public class GoBangUI implements Data { ChessTools ct new ChessTools(); public void showUI(){ MyFrame myFrame new MyFrame(); myFrame.setTitle(五子棋3.0); myFrame.setSize(850,800); myFrame.setDefaultCloseOperation(3); myFrame.setLocationRelativeTo(null); myFrame.setPreferredSize(null); //将鼠标监听器绑定在窗体上 GoBangListener gbl new GoBangListener(); myFrame.addMouseListener(gbl); myFrame.setLayout(null);// 设置布局 为null 自己指定每个组件的尺寸与位置 Font font new Font(微软雅黑, Font.BOLD, 16); JButton startBtn new JButton(开始对局); startBtn.addActionListener(gbl); startBtn.setBounds(XSIZE*COL,YSIZE,SIZE*3,SIZE); startBtn.setBackground(Color.WHITE); startBtn.setFont(font); myFrame.add(startBtn); JButton jb new JButton(悔棋); jb.addActionListener(gbl); jb.setBackground(Color.white); jb.setBounds(XSIZE*COL,YSIZE*2,SIZE*3,SIZE); jb.setFont(font); myFrame.add(jb); myFrame.add(startBtn); myFrame.setVisible(true); gbl.g myFrame.getGraphics();//将窗体中的画笔的地址传给监听器中成员变量g使得该变量也可以使用画笔的方法,必须放在窗体可视化后 //将棋子工具类的对象传给窗体对象和监听器对象 myFrame.ct ct; gbl.ct ct; } static void main() { GoBangUI gbui new GoBangUI(); gbui.showUI(); } }

相关新闻

Python零基础入门:从环境搭建到实战项目,手把手带你系统学习

Python零基础入门:从环境搭建到实战项目,手把手带你系统学习

很多朋友在刚开始学习Python时,都会遇到一个共同的问题:网上资料太多太杂,东一榔头西一棒子,学了半天感觉还是云里雾里,不知道如何把知识点串联起来应用到实际项目中。本文旨在为你提供一份系统、完整、可实践的Python…

2026/8/13 12:31:52 阅读更多 →
RDMA与AI优化在KVStore数据同步中的实践

RDMA与AI优化在KVStore数据同步中的实践

1. 项目背景与核心挑战 在分布式存储系统中,KVStore作为基础组件,其数据同步效率直接影响整个系统的吞吐量和延迟表现。传统TCP/IP协议栈的多次内存拷贝和内核态-用户态切换已成为性能瓶颈,特别是在跨节点同步场景下。我们团队近期尝试将RDMA…

2026/8/13 12:30:52 阅读更多 →
31个实用功能!Switch游戏文件管理终极解决方案NSC_BUILDER完整指南

31个实用功能!Switch游戏文件管理终极解决方案NSC_BUILDER完整指南

31个实用功能!Switch游戏文件管理终极解决方案NSC_BUILDER完整指南 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerig…

2026/8/13 12:30:52 阅读更多 →

最新新闻

Logback配置实战:开箱即用的Spring Boot日志模板与生产环境最佳实践

Logback配置实战:开箱即用的Spring Boot日志模板与生产环境最佳实践

1. 为什么你需要一个“开箱即用”的Logback配置模板? 如果你正在开发Java项目,尤其是Spring Boot应用,那么Logback几乎是你日志系统的默认选择。但每次新建一个项目,或者需要对现有项目的日志进行精细化调整时,面对一个…

2026/8/13 13:29:21 阅读更多 →
Java字符串空白字符处理全解析:从trim到strip再到性能优化

Java字符串空白字符处理全解析:从trim到strip再到性能优化

1. 项目概述:一个看似简单却暗藏玄机的问题在Java开发中,处理字符串几乎是每天都要做的事情。其中,移除字符串中的空白字符(Whitespace)——包括空格、制表符、换行符等——是一个高频且基础的操作。你可能觉得这有什么…

2026/8/13 13:29:21 阅读更多 →
atan2函数:从数学原理到工程实践,解决角度计算中的象限问题

atan2函数:从数学原理到工程实践,解决角度计算中的象限问题

1. 从“atan”到“atan2”:一个看似简单却至关重要的函数演进如果你写过代码,尤其是涉及到图形、游戏、机器人导航或者任何需要计算角度的程序,你大概率用过或者见过atan这个函数。它就是大名鼎鼎的反正切函数,给你一个对边比邻边…

2026/8/13 13:29:21 阅读更多 →
C盘告急、系统变卡?一份 Dism++ 系统优化实操手册帮你快速自救

C盘告急、系统变卡?一份 Dism++ 系统优化实操手册帮你快速自救

C盘告急、系统变卡?一份 Dism 系统优化实操手册帮你快速自救 【免费下载链接】Dism-Multi-language Dism Multi-language Support & BUG Report 项目地址: https://gitcode.com/gh_mirrors/di/Dism-Multi-language 磁盘空间告急、系统更新反复失败、电脑…

2026/8/13 13:29:21 阅读更多 →
VisualCppRedist AIO:3分钟搞定VC++运行库一键安装,从此告别DLL报错与游戏闪退

VisualCppRedist AIO:3分钟搞定VC++运行库一键安装,从此告别DLL报错与游戏闪退

VisualCppRedist AIO:3分钟搞定VC运行库一键安装,从此告别DLL报错与游戏闪退 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 周六下午&am…

2026/8/13 13:29:21 阅读更多 →
ADB、Fastboot驱动装不上?这款Windows一键安装工具3分钟帮你彻底解脱

ADB、Fastboot驱动装不上?这款Windows一键安装工具3分钟帮你彻底解脱

ADB、Fastboot驱动装不上?这款Windows一键安装工具3分钟帮你彻底解脱 【免费下载链接】Latest-adb-fastboot-installer-for-windows A Simple Android Driver installer tool for windows (Always installs the latest version) 项目地址: https://gitcode.com/gh…

2026/8/13 13:28:20 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →