记忆翻牌游戏是一种经典的益智游戏,玩家需要翻开卡片并记住它们的位置,然后找到所有匹配的卡片对。
核心玩法

  1. 游戏开始时,所有卡片都是背面朝上
  2. 玩家每次可以翻开两张卡片
  3. 如果两张卡片图案相同,则保持翻开状态(匹配成功)
  4. 如果两张卡片图案不同,则自动翻回背面(匹配失败)
  5. 游戏目标是在最少步数和最短时间内找到所有匹配的卡片对
    🧠 一、记忆翻牌游戏拆解(小积木块)

想象你有好多张背面一样的“魔法卡片”,正面藏着成对的可爱图案(比如两只小猫🐱🐱、两个苹果🍎🍎)。你的任务就是找出所有相同的“双胞胎”卡片!

  1. 🃏 主角(卡片):
  • 每张卡片有两面:
    • 背面: 所有卡片都一样(比如蓝色花纹、卡背图案)。
    • 正面: 每张卡片都有唯一的图案(小猫、小狗、苹果、汽车…),但每种图案恰好有2张(成对)。
  • 卡片数量:通常是 偶数(比如4x4=16张,就是8对;6x6=36张,就是18对)。
  1. 🎮 游戏场地(卡片网格):
  • 卡片整齐地排列在一个网格里(比如4行4列)。
  • 游戏开始时,所有卡片都是背面朝上(你看不到图案)。
  1. 🎮 游戏规则(怎么玩):
  • 轮到你: 点击翻开两张卡片(让它们正面朝上)。
  • 配对成功: 如果翻开的两张卡片图案相同(是“双胞胎”):
    • 这两张卡片会保持正面朝上(或者有特殊效果,比如发光、消失)。
    • 你找到了一对!这对卡片就“被封印”了,不能再翻动。
    • 你可以继续翻下一轮(再翻两张)。
  • 配对失败: 如果翻开的两张卡片图案不同:
    • 稍等一会儿(比如1-2秒),让玩家看清楚。
    • 这两张卡片会自动翻转回去,变成背面朝上(就像被施了遗忘魔法)。
    • 轮到结束(或者轮到下一位玩家,如果是多人玩)。
  • 胜利条件: 找出网格里所有的卡片对!所有卡片都正面朝上且配对成功。
  • 失败条件: 通常没有严格失败,但可以用计时器或步数限制增加挑战(比如在2分钟内完成,或者最多只能翻错50次)。
  1. 👀 游戏界面(看到的画面):
  • 显示卡片网格(整齐排列的小方块)。
  • 卡片背面朝上时:显示统一的背面图案。
  • 卡片被翻开时:显示它正面的独特图案。
  • 卡片配对成功时:保持正面朝上,可能有高亮、边框、消失动画等。
  • 计时器: 显示你玩了多久(可选,增加紧张感)。
  • 步数/尝试次数: 显示你总共翻开了多少次卡片(每次翻两张算一次尝试)(可选)。
  • 剩余对数: 显示还有多少对卡片没找到(比如“还剩 5 对”)。
  • 开始/重新开始按钮: 点击开始新游戏。
  • 胜利画面: 所有配对完成后,显示“恭喜你赢了!”、用时、步数等信息。
  1. 🔊 声音效果(加分项):
  • 点击翻开卡片时的“翻牌”声。
  • 配对成功时的“叮咚”或欢快音效。
  • 配对失败时的“噗”或轻微提示音。
  • 所有配对完成时的胜利音乐🎉。
  • 计时器滴答声(如果有时钟压力)。

🛠️ 二、记忆翻牌游戏开发过程拆解(搭积木步骤)

📝 第1步:想点子 & 画草图 (设计)

  • 小朋友要做: 决定卡片主题(动物?水果?恐龙?)。画几种你喜欢的图案,每种画两张。画一个4x4的格子,把卡片背面向上的样子画进去。想想怎么玩。
  • 开发: 确定核心规则(翻两张、配对成功保留/失败翻转、胜利条件)。确定网格大小(几x几?几对卡片?)。画界面草图(网格布局、计时器位置、按钮位置)。

