目录

  • 先确定核心功能
  • 技术选型
  • 核心功能实现过程
    • 1. 数据模型设计
    • 2. 游戏界面和绘制逻辑
    • 3. 游戏主框架和事件处理
  • 飞算JavaAI在开发中的应用体验
  • 可以进一步优化的地方

作为Java课程的小作业,不想做太复杂的管理系统,就选了贪吃蛇这个经典小游戏。全程用Swing做界面,没用到任何第三方库,花了三天时间搞定了基本玩法。虽然没上线也没推广,纯当练手项目,但开发过程中踩了不少坑,记录下来说不定能帮到同样在学Java的同学。

请添加图片描述
在开发过程中,我尝试结合飞算JavaAI辅助开发,显著提升了开发效率,尤其是在代码优化和问题排查方面提供了不少帮助。

先确定核心功能

贪吃蛇的核心玩法玩法其实很简单,我梳理了必须实现的功能:

  • 蛇能自己移动,方向可以通过方向键控制
  • 随机生成食物,蛇吃到食物后身体变长
  • 撞到边界或自己的身体就算游戏结束
  • 显示当前分数(吃一个食物得10分)
  • 支持暂停/继续和重新开始游戏

技术选型

纯Java原生实现,没用到任何框架:

  • 界面:Swing(JFrame、JPanel这些基础组件)
  • 绘图:Graphics类(绘制蛇、食物和分数)
  • 事件监听:KeyListener(处理方向键输入)
  • 线程:Timer(控制蛇的移动速度)

核心功能实现过程

1. 数据模型设计

首先借助飞算JavaAI设计蛇和食物的数据结构,AI给出的方案非常合理,尤其是在面向对象设计方面给了我很多启发:

// 蛇的身体由多个节点组成,每个节点有x和y坐标
class SnakeNode {private int x;  // x坐标private int y;  // y坐标public SnakeNode(int x, int y) {this.x = x;this.y = y;}// getters and setterspublic int getX() { return x; }public int getY() { return y; }public void setX(int x) { this.x = x; }public void setY(int y) { this.y = y; }// 飞算JavaAI建议添加的equals方法,方便后续判断碰撞@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;SnakeNode snakeNode = (SnakeNode) obj;return x == snakeNode.x && y == snakeNode.y;}// 飞算JavaAI建议添加的hashCode方法@Overridepublic int hashCode() {return Objects.hash(x, y);}
}// 游戏数据模型
class GameModel {// 游戏区域大小(格子数)public static final int GRID_WIDTH = 30;public static final int GRID_HEIGHT = 20;// 每个格子的像素大小public static final int GRID_SIZE = 20;private List<SnakeNode> snake;  // 蛇的身体private SnakeNode food;         // 食物private int direction;          // 蛇的移动方向(上、下、左、右)private int score;              // 分数private boolean isGameOver;     // 游戏是否结束private boolean isPaused;       // 游戏是否暂停private int speed;              // 游戏速度,飞算JavaAI建议添加// 方向常量public static final int UP = 0;public static final int DOWN = 1;public static final int LEFT = 2;public static final int RIGHT = 3;public GameModel() {// 初始化蛇(从中间开始,长度为3)snake = new LinkedList<>();snake.add(new SnakeNode(GRID_WIDTH/2, GRID_HEIGHT/2));snake.add(new SnakeNode(GRID_WIDTH/2 - 1, GRID_HEIGHT/2));snake.add(new SnakeNode(GRID_WIDTH/2 - 2, GRID_HEIGHT/2));// 初始方向向右direction = RIGHT;// 生成第一个食物generateFood();// 初始化分数和游戏状态score = 0;isGameOver = false;isPaused = false;speed = 150;  // 初始速度,飞算JavaAI建议添加}// 生成食物(确保不会出现在蛇身上)public void generateFood() {Random random = new Random();int x, y;boolean onSnake;do {onSnake = false;x = random.nextInt(GRID_WIDTH);y = random.nextInt(GRID_HEIGHT);// 检查食物是否生成在蛇身上// 飞算JavaAI建议使用contains方法简化代码onSnake = snake.contains(new SnakeNode(x, y));} while (onSnake);food = new SnakeNode(x, y);}// 蛇移动一步public void move() {if (isGameOver || isPaused) return;// 获取蛇头SnakeNode head = snake.get(0);int newX = head.getX();int newY = head.getY();// 根据方向计算新头部位置switch (direction) {case UP:newY--;break;case DOWN:newY++;break;case LEFT:newX--;break;case RIGHT:newX++;break;}// 检查是否撞墙if (newX < 0 || newX >= GRID_WIDTH || newY < 0 || newY >= GRID_HEIGHT) {isGameOver = true;return;}// 检查是否撞到自己SnakeNode newHead = new SnakeNode(newX, newY);if (snake.contains(newHead)) {isGameOver = true;return;}// 添加新头部snake.add(0, newHead);// 检查是否吃到食物if (newX == food.getX() && newY == food.getY()) {// 吃到食物,加分并生成新食物score += 10;generateFood();// 飞算JavaAI建议:随着分数增加提高速度increaseSpeed();} else {// 没吃到食物,移除尾部snake.remove(snake.size() - 1);}}// 飞算JavaAI建议添加的速度增加方法private void increaseSpeed() {// 每得50分,速度提升10%if (score % 50 == 0 && speed > 50) {speed = (int)(speed * 0.9);}}// 改变方向(不能直接反向)public void changeDirection(int newDirection) {// 比如当前向左,不能直接向右if ((direction == LEFT && newDirection == RIGHT) || (direction == RIGHT && newDirection == LEFT) || (direction == UP && newDirection == DOWN) || (direction == DOWN && newDirection == UP)) {return;}direction = newDirection;}// 重置游戏public void reset() {snake.clear();snake.add(new SnakeNode(GRID_WIDTH/2, GRID_HEIGHT/2));snake.add(new SnakeNode(GRID_WIDTH/2 - 1, GRID_HEIGHT/2));snake.add(new SnakeNode(GRID_WIDTH/2 - 2, GRID_HEIGHT/2));direction = RIGHT;generateFood();score = 0;isGameOver = false;isPaused = false;speed = 150;  // 重置速度}// getters and setterspublic List<SnakeNode> getSnake() { return snake; }public SnakeNode getFood() { return food; }public int getScore() { return score; }public boolean isGameOver() { return isGameOver; }public boolean isPaused() { return isPaused; }public void setPaused(boolean paused) { isPaused = paused; }public int getSpeed() { return speed; }  // 飞算JavaAI建议添加
}

2. 游戏界面和绘制逻辑

在实现界面绘制时,飞算JavaAI帮我优化了绘图逻辑,解决了画面闪烁问题:

class GamePanel extends JPanel {private GameModel model;// 颜色定义private static final Color SNAKE_COLOR = new Color(76, 175, 80);    // 绿色private static final Color FOOD_COLOR = new Color(244, 67, 54);     // 红色private static final Color BG_COLOR = new Color(230, 230, 230);     // 浅灰色private static final Color TEXT_COLOR = new Color(33, 33, 33);      // 深灰色private static final Color BORDER_COLOR = new Color(200, 200, 200); // 边框颜色// 飞算JavaAI建议添加双缓冲解决闪烁问题private Image bufferImage;private Graphics bufferGraphics;public GamePanel(GameModel model) {this.model = model;// 设置面板大小setPreferredSize(new Dimension(GameModel.GRID_WIDTH * GameModel.GRID_SIZE,GameModel.GRID_HEIGHT * GameModel.GRID_SIZE));// 设置背景色setBackground(BG_COLOR);// 飞算JavaAI建议:设置焦点,确保键盘事件能被捕获setFocusable(true);requestFocusInWindow();}@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);// 飞算JavaAI建议使用双缓冲绘制if (bufferImage == null) {bufferImage = createImage(getWidth(), getHeight());bufferGraphics = bufferImage.getGraphics();}// 清空缓冲bufferGraphics.setColor(BG_COLOR);bufferGraphics.fillRect(0, 0, getWidth(), getHeight());// 绘制网格线,飞算JavaAI建议添加drawGrid(bufferGraphics);// 绘制蛇bufferGraphics.setColor(SNAKE_COLOR);for (SnakeNode node : model.getSnake()) {bufferGraphics.fillRect(node.getX() * GameModel.GRID_SIZE,node.getY() * GameModel.GRID_SIZE,GameModel.GRID_SIZE - 1,  // 减1是为了让蛇身体节点之间有缝隙GameModel.GRID_SIZE - 1);}// 绘制食物bufferGraphics.setColor(FOOD_COLOR);SnakeNode food = model.getFood();bufferGraphics.fillOval(food.getX() * GameModel.GRID_SIZE,food.getY() * GameModel.GRID_SIZE,GameModel.GRID_SIZE - 1,GameModel.GRID_SIZE - 1);// 绘制分数和速度信息bufferGraphics.setColor(TEXT_COLOR);bufferGraphics.setFont(new Font("Arial", Font.BOLD, 16));bufferGraphics.drawString("分数: " + model.getScore(), 10, 20);bufferGraphics.drawString("速度: " + (1000/model.getSpeed()) + "步/秒", 120, 20);// 游戏结束时显示提示if (model.isGameOver()) {drawCenteredString(bufferGraphics, "游戏结束!", getWidth()/2, getHeight()/2, new Font("Arial", Font.BOLD, 24));drawCenteredString(bufferGraphics, "按R键重新开始", getWidth()/2, getHeight()/2 + 30,new Font("Arial", Font.PLAIN, 16));}// 暂停时显示提示if (model.isPaused() && !model.isGameOver()) {drawCenteredString(bufferGraphics, "已暂停", getWidth()/2, getHeight()/2,new Font("Arial", Font.BOLD, 24));drawCenteredString(bufferGraphics, "按P键继续", getWidth()/2, getHeight()/2 + 30,new Font("Arial", Font.PLAIN, 16));}// 将缓冲图像绘制到屏幕g.drawImage(bufferImage, 0, 0, this);}// 飞算JavaAI建议添加的绘制网格线方法private void drawGrid(Graphics g) {g.setColor(BORDER_COLOR);// 绘制水平线for (int y = 0; y <= GameModel.GRID_HEIGHT; y++) {g.drawLine(0, y * GameModel.GRID_SIZE, GameModel.GRID_WIDTH * GameModel.GRID_SIZE, y * GameModel.GRID_SIZE);}// 绘制垂直线for (int x = 0; x <= GameModel.GRID_WIDTH; x++) {g.drawLine(x * GameModel.GRID_SIZE, 0, x * GameModel.GRID_SIZE, GameModel.GRID_HEIGHT * GameModel.GRID_SIZE);}}// 飞算JavaAI建议添加的居中绘制字符串方法private void drawCenteredString(Graphics g, String text, int x, int y, Font font) {g.setFont(font);FontMetrics metrics = g.getFontMetrics(font);int textX = x - metrics.stringWidth(text) / 2;int textY = y + (metrics.getAscent() - metrics.getDescent()) / 2;g.drawString(text, textX, textY);}@Overridepublic void update(Graphics g) {// 重写update方法,避免闪烁paint(g);}
}