🧪 第2步:做个小实验 (原型)

  • 小朋友要做: 用纸片做16张小卡片(8种图案,每种2张)。背面涂成一样颜色。打乱后背面朝上摆在桌子上,和家人一起玩!
  • 开发: 用代码快速实现最核心功能:
    1. 创建一个卡片列表(存储图案ID,每种ID出现两次)。
    2. 打乱列表顺序(洗牌)。
    3. 在网格上显示所有卡片(显示背面图)。
    4. 模拟点击(比如在控制台输入坐标A1, B2):
    • “翻开”第一张(控制台显示图案ID)。
    • “翻开”第二张(控制台显示图案ID)。
    • 判断两张ID是否相同:
      • 相同:控制台打印“配对成功!”,这两张卡片状态改为“已配对”。
      • 不同:控制台打印“配对失败!”,稍等后状态改回“背面”。
    1. 检查是否所有卡片都配对了(控制台打印“胜利!”)。
    • 目的: 验证“卡片生成与洗牌”、“翻开两张”、“配对判断”、“状态管理”的逻辑是否正确。先不做图形界面和动画!

📋 第3步:制定详细计划 (设计文档)

  • 小朋友要做: 写下清楚的规则:一次翻几张?怎么算成功?怎么算失败?怎么算赢?卡片图案有哪些?
  • 大人(开发者)做: 详细规划:
    • 数据结构: 如何表示一张卡片?
      • 属性:图案ID(数字或名字)、当前状态(背面 / 正面 / 已配对)、在网格中的位置(行, 列)。
    • 卡片数组: 用一个数组(或二维数组)存储网格里所有卡片对象。
    • 游戏状态管理:
      • 当前可操作:玩家可以点击卡片。
      • 等待配对结果:玩家刚翻开第一张,等待翻第二张。
      • 显示结果中:玩家翻开了两张,正在显示结果(成功停留/失败后翻转回去的动画期间),此时不能点击新卡片。
      • 游戏结束:胜利或失败(如果有限制)。
    • 核心逻辑流程:
      1. 玩家点击一张状态为背面的卡片。
      2. 如果当前状态是可操作:
      • 将该卡片状态改为正面,显示图案。
      • 记录这是第一张翻开的卡片。
      • 游戏状态变为等待配对结果。
      1. 玩家点击第二张状态为背面的卡片。
      • 将该卡片状态改为正面,显示图案。
      • 游戏状态变为显示结果中。
      • 判断: 第一张卡片的图案ID == 第二张卡片的图案ID?
        • 是(配对成功):
          • 将这两张卡片状态改为已配对(它们不能再被点击)。
          • 播放成功音效,可以加点特效。
          • 检查胜利: 是否所有卡片状态都是已配对?如果是 -> 胜利!
          • 游戏状态变回可操作(玩家可以继续翻下一对)。
        • 否(配对失败):
          • 等待1-2秒(让玩家记住位置)。
          • 将这两张卡片状态改回背面(翻转回去)。
          • 播放失败音效。
          • 步数+1(如果记录步数)。
          • 游戏状态变回可操作。
    • 洗牌算法: 如何把卡片数组随机打乱顺序(非常重要!确保每次游戏图案位置不同)。
    • 计时器/步数器: 如何记录和显示时间/步数。
    • 重置游戏: 如何清空状态、重新洗牌、重新开始。

🎨 第4步:制作“零件” (制作资源)

  • 小朋友要做: 画出或找出你喜欢的图案(每种需要两张一样的),画在卡片正面。设计一个漂亮的卡片背面图案(所有卡片背面一样)。
  • 开发:
    • 美术:
      • 设计并绘制/制作所有卡片正面图案(确保每种图案有两个完全相同的图片文件)。
      • 设计并绘制/制作卡片背面图案(一张通用图片)。
      • 设计游戏背景。
      • 设计按钮图片(开始、重新开始)。
      • 设计计时器/步数器的显示框。
      • 设计胜利画面。
    • 声音: 录制或找到合适的音效(翻牌声、配对成功声、配对失败声、胜利音乐)。
    • 字体: 选择显示计时器、步数、剩余对数、胜利信息的字体。