3. 游戏主框架和事件处理

主框架实现时,飞算JavaAI帮我优化了事件处理和游戏循环逻辑:

public class SnakeGame extends JFrame {private GameModel model;private GamePanel panel;private Timer timer;  // 控制游戏刷新private int highScore;  // 最高分记录,飞算JavaAI建议添加public SnakeGame() {// 初始化模型和面板model = new GameModel();panel = new GamePanel(model);// 加载最高分,飞算JavaAI建议添加loadHighScore();// 设置窗口setTitle("贪吃蛇");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);  // 窗口不可 resize// 飞算JavaAI建议添加菜单栏createMenuBar();add(panel);pack();setLocationRelativeTo(null);  // 窗口居中显示// 初始化定时器,控制蛇的移动速度initTimer();// 添加键盘监听addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {handleKeyPress(e);}});// 窗口关闭时保存最高分,飞算JavaAI建议添加addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {saveHighScore();}});}// 飞算JavaAI建议添加的创建菜单栏方法private void createMenuBar() {JMenuBar menuBar = new JMenuBar();JMenu gameMenu = new JMenu("游戏");JMenuItem newGameItem = new JMenuItem("新游戏");newGameItem.addActionListener(e -> resetGame());JMenuItem exitItem = new JMenuItem("退出");exitItem.addActionListener(e -> {saveHighScore();System.exit(0);});gameMenu.add(newGameItem);gameMenu.addSeparator();gameMenu.add(exitItem);JMenu helpMenu = new JMenu("帮助");JMenuItem aboutItem = new JMenuItem("关于");aboutItem.addActionListener(e -> showAboutDialog());JMenuItem controlsItem = new JMenuItem("操作说明");controlsItem.addActionListener(e -> showControlsDialog());helpMenu.add(controlsItem);helpMenu.add(aboutItem);menuBar.add(gameMenu);menuBar.add(helpMenu);setJMenuBar(menuBar);}// 初始化定时器private void initTimer() {timer = new Timer(model.getSpeed(), e -> {model.move();// 检查是否刷新速度if (timer.getDelay() != model.getSpeed()) {timer.setDelay(model.getSpeed());}// 检查是否打破最高分if (model.getScore() > highScore) {highScore = model.getScore();}panel.repaint();});timer.start();}// 处理键盘事件private void handleKeyPress(KeyEvent e) {int key = e.getKeyCode();// 方向控制switch (key) {case KeyEvent.VK_UP:case KeyEvent.VK_W:  // 支持WASD控制,飞算JavaAI建议添加model.changeDirection(GameModel.UP);break;case KeyEvent.VK_DOWN:case KeyEvent.VK_S:model.changeDirection(GameModel.DOWN);break;case KeyEvent.VK_LEFT:case KeyEvent.VK_A:model.changeDirection(GameModel.LEFT);break;case KeyEvent.VK_RIGHT:case KeyEvent.VK_D:model.changeDirection(GameModel.RIGHT);break;case KeyEvent.VK_P:  // 暂停/继续case KeyEvent.VK_SPACE:  // 空格也可暂停,飞算JavaAI建议添加model.setPaused(!model.isPaused());panel.repaint();break;case KeyEvent.VK_R:  // 重新开始resetGame();break;case KeyEvent.VK_ESCAPE:  // 退出游戏,飞算JavaAI建议添加saveHighScore();System.exit(0);break;}}// 重置游戏private void resetGame() {model.reset();timer.setDelay(model.getSpeed());panel.repaint();}// 飞算JavaAI建议添加的加载最高分方法private void loadHighScore() {try {File file = new File("highscore.dat");if (file.exists()) {try (BufferedReader br = new BufferedReader(new FileReader(file))) {String scoreStr = br.readLine();highScore = Integer.parseInt(scoreStr);}} else {highScore = 0;}} catch (Exception e) {highScore = 0;System.err.println("加载最高分失败: " + e.getMessage());}}// 飞算JavaAI建议添加的保存最高分方法private void saveHighScore() {try (BufferedWriter bw = new BufferedWriter(new FileWriter("highscore.dat"))) {bw.write(String.valueOf(highScore));} catch (Exception e) {System.err.println("保存最高分失败: " + e.getMessage());}}// 飞算JavaAI建议添加的显示关于对话框方法private void showAboutDialog() {JOptionPane.showMessageDialog(this,"贪吃蛇 v1.0\nJava课程练手项目","关于",JOptionPane.INFORMATION_MESSAGE);}// 飞算JavaAI建议添加的显示操作说明方法private void showControlsDialog() {JOptionPane.showMessageDialog(this,"方向键或WASD: 控制蛇移动\n" +"空格或P: 暂停/继续游戏\n" +"R: 重新开始游戏\n" +"ESC: 退出游戏","操作说明",JOptionPane.INFORMATION_MESSAGE);}public static void main(String[] args) {// 在事件调度线程中启动游戏SwingUtilities.invokeLater(() -> {new SnakeGame().setVisible(true);});}
}

飞算JavaAI在开发中的应用体验

在开发这个贪吃蛇游戏的过程中,飞算JavaAI作为辅助工具提供了不少帮助:

  1. 代码优化建议:AI能够识别出代码中可以优化的部分,比如使用contains方法简化碰撞检测,添加equals和hashCode方法提高对象比较效率等。

  2. 功能扩展建议:AI不仅局限于实现基本功能,还提出了很多扩展建议,如添加最高分记录、支持WASD控制、增加游戏难度递增机制等,让游戏更完善。

  3. 最佳实践指导:在Swing界面开发方面,AI提供了双缓冲绘图、避免界面闪烁等最佳实践,解决了我开发中遇到的实际问题。

  4. 代码规范提示:AI建议的代码结构更清晰,命名更规范,帮助我养成良好的编程习惯。

  5. 问题排查帮助:当遇到蛇移动不同步、食物生成在蛇身上等问题时,AI能够快速定位原因并提供解决方案。

当然,AI的建议也需要筛选和判断,不能盲目采纳。在实际开发中,我会结合自己的理解和需求,选择性地应用AI提供的建议。

可以进一步优化的地方

虽然在飞算JavaAI的帮助下已经实现了不少功能,但还有可以完善的地方:

  1. 添加多种游戏模式(如限时模式、障碍模式)
  2. 实现更丰富的食物系统(特殊食物有不同效果)
  3. 添加音效和背景音乐
  4. 优化界面,支持皮肤切换
  5. 实现联网排行榜功能