💻 第5步:把零件组装起来 (编程实现)

  • 小朋友要做: 把画好的卡片(正面图案和背面图案)剪下来,贴在硬纸板上做成实体卡片。按照规则在桌子上和家人玩!
  • 开发: 使用游戏引擎(如Scratch, PyGame, Construct, JavaScript/HTML):
    1. 初始化:
    • 创建卡片数组:生成指定数量的图案ID(每种ID两个),存入数组。
    • 洗牌():打乱卡片数组顺序。
    • 根据洗牌后的数组和网格布局,创建卡片对象(初始状态=背面,位置=网格坐标)。
    • 计时器 = 0(或步数 = 0)。
    • 剩余对数 = 总对数。
    • 游戏状态 = 可操作(或等待开始)。
    • 第一张翻开的卡片 = 空。
    • 绘制所有卡片(显示背面图)。
    1. 绘制界面:
    • 根据每个卡片对象的当前状态:
      • 背面:绘制卡片背面图片。
      • 正面:绘制该卡片对应的正面图案图片。
      • 已配对:绘制正面图案图片(可能加个边框或半透明效果表示已完成)。
    • 绘制计时器、步数器、剩余对数。
    • 绘制按钮。
    1. 主循环 & 处理事件:
    • 更新计时器: 如果游戏进行中(状态不是游戏结束且已开始),计时器增加(每帧加一点)。
    • 处理点击“开始/重新开始”按钮: 调用重置游戏()函数。
    • 处理点击卡片:
      • 如果游戏状态不是 可操作 -> 忽略点击。
      • 找到被点击位置对应的卡片对象。
      • 如果该卡片状态不是 背面 -> 忽略点击(不能点已翻开或已配对的)。
      • 翻开这张卡片:
        • 播放翻牌音效。
        • 将该卡片状态改为正面。
        • 重绘这张卡片(显示正面图案)。
      • 判断是第几张:
        • 如果第一张翻开的卡片是空:
          • 这是第一张!把它记录到第一张翻开的卡片。
          • 游戏状态变为等待配对结果。
        • 否则:
          • 这是第二张!
          • 游戏状态变为显示结果中。
          • 启动一个短暂的延迟计时器(比如1.5秒),在这段时间里:
            • 判断第一张翻开的卡片的图案ID 是否等于 当前点击卡片的图案ID?
            • 配对成功:
              • 播放成功音效。
              • 把这两张卡片的状态都改为已配对。
              • 剩余对数减1。
              • 检查胜利: 如果剩余对数 == 0 -> 游戏状态变为游戏结束(胜利),播放胜利音乐,停止计时器,显示胜利画面。
              • 第一张翻开的卡片 = 空。
              • 游戏状态变回可操作(可以立刻翻下一对)。
            • 配对失败:
              • 播放失败音效。
              • 步数+1(如果记录)。
              • 等待延迟计时器结束:
                • 结束后,把第一张翻开的卡片和当前点击卡片的状态都改回背面。
                • 重绘这两张卡片(变回背面)。
                • 第一张翻开的卡片 = 空。
                • 游戏状态变回可操作。
    1. 实现关键函数:
    • 洗牌(数组):使用随机算法(如Fisher-Yates洗牌算法)打乱数组顺序。
    • 重置游戏():重新初始化所有数据(生成新ID、洗牌、重置状态、计时器归零、步数归零)。

🧩 第6步:测试 & 修修补补 (测试 & 修复Bug)

  • 小朋友要做: 使劲玩自己做的纸牌游戏!试试看:
    • 图案配对成功了吗?卡片是不是保持翻开了?
    • 图案不同时,卡片是不是等了一下就翻回去了?
    • 点已经翻开的卡片,还能再点吗?(应该不能)
    • 点已经配对的卡片,还能点吗?(应该不能)
    • 所有对都找到后,是不是显示胜利了?
    • 计时器/步数器走得对吗?
    • 重新开始按钮管用吗?卡片位置洗牌了吗?
  • 开发:
    • 疯狂测试:
      • 测试所有可能的配对情况。
      • 测试点击顺序:快速点、慢速点、点同一张卡两次。
      • 测试边界:点网格角落、边缘的卡。
      • 测试状态切换:在等待配对结果或显示结果中时,点击其他卡片是否被正确阻止?
      • 测试洗牌:每次开局卡片位置确实随机吗?有没有可能出现所有相同的卡挨在一起?(虽然概率小,但随机是正常的)。
      • 测试胜利条件:最后剩一对时,成功配对是否触发胜利?
    • 找Bug修Bug: 比如卡片翻不回去、配对成功但没标记、计时器在胜利后没停、洗牌不随机等。
    • 调整优化:
      • 增加难度: 做更多卡片(6x6)、缩短配对失败的显示时间、加计时挑战(1分钟内完成)。
      • 增加主题: 做多套卡片图案(动物、水果、字母、数字),让玩家可以选择。
      • 增加动画: 让翻牌、配对成功、配对失败有更酷的翻转或缩放动画。
      • 增加音效和音乐。
      • 记录最好成绩(最短时间/最少步数)。