总体来说,这个贪吃蛇项目是一次很好的Java练手经历。借助飞算JavaAI,我不仅提高了开发效率,还学到了很多Java编程的最佳实践。看到自己开发的小游戏能够正常运行,并且有不错的游戏体验,确实很有成就感。长大,还是挺有成就感的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93795.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93795.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93795.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何保障内部网络安全前提下,实现与外部互联网之间的文件传输?

在数字化时代&#xff0c;企业网络环境日益复杂&#xff0c;普遍采用“内外网隔离”的安全架构&#xff1a;内部办公网承载业务系统与数据&#xff0c;外部互联网则用于对外沟通与信息获取。这种隔离有效抵御了外部攻击&#xff0c;但也带来了“信息孤岛”问题——如何在保障内…

计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架

你说得对&#xff0c;if cv2.countNonZero(binary) 0: break 这个条件确实表示图像中已经没有非零像素&#xff0c;即图像完全变为空白。这并不是骨架化完成的标志&#xff0c;而是表示图像已经被腐蚀到没有任何内容了。 在骨架化过程中&#xff0c;我们需要一个更合适的停止条…

rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放

D1 参考 rt-thread官方sdk中&#xff0c;正点原子stm32f429-atk-appollo的board中有audio文件夹&#xff0c;包括了mic/play的程序&#xff0c;wm8978的库文件因为我们基于stm32h750内置adcdac设计&#xff0c;所以不需要wm8978.c/h。只需要移植drv_sound.c和drv_mic.c D2 工程…

AI重塑软件测试:质量保障的下一站

软件开发的世界变化飞快&#xff0c;系统越来越复杂&#xff0c;用户的胃口越来越大&#xff0c;产品上线的压力也越来越大。作为测试工程师&#xff0c;你是不是常常觉得传统测试已经跟不上节奏了&#xff1f;手工测试累死人&#xff0c;自动化脚本维护到崩溃&#xff0c;测试…

【前端基础知识系列六】React 项目基本框架及常见文件夹作用总结(图文版)

在 React 开发中&#xff0c;一个清晰合理的项目结构不仅能提高开发效率&#xff0c;还能让代码更易于维护和扩展。尤其是在团队协作中&#xff0c;统一的项目结构规范至关重要。本文将通过图文结合的方式&#xff0c;详细介绍 React 项目的基本框架以及常见文件夹的定义与作用…

0815 UDP通信协议TCP并发服务器

Part 1.思维导图一.UDP通信协议1.原理服务器端&#xff1a;1.用socket函数创建一个套接字文件2.创建服务器端地址结构体并赋值3.用ford函数将套接字文件与地址结构体绑定4.创建接收客户端地址结构体5.利用sendto和recvfrom函数传输和接收信息客户端&#xff1a;1.用socket函数创…

一个基于纯前端技术实现的五子棋游戏,无需后端服务,直接在浏览器中运行。

一 功能特性1.1 核心游戏功能- **标准五子棋规则**&#xff1a;1515棋盘&#xff0c;黑子(玩家)先手 - **AI对战模式**&#xff1a;白子AI具有中等难度&#xff0c;会进行智能进攻和防守 - **胜负判定**&#xff1a;支持横向、纵向、斜向五子连线获胜 - **平局检测**&#xff1…

HBuilderX升级,Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

目录 一、问题描述 二、问题原因 三、问题解析及解决方案 一、问题描述 最近开发新项目&#xff0c;升级了HBuilderX版本到4.75&#xff0c;最近要在之前的项目添加功能的时候发现报错&#xff0c;错误如下&#xff1a;Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sa…

像素风球球大作战 HTML 游戏

像素风球球大作战 HTML 游戏 下面是一个简单的像素风格球球大作战 HTML 游戏代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