🚀 第7步:完工!和家人朋友一起玩 (发布)

  • 小朋友要做: 邀请家人和朋友来玩你设计的(纸牌或电脑)记忆翻牌游戏!看看谁的记忆力最棒!
  • 开发: 把游戏程序打包成电脑文件、手机APP或网页游戏,分享给大家玩。可以说:“我设计了一个记忆翻牌游戏,快来挑战你的记忆力吧!你能在30秒内完成8对吗?”

🧠 给小朋友的记忆翻牌小技巧

  • 集中注意力! 这是最重要的。
  • 从边缘开始翻: 有时候边缘的卡片更容易记住位置。
  • 记住图案的位置: 即使配对失败了,也要努力记住那两张不同图案卡片的位置,下次看到其中一张,就能想起另一张大概在哪里。
  • 找规律: 有些图案有相似的颜色或形状,注意区分细节。
  • 不要乱点! 每次翻牌前,先想想你上次看到什么图案在哪里。
  • 多练习! 记忆力就像肌肉,越练越强!

记忆翻牌游戏扩展练习

  1. 难度等级​:提供不同尺寸的网格选择,通常为4x4(16张,8对)、4x6(24张,12对)或6x6(36张,18对)
  2. 主题选择​:多种卡片图案主题(动物、水果、数字等)
  3. 音效​:翻牌、匹配、完成等音效
  4. 动画效果​:流畅的翻牌和匹配动画
  5. 提示功能​:有限次数的提示机会
  6. 添加计时器​:记录游戏完成所用的时间
  7. 最佳成绩:保存和显示最佳成绩(翻牌次数、时间)
  8. 添加翻牌计数器:记录一局完成总共翻牌次数

代码

MyWorld 类

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList;
import java.util.Collections;
/**
- 牌桌类,提供游戏的运行场景
*/
public class MyWorld extends World{ArrayList<Card> cards = new ArrayList<Card>();  //声明一个保存扑克牌对象的集合cards//Table类的构造方法public MyWorld () {        super(600, 400, 1);for (int i=1; i<=5; i++) {      //向集合cards中添加两组共10张5点以下的牌cards.add(new Card(i));cards.add(new Card(i));}Collections.shuffle(cards); //集合类Collections的混排算法,用于打乱集合cards中牌的顺序int x=100, y=100;   //牌桌上摆放牌的起点坐标for (int i=0; i<5; i++) {   //用for循环依次在牌桌上摆放每排5张,共两排的扑克牌addObject(cards.get(i) , x, y);addObject(cards.get(i+5) , x, y + cards.get(i).getImage().getHeight() + 20);x += cards.get(i).getImage().getWidth()+20;}}//act()方法是游戏单步执行的动作public void act() {        int count = 0, card1Value=0, card2Value=0;    //count表示牌桌上被翻开的第几张牌Card card1=null, card2=null;for (int i=0; i< cards.size(); i++) {    //用for循环遍历集合cards中的所有牌if (cards.get(i).getFaceup() == true) {    //如果遍历到的这张牌是翻开的count++;        //用count将牌桌上翻开的牌数累加if (count == 1) {            //如果是第一张翻开的牌card1 = cards.get(i);                    card1Value = card1.getValue();    //变量card1Value记录第一张翻开牌的点数}if (count == 2) {            //如果是第二张翻开的牌card2 = cards.get(i);card2Value = card2.getValue();    //变量card2Value记录第二张翻开牌的点数if (card1Value == card2Value) {   // 如果翻开的两张牌的点数是一样的Greenfoot.playSound("WaterDrop.wav");Greenfoot.delay(10);    //延迟10毫秒,游戏效果更好//移除翻开的两张同样的牌removeObject(card1);removeObject(card2);cards.remove(card1);cards.remove(card2);if (cards.size() == 0) {    //配对的牌全部找到,游戏结束showText("Game Over! ",  300, 200);Greenfoot.stop();}}else {    //如果翻开的两张牌不同Greenfoot.delay(15);// 将两张牌面朝下背朝上card1.turnFaceDown();card2.turnFaceDown();}break;    //两张牌如相同,则移除,如不同,则翻回来。剩下的牌不再遍历,结束for循环}}}}
}