文件导出时无法获取响应头Content-Disposition的文件名

1. 为什么Content-Disposition无法获取&#xff1f; 要拿到 Content-Disposition 里的 filename&#xff0c;可以用正则或者简单的字符串解析。 浏览器默认不让前端访问非标准响应头&#xff0c;Content-Disposition 需要后端显式暴露。 在浏览器开发者工具 → Network → Re…

Leetcode 128. 最长连续序列 哈希

原题链接&#xff1a; Leetcode 128. 最长连续序列 解法1: map&#xff0c;不符合要求 class Solution { public:int longestConsecutive(vector<int>& nums) {if (nums.size()0) return 0;map<int,int> mp;for(auto x: nums){mp[x];}int pre;int l0,r0,res0;…

禾赛激光雷达AT128P/海康相机(2):基于欧几里德聚类的激光雷达障碍物检测

目录 一、参考连接 二、实验效果​编辑 三、安装相应的 ros 依赖包 四、代码驱动 4.1 代码下载 4.2 代码文件放置(请按照这个命名放置代码) 4.3 代码编译 4.4 报错 一、参考连接

Vue Router的常用API有哪些?

文章目录一、路由配置相关二、路由实例方法&#xff08;router 实例&#xff09;三、组件内路由 API&#xff08;useRouter / useRoute&#xff09;四、导航守卫&#xff08;路由拦截&#xff09;五、路由视图与导航组件六、其他常用 API七、history模式和hash模式有什么区别&a…

从现场到云端的“通用语”:Kepware 在工业互联中的角色、使用方法与本土厂商(以胡工科技为例)的差异与优势

从现场到云端的“通用语”&#xff1a;Kepware 在工业互联中的角色、使用方法与本土厂商&#xff08;以胡工科技为例&#xff09;的差异与优势 文章目录从现场到云端的“通用语”&#xff1a;Kepware 在工业互联中的角色、使用方法与本土厂商&#xff08;以胡工科技为例&#x…

深入理解Prompt构建与工程技巧:API高效实践指南

深入理解Prompt构建与工程技巧&#xff1a;API高效实践指南 引言 Prompt&#xff08;提示&#xff09;工程是推动大模型能力极限的关键手段。合理的Prompt不仅能显著提升模型输出的相关性与准确性&#xff0c;在实际落地的API接口开发中同样起到举足轻重的作用。本文将系统介…

C++之多态(从0到1的突破)

世间百态&#xff0c;每个人都扮演着不同的角色&#xff0c;都进行着不同的行为。C更是如此&#xff0c;C中也会出现有着不同行为的多种形态的出现&#xff0c;那就让我们一起进入C的多态世界吧&#xff01;&#xff01;&#xff01; 一. 多态的概念 多态&#xff0c;顾名思义&…

路由器NAT的类型测定

目前所使用的NAT基本都是NAPT&#xff0c;即多端口的NAT技术&#xff0c;因此本文主要是设计了两种测定路由器NAPT类型的实验。 实验环境 设备 主机A&#xff1a;Windows主机B&#xff1a;Windows路由器 软件 ncWiresharkSocketTools 在局域网内部完成所有测试&#xff0c;完全…

ROS 2系统Callback Group概念笔记

核心概念 Callback Group&#xff08;回调组&#xff09;是一个管理一个或多个回调函数执行规则的容器。它决定了这些回调函数是如何被节点&#xff08;Node&#xff09;的 executor 调度的&#xff0c;特别是当多个回调函数同时就绪时&#xff0c;它们之间是并行执行还是必须串…

Qt——主窗口 mainWindow

主窗口 mainWindow 前面学习的所有代码&#xff0c;都是基于QWidget控件&#xff0c;其更多的是作为别的窗口的部分 现在来学习QMainWindow&#xff0c;即主窗口&#xff0c;其包含以下属性 Window Title&#xff1a;标题栏Menu Bar&#xff1a;菜单栏Tool Bar Area&#xff1a…

无训练神经网络影响下的智能制造

摘要 未训练神经网络&#xff08;Untrained Neural Networks, UNNs&#xff09;作为近年来人工智能领域的新兴范式&#xff0c;正在逐步改变智能制造的发展路径。不同于传统深度学习依赖大规模标注数据与高性能计算资源的模式&#xff0c;UNNs 借助网络结构自身的归纳偏置与初…