Card 类

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
/**
- 扑克牌类,可以被翻开
*/
public class Card extends Actor{private int value = -1;    //初始点数为-1,表示还没有生成确定的扑克牌。一旦生成了一张牌,其点数就不为-1private boolean isFaceUp = false;    //isFaceUp=true,则牌正面朝上,否则背面朝上private GreenfootImage faceUpImage = null;//faceUpImage表示牌的正面图案文件private GreenfootImage faceDownImage = null;//faceDownImage表示牌的背面面图案文件//Card类的构造方法public Card(int cardValue) {//cardValue是构造一张Card对象时传入的牌的点数value = cardValue;isFaceUp = false;    //所有被构造的牌都是背面朝上的String fileName = "hearts" + value + ".png";  //根据牌点数匹配的正面图案文件名//生成牌的正面图像对象faceUpImage = new GreenfootImage(fileName.toLowerCase());faceDownImage = new GreenfootImage("blueflip.png");    //生成牌的背面图案对象setImage(faceDownImage);    //让牌背面朝上放在牌桌上}//act()方法是游戏单步执行的动作public void act() {// 如果鼠标点击了这张牌if (Greenfoot.mouseClicked(this) ){// 如果牌面朝下,就翻牌。if (!isFaceUp) {                setImage(faceUpImage);isFaceUp = true;}}}//获取这张牌的点数public int getValue(){return value;}//获取这张牌是否已翻面public boolean getFaceup(){return isFaceUp;}//将牌翻成背部朝上public void turnFaceDown(){isFaceUp = false;setImage(faceDownImage);}}

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

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

相关文章

【lucene】SegmentInfos

SegmentInfos 类中文说明 ———————————— **一句话** SegmentInfos 是 segments_N 文件的**内存表示**。它把磁盘上的 segments_N 读进来&#xff0c;变成一堆 SegmentInfo 的集合&#xff1b;当你增删改索引、合并段、提交时&#xff0c;再把它写回磁盘&#x…

Read Frog:一款开源AI浏览器语言学习扩展

Read Frog&#xff1a;一款开源AI浏览器语言学习扩展 来源&#xff1a;Poixe AI Read Frog&#xff08;中文名&#xff1a;陪读蛙&#xff09;是一款开源的浏览器扩展&#xff0c;旨在通过人工智能技术&#xff0c;将常规网页浏览转化为一种沉浸式的语言学习体验。该工具通过…

天地图应用篇:增加全屏、图层选择功能

天地图应用篇&#xff1a;增加全屏、图层选择功能本节说明&#xff1a; 目的&#xff1a; 实现地图的图层切换全屏显示 / 退出全屏案例截图 示下&#xff1a;案例代码示例代码&#xff1a; <template><div class"tianditu-map-container"><!-- 顶部搜…

从零开始,系统学习AI与机器学习:一份真诚的学习路线图

人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;正在深刻改变众多行业的面貌&#xff0c;掌握这些技术已成为许多技术从业者提升竞争力的重要路径。无论你是希望进入这个充满潜力的领域&#xff0c;还是期望在现有技术基础上进行拓展&#xff0c;一份…

NVIDIA CWE 2025 上海直击:从 GPU 集群到 NeMo 2.0,企业 AI 智能化的加速引擎

前言 8 月 8 日&#xff0c;我受邀参加了在上海举办的 NVIDIA CWE 大会。作为一个正在企业内部推动 AI 落地的从业者&#xff0c;这场会议对我来说不仅是“充电”&#xff0c;更像是一场“解题会”。参会感受 在分享干货之前&#xff0c;我先谈谈这次参会的不同感受。给我感受特…

Web攻防-大模型应用LLM安全提示词注入不安全输出代码注入直接间接数据投毒

知识点&#xff1a; 1、WEB攻防-LLM安全-API接口安全&代码注入 2、WEB攻防-LLM安全-提示词注入&不安全输出 Web LLM&#xff08;Large Language Model&#xff09;攻击指针对部署在Web端的AI大语言模型的攻击行为。攻击者通过恶意提示词注入、训练数据窃取、模型逆向工…

docker compose再阿里云上无法使用的问题

最原始的Dokcerfile # 使用官方Python 3.6.8镜像 FROM python:3.6.8-slimWORKDIR /app# 复制依赖文件 COPY requirements.txt .RUN pip install --upgrade pip # 检查并安装依赖&#xff08;自动处理未安装的包&#xff09; RUN pip install --no-cache-dir -r requirements.tx…

C++STL容器List的模拟实现

一、引言list的实现&#xff0c;还是比较简单的&#xff0c;大家只要想着土家楼的形状&#xff0c;画出图来就好了&#xff0c;不需要过多担心。本次的博客会发出一个完整的实现List的List.hpp&#xff0c;以后也会这样&#xff0c;主要是分段发被说孩子分段生。二、模拟List由…

区块链 + 域名Web3时代域名投资的新风口(上)

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

电子电气架构 --- 软件会给汽车带来哪些变化?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

在rtthread中,互斥量不能在中断服务例程中使用?以及线程多次持有互斥量的情况怎么理解?

互斥锁的所有权&#xff1a;互斥量的状态只有两种&#xff0c;开锁或闭锁&#xff08;两种状态值&#xff09;。当有线程持有它时&#xff0c;互斥量处于闭锁状态&#xff0c;由这个线程获得它的所有权。相反&#xff0c;当这个线程释放它时&#xff0c;将对互斥量进行开锁&…

力扣32:最长有效括号

力扣32:最长有效括号题目思路代码题目 给你一个只包含 ‘(’ 和 ‘)’ 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号 子串 的长度。 左右括号匹配&#xff0c;即每个左括号都有对应的右括号将其闭合的字符串是格式正确的&#xff0c;比如 “…

机器学习实例应用

K最近邻算法K近邻算法(KNN,k-Nearest Neighbor),每个样本都可以用它的最接近的K个邻近值来代表。算法说明&#xff1a;①输入没有标签的新数据&#xff0c;将新数据的每个特征与样本集中数据对应的特征进行比较&#xff0c;然后算法提取样本集中特征最相似数据&#xff08;最近…

力扣 hot100 Day77

连做了几个动态规划的中等题&#xff0c;还是比较有套路的&#xff0c;这里只简要分析一下最长递增子序列&#xff0c;设定dp[i]为以nums[i]结尾的最长子序列&#xff0c;递推公式就好推了乘积最大子数组&#xff0c;和上面类似&#xff0c;但考虑到负负得正&#xff0c;所以需…

深入解析RabbitMQ与AMQP-CPP:从原理到实战应用

一、RabbitMQ安装 1.安装 RabbitMQ sudo apt install rabbitmq-serverRabbitMQ 的简单使用 # 启动服务 sudo systemctl start rabbitmq-server.service # 查看服务状态 sudo systemctl status rabbitmq-server.service # 安装完成的时候默认有个用户 guest &#xff0c;但是权限…

(论文速读)ViDAR:视觉自动驾驶预训练框架

论文题目&#xff1a;Visual Point Cloud Forecasting enables Scalable Autonomous Driving&#xff08;视觉点云预测实现可扩展的自动驾驶&#xff09; 会议&#xff1a;CVPR2024 摘要&#xff1a;与对通用视觉的广泛研究相比&#xff0c;可扩展视觉自动驾驶的预训练很少被探…

《Unity Shader入门精要》学习笔记二

1、基础光照&#xff08;1&#xff09;看世界的光模拟真实的光照环境来生成一张图像&#xff0c;需要考虑3种物理现象。光线从光源中被发射出来。光线和场景中的一些物体相交&#xff1a;一些光线被物体吸收了&#xff0c;而另一些光线被散射到其他方向摄像机吸收了一些光&…

Windchill 11.0使用枚举类型自定义实用程序实现生命周期状态管理

一、Enumerated Type Customization Utility 枚举类型自定义实用程序,可用于添加或编辑枚举类型的值,在Windchill 12.0+中可直接在类型和属性管理中编辑,如下图所示,而在Windchill 11.0中只能通过windchill shell启动程序,下面将详细介绍Windchill 11.0中启动并使用枚举类…

UGUI源码剖析(10):总结——基于源码分析的UGUI设计原则与性能优化策略

UGUI源码剖析&#xff08;第十章&#xff09;&#xff1a;总结——基于源码分析的UGUI设计原则与性能优化策略 本系列文章对UGUI的核心组件与系统进行了深入的源代码级分析。本章旨在对前述内容进行系统性总结&#xff0c;提炼出UGUI框架最核心的设计原则&#xff0c;并基于这些…

STM32N6引入NPU,为边缘AI插上“隐形的翅膀”

2025年的春天格外特别。伴随着人形机器人、DeepSeek的强势刷屏&#xff0c;AI成了最有前景的赛道。万物皆可AI&#xff0c;万物也在寻觅用上AI或者让AI“转正”的“aha moment”。 帮助机器更好地“思考”&#xff0c;让更多的AI走向边缘&#xff0c;是AI发展的重要趋势之一。…