基于 QT(C++) 开发的贪吃蛇小游戏

贪吃蛇小游戏

一、实验内容

本次实验的主要内容为使用 C++ 编程语言,使用类的相关知识,构建出一个贪吃蛇小游戏,该小游戏应当具备有三种基础功能,并可根据 OJ 的提示,添加更多的加分项。

二、设计思路与功能描述

2.1 设计思路说明

2.1.1 贪吃蛇游戏设计思路说明

由于本次实验希望采用面向对象的思想来进行程序的编写,而贪吃蛇游戏本身作为程序的出题,故应当先绘制出该程序的类图,再在该类图的基础上进行进一步程序的编写。

由于不同玩法的贪吃蛇之间略有不同,故在此我们首先对“入门版”的贪吃蛇类图进行说明。

在本程序中,一场贪吃蛇游戏的进行应当是基于 Game 的某一子类展开的,在“入门版”中,这个子类为 Game1。

通过生成一个 Game1 实体,依次调用该实体的 init_game()方法和 init2()方法,可以在画布上画出初始的地图,并生成一个 snake 实体,同时藉由 refresh()方式生成一批 fruit 实体。

在初始化结束后,游戏可以正式开始,在游戏进行的过程中,通过 listen()方法对键盘进行实时监听,一旦用户执行了某个操作,就将操作值进行记录,在下一次调用 play()方法时,判断该值对下一步结果的影响,最后调用 draw()方法在画布上更新界面。

而当 play()方法发现下一步蛇会死亡时,会弹出“游戏结束”字体,最后调用 back()方法,回到初始菜单。

基于上述类图与大体流程描述,一下对各个类进行逐一详细描述:

①Game 类

该类是所有游戏类的父类,其主要功能是为各个子类提供一个统一的初始与结束模板,使得各个游戏类的调用、结束显得较为统一。

该类中的属性有:

1) width

int 类型,默认值为 800。该属性是新建画布时,所建立的画布宽度,在本次程序设计中,这一初始值没有进行过改变。

2)length

int 类型,默认值为 600。该属性与 width 类似,是初始新建立画布的高度,在本次程序设计中,也未进行过改变。

该类中的方法有:

1)init_game()

void 返回类型。该方法是在初始化地图前必须进行的调用,作用是生成指定规格的画布。

2)back()

void 返回类型。该方法是在游戏结束(包括按 Q 键退出、游戏失败录入姓名后退出等)后,生成了一个 Menu 类实体,重新回到主页面。

3)init2()、listen()

Game 类作为一个大的父类,还额外定义了 init2()和 listen()这两个虚函数,用于在编写子类时记得实现这两个重要的方法。

②Game1 类

该类是 Game 类的子类,也是其他 Game 类用以修改功能的基础,如何利用一个 Game1 类实体进行一场游戏已在前文叙述得较为清晰,故不在此赘述,这里将重点对 Game1 类中的众多属性和方法进行详细说明。

该类中的属性有:

1)map

char 型二维数组,规格为[40][30]。这一大小对应了整个贪吃蛇游戏界面的 40×30 的规格,这一属性也是 Game1 类中众多方法实现的基础。map 数组中存放的字符是游戏界面中,对应位置方格.jpg 图片文件名的第二个字符。例如'0'表示这里是空草坪,'7'表示这里是食物等,该数组中可存放的字符会随着后续功能的拓展而发生变化。

2)mes

char 型字符,默认值为'u'。mes 用于记录用户上一次对贪吃蛇发出的控制指令,其中'u'表示向上,'d'表示向下,'l'表示向左,'r'表示向右。

3)head

snake 型指针。由于贪吃蛇在本游戏中是以链表的形式存放的,即将每一个蛇段看作一个实体,所以为了能够对蛇进行控制,就需要掌握链表的表头——即蛇头的相关信息。

4)area

int 类型,初始值为 28×38。该值用于记录当前地图上还能放置水果的位置总数,以便随机生成新水果,并在后续功能中辅助判定地图是否已满。

5)length

int 类型,初始值为 3。该值用于记录当前蛇的长度,以便在 UI 界面进行显示。

6)life

int 类型,初始值为 1。该值用于记录蛇的生命数并在 UI 上显示,在 Game1 的游戏中这个值没有意义,但在后续加入的其他功能中,该值可以记录蛇的最多死亡次数。同时,当 life 变为 0 时,默认是游戏结束的标志,在这种情况下,play()方法将被禁用。

7)score

int 类型,初始值为 0。该值用于记录当前的得分并在 UI 上显示,同时该值也会在排行榜记录时被录入文件。

8)highscore

int 类型。该值在 init2()方法下的 getrecord()方法中被赋值,用于记录当前所完游戏种类在排行榜中的最高分,当 score 高于 highscore 时,highscore 在么一个游戏刻被刷新为 score 值。

该类中的方法有:

1)refresh()

void 返回类型。该方法在初始化地图与 fruit_num 为 0 时被调用,该方法可以在当前为空草坪(即 map 值为'0')的位置随机生成 1~5 个 fruit 实体,并同时刷新 fruit_num 值与 area 值。

2)draw()

void 返回类型。该方法在每一次操作执行结束后进行调用,该方法会逐一遍历 map 数组,使用 easyX 自带的图形辅助函数将每一个数组元素所代表的图片样式绘制在画布的指定位置。

3)getrecord()

void 返回类型。该方法在地图初始化时会被调用。该方法会通过遍历的方式逐行从 record.txt 中读取游戏记录,在游戏版本编号和当前游戏一致的记录中找寻得分最高的成绩赋值给 highscore 属性。

4)init2()

void 返回类型。该方法是重写了父类 Game 的方法所得,会在新建好画布之后进行调用。该方法会对 map 属性进行赋值,将整个地图的边界都赋值为“硬墙”(map 编号为'8'),同时调用 refresh()方法,生成一批食物,并将食物所在位置赋值为“食物”(map 编号为'7')。

同时该方法还会新建一个 snake 实体,其长度为 3,蛇头在[20][14]位置,蛇尾在[20][16]位置,并在 map 中对对应位置赋值。在完成了对 map 的初始化赋值后,调用 draw()方法,绘制初始界面。

5)play()

bool 返回类型。该方法用于处理在下一个游戏刻时游戏发生变化的逻辑,其过程是先通过 snake 类的 next_pos()方法,获取到下一个游戏刻蛇头的位置,然后对该位置进行判定。

如果该位置是蛇尾以外的蛇身、硬墙,则游戏结束,弹出提示语,同时将 life 归零,禁用 play()方法,恒返回 false;若该位置是果实,则调用该 snake 的 eat()方法,同时让 length 属性自增 1,返回 true;若该位置是空草坪,则 调用 snake 的 move()方法,返回 true;

返回值适用于标识游戏是否能够进行下去的判断依据。

6)record()

void 返回类型。该方法用于在游戏结束或用户自行退出时调用,弹出提示语要求用户输入姓名,同时对用户输入的内容进行实时显示。当用户输入完毕后,在 record.txt 的末尾追加本次游戏的版本编号、用户名、成绩。

7)drawui()

void 返回类型。该方法用于在每一次 draw 方法调用后,紧接着调用该方法绘制页面下部的所有 UI 提示交互。其实现逻辑是使用 int2char 函数,将蛇的长度、生命数、分数等存储为 int 类型的信息与提示语一并合成为一个 char 数组。然后再在指定的位置输出这些提示字符串。

8)listen()

void 返回类型。该方式重写了父类 Game 的 listen 方法。该方法可以实时对键盘内容进行实时监听,当有按键按下时,采用_getch()函数获取按键值,并根据按键值对 mes 属性赋值。

当没有按键按下时,则按照系统的内部时钟,每隔一秒调用一次 play()方法与 draw()方法,重新绘制一遍界面。值得一提的是,当游戏结束后,play()被禁止,则同时停止调用 draw()方法,只调用 record 方法,用于记录用户姓名。

③snake 类

由于在本程序中采用链表的方式来存储贪吃蛇中的蛇,所以这里的 snake 类的实体其实是每一个蛇段,每个蛇段之间采用指针的方式前后相连,形成一条完整的蛇。以下,对 sanke 类中的属性和方法进行详细说明。

该类中的属性有:

1)add

pos 类型。add 用于存储当前蛇段在地图中的横纵坐标,便于后续绘制、判断等操作。

2)next

snake*类型,默认值为 NULL。next 即蛇链表的后继指针,用于指向当前蛇段的下一个蛇段。蛇尾的 next 值为 NULL。

3)head

bool 类型,默认值为 false。head 属性用作一个标志位,用于表示当前这个蛇段是否是蛇头,如果是蛇头,则为 true;其余均为 false。

4)tow

char 类型,默认值为'u'。tow 用于记录该蛇段蛇头方向的指向,该值与其后继蛇段的 tow 值可以一同决定当前蛇段的形状、扭曲方向。

5)length

int 类型,默认值为 0。该值用于记录当前蛇的长度。值得一提的是,只有蛇头的该属性才是正确的,蛇段的 length 属性值无意义。

该类中的方法有:

1)cut(snake *p, int n)

snake返回类型。该方法用于将从p 所指向的蛇段开始,向后数连续 n 个蛇段进行删去,主要用于配合“高级版”的游戏实现。该方法是基于递归实现的,当 n 不为 0 时,则删除当前节点,并递归 cut(p->next,n-1)。同时,为了便于操作,该方法还将返回删减后的头结点,用于替换原有的 snake。

2)eat(char tow)

snake返回类型。该方法用于在判定到下一个游戏刻蛇头到达食物时调用,其方法是在 tow 方向上新建一个 snake 实体,并将该实体与原来的头部相连接,取而代之为新的头部,并将该头部返回为新的head。

3)move(char tow)

snake*返回类型。该方法用于在判定到下一个游戏刻蛇头到达位置为草坪时调用。其流程为先删去蛇尾,并将倒数第二个蛇段的 next 置空,之后再调用 eat 方法,在 tow 方向上生成一个新的蛇头并返回该蛇头。

4)next_pos(char tow)

pos 返回类型。该方法返回如果沿 tow 方向走,蛇头在下一个游戏刻将要到达的位置,并返回该位置。该方法用于在 play 方法中辅助进行碰撞的判定。

5)tail_pos()

pos 返回类型。该方法将返回当前蛇的蛇尾坐标。

6)judge(snake* s,pos p)

bool 返回类型。该方法用于判定位置 p 是否在是蛇身上的某点,其实现采用了递归的方式来实现,遍历了蛇身上的每一个蛇段,依次判断该点是否在蛇的身上。

7)draw(char a[][])

void 返回类型。该方法用于在 a(即 Game 子类中的 map 属性)中在对应位置赋值上对应蛇段的形状标号。例如下拐左、右拐上等扭曲状态,便于 Game 子类在后续操作中便于画图。同时,为了满足后续 idea 实现过程中的需求,本程序在编写时还对 draw 方法根据 a 的规格进行了重载。

④fruit 类

fruit 类即在游戏过程中不断出现的食物抽象而成的类,这个类的方法与属性都较少,这与食物本身性质不多有很大的关系。其属性与方法的详细介绍如下:

该类中的属性有:

1)add

pos 类型。add 用于该食物在地图中的横纵坐标,便于后续绘制使用。

2)style

char 类型,默认为'g'。style 用于记录当前食物的性质,当为'g'时说明该食物是正常水果;当为'b'时说明该食物是恶魔果。

该类中的方法仅有:

draw(char a[][])

void 返回类型。该方法用于在 a(即 Game 子类中的 map 属性)中在对应的位置根据该 fruit 实体的 style 赋上不同的值,以便在后期绘制过程中能够展示出该食物。

2.1.2 其他 Game 子类思路简要说明

①Game2

Game2 实现的是 OJ 提到的“进阶版”内容,该内容要求实现蛇死去后身体变成边界,再生成一条新的蛇,直至地图被撑满。

该过程的实现主要在于修改判定到蛇死去的逻辑,加写一个 stone()方法,在蛇死去后将其身体所在的所有位置赋值为“硬墙”。

②Game3

Game3 实现的是“高级版”内容,该内容要求蛇死后,其身体变成实物,同时再生成一批新食物,直到死亡次数大于 5。

该过程的实现与 Game2 的实现相仿,加写一个 juice()方法,在蛇死后将其身体全部赋值为“食物”。同时还需要对死亡后的逻辑加以修改,使得蛇死后让其 life 值自减,life 自减为 0 时游戏结束。

③Game4

Game4 实现的是 idea1 的要求,即额外加入了“软墙”的概念。当蛇碰到软墙后,长度减 2;碰到“硬墙”后,长度减半。

该过程的实现首先要对 init()方法进行修改,在地图上加入软墙元素;其次就是要额外加入软墙的素材包,同时要修改碰撞判定之后的逻辑,即不再是碰到墙就游戏结束,而是要到蛇的长度小于一定值才结束。

④Game5

Game5 实现的是 idea2 的要求,即额外加入“加速区”和“减速区”。

该过程的实现首先是 init()方法的重写与素材包的更新,同时要对 listen()方法进行修改,当蛇头在加速区时,将每隔 1 秒刷新一次更改为每隔 0.5 秒刷新一次;而当蛇头在减速区时,更改为每隔 2 秒刷新一次。

⑤Game6

Game6 实现的是 idea3 的要求,即额外引入“体能槽”的概念,每次蛇的运动都会消耗体能,当体能清零时游戏结束。

该过程的实现首先要修改 life 属性的含义,将 life 属性视作体能,初始时为 100,每次 move()都会消耗体能;同时还要修改 drawui()方法,将原来的字符串更改为能量条的形式;最后还要修改碰撞判定的逻辑,当 life 小于等于 0 时游戏结束。

⑥Game7

Game7 实现的是 idea4 的要求,即额外引入“恶魔果”的概念,当蛇碰到恶魔果时直接死亡,游戏结束。

该过程的实现首先是要修改 refresh()方法,在每次生成好果子的同时生成恶魔果,其次是要更新恶魔果的素材;同时要更改碰撞的判定逻辑,当碰到恶魔果时,游戏直接结束。

⑦Game8

Game8 实现的是 idea6 的内容,即扩大地图的边界,每次只绘制蛇头在正中心的部分。(前提是不能绘制到边界以外的内容)

该过程的实现主要是要重新修改 map[][]的属性,同时对 snake 类、fruit 类中的相关函数进行重载,使之可以接受更大规格的 map 值传入。同时还要对 draw()方法进行修改,确保能够满足题目的要求。

⑧Game9

Game9 实现的是 AI 对战的内容,即添加了另一条蛇,由 AI 操控,当有一条蛇死亡时,另一方获胜。

该过程的实现是新添加了 snake2 类与 ai 类,其中 sanke2 类的定义与 sanke 类的定义相仿,只是对蛇段材质的内容进行了更新与修改;而 ai 类的实现将在后续进行详细说明。同时,还对 listen()方法进行了修改,加写了 aplay()等方法,加设了 ames 等属性。使得该 Game 类能够适应 AI 对战的相应需求。

⑨Game10

Game10 实现的是双人对战的内容,即可以实现对两条蛇的同时控制,当一条蛇死亡后,另一条蛇获胜。

该过程的实现主要是基于 Game9,将其中的 ai 对象删除后,修改 listen()方法使之能够同时监听两种键盘,实现对 mes 和 ames 属性的同时监控,从而实现同时控制的效果。

2.1.3 菜单设计思路说明

在本次程序设计中,菜单的设计也是基于面向对象的思想进行编写的,其类图为:

通过该类图不难看出其逻辑。在程序开始运行时,首先实例化一个 Menu 对象,该对象中包含 12 个 Btn 对象,这些 Btn 对象均会在被鼠标点击时生成对应的 Game 子类对象,由此可开始游戏。

由于 Menu 与 Btn 类的实现较为简单,且没有特别的亮点,故不在此赘述其具体属性与方法。

2.1.4 AI 设计

在我初次拿到本次题目时,我首先想到的是从头部开始,对所有“草坪”单元格采用广度优先(BFS)的遍历算法,找到距离其最近的果实,而该路径的第一步就是 AI 此时会采取的策略。

在程序中 3293~3367 行注释掉的代码即为 AI 采用 BFS 的算法。但使用该 AI 时,我发现其一定不会作出错误的决定,导致玩家很难战胜这个 AI。所以我将 AI 的策略“傻瓜化”,使得玩家可以获得一定的游戏体验。

其策略为,首先判断当前方向是否有食物,如果有则继续前进,没有则搜索左右两侧是否有食物,如果有则立刻拐弯。

而当三个方向都没有食物时,会随机在地图内部生成一个“标记点”,然后让贪吃蛇作出尽可能向“标记点”的决策。

基于这样的 AI 设计,玩家可以看到 AI 作出很傻的决定,也能在一定程度下战胜 AI,获得游戏快感。

2.2 游戏功能描述

2.2.1 菜单功能展示

该游戏的菜单界面由 12 个按钮与对应的提示语组成,鼠标点击对应的按钮即可进入相应的游戏:

2.2.2 入门游戏展示

在入门游戏中,玩家通过控制 WASD 四个键即可控制蛇的移动,按下 Q 键退出游戏,下方的字符串作为 UI 提示:

当按下 Q 键时,结束游戏,并弹出姓名输入框:

碰壁或是失败后,弹出“游戏结束”提示语,同时弹出姓名输入框。

2.2.3 进阶版游戏展示

贪吃蛇死后,其尸体变为边界:

2.2.4 高级版游戏展示

贪吃蛇死后,尸体变成食物:

2.2.5 得分榜展示

2.2.6 idea1 展示

2.2.7 idea2 展示

其中黄色块为加速区域,蓝色快为减速区域。

2.2.8 idea3 展示

2.2.9 idea4 展示

2.2.10 idea6 展示

2.2.11 人机模式展示

2.2.12 双人模式展示

其中绿色蛇由 WASD 控制方向,紫色蛇由 IJKL 控制方向:

三、项目亮点与情况说明

3.1 项目亮点

① 本次大作业的所有素材均为本人在 PS 中制作绘制而得,自认为很好地通过方块的拼合实现了贪吃蛇的蠕动效果。

② 自认为本次大作业的完成度较高,完成了除多人对战、RPG 模式、地图存储之外的所有功能。

③ 本次大作业实现了两种 AI 逻辑的编写。

3.2 诸多情况说明

① 未对多人模式、RPG 模式、地图存储的功能进行实现。

其中 RPG 模式与地图存储未能实现的原因在于,我个人认为这两个功能的难度不大,但需要耗费的精力会比较多,所以放弃了这两个模块的编写实现。

而对于多人模式,主要是由于我之前错误估计了本次大作业所要花费的时间,浪费了大量时间在绘制.jpg 图片上,导致后来留给研究多人模式的时间不足。

② 采用了较为愚蠢的 AI 来实现。

正如前文所述,我发现采用 BFS 遍历搜索算法的 AI 所采取的的策略总是正确的,导致用户很难战胜电脑,而且测试时间也过长。所以我处于游戏性的考虑,最终选择了这个较为愚蠢的 AI,采用 BFS 的 AI 逻辑我用代码进行了注释,TA 可以取消注释,并对程序进行一定的修改来进行验证。

四、遇到的问题与解决方法

4.1 遇到的问题

在进行初级模式程序编写的过程中,我发现蛇总会在自己的身后留下一串尾巴,如下图所示:

4.2 解决方法

这里问题出错的原因其实很容易查明——就是当我们在调用 snake 类的 move()方法时,会删除掉蛇尾,但是这里的删除仅仅是在蛇链表中进行了删除,而未在 map 中修改该元素的信息,导致 map 中依然存储着这个尾巴的信息。

我在一开始,我的思路总是局限在要在 snake 类内部解决该问题,但是 snake 的 draw()方法只能在 map 中绘制其占据的单元格,而不能更改其他位置的信息。于是我又试图重写了一个新的方法,专门用来去除该元素的信息。

但如此做之后,整个程序会显得十分冗余,甚至要为了这一个元素将整个 map 数组传递给 snake 的新方法。

后来,我意识到,我其实可以在 Game 类的 play()方法中很轻易地解决这个问题,只要在移动钱获得尾巴的位置,再在移动后将尾巴的位置变成草坪即可,而不用再新建一个方法:

经过这一改写后,可以得到蛇的尾巴可以正常抹去:

♻️ 资源

大小:2.99MB

➡️资源下载:https://download.csdn.net/download/s1t16/87404311

注:更多内容可关注微信公众号【神仙别闹】,如当前文章或代码侵犯了您的权益,请私信作者删除!

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

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

相关文章

【毕业设计】SpringBoot+Vue+MySQL + 疫情隔离管理系统平台源码+数据库+论文+部署文档

摘要 近年来,全球范围内突发公共卫生事件频发,尤其是新冠疫情的暴发对各国公共卫生管理体系提出了严峻挑战。传统的疫情隔离管理方式依赖人工操作,效率低下且容易出现信息滞后或错误,难以满足现代疫情防控的需求。信息化、智能化…

Java SpringBoot+Vue3+MyBatis 疫苗发布和接种预约系统系统源码|前后端分离+MySQL数据库

摘要 疫苗发布和接种预约系统旨在解决当前疫苗接种管理中存在的效率低下、信息不透明和预约流程繁琐等问题。随着全球公共卫生事件的频发,疫苗接种成为防控传染病的重要手段,但传统的线下预约方式难以应对大规模接种需求,容易导致资源分配不…

用Qwen-Image-2512-ComfyUI做图像编辑,效果惊艳的实战分享

用Qwen-Image-2512-ComfyUI做图像编辑,效果惊艳的实战分享 你有没有遇到过这样的场景:一张精心设计的宣传图,因为加了水印或临时标注,没法直接发给客户;或者电商详情页里某处文字写错了,重做整张图太费时间…

手机拍照人像也能用BSHM完美抠出

手机拍照人像也能用BSHM完美抠出 你有没有遇到过这样的情况:刚用手机拍了一张阳光正好的人像照,想发朋友圈却卡在了换背景这一步?打开修图软件,手动抠图半小时,边缘还是毛毛躁躁;试了几个AI工具&#xff0…

Altium Designer安装教程:防错机制与安全设置深度解析

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文严格遵循您的所有要求: ✅ 彻底去除AI痕迹,语言自然、有经验感、带工程师口吻 ✅ 摒弃“引言/概述/总结”等模板化标题,以逻辑流驱动叙述节奏 ✅ 所有技术点均…

高速PCB串扰抑制技术:交换机设备中的实战解析

以下是对您提供的技术博文《高速PCB串扰抑制技术:交换机设备中的实战解析》的深度润色与专业重构版本。本次优化严格遵循您的全部要求:✅ 彻底去除AI痕迹,语言自然、老练、有工程师现场感;✅ 所有模块有机融合,摒弃“引…

小白也能懂的图层黑科技:Qwen-Image-Layered保姆级教程

小白也能懂的图层黑科技:Qwen-Image-Layered保姆级教程 你有没有试过这样:一张精心生成的AI图片,想把背景换成海边,结果人物边缘发虚;想给衣服换个颜色,整张图却像被水泡过一样失真;想放大做海…

Altium Designer 23输出Gerber操作指南

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI痕迹、模板化表达和空洞套话,以一位 十年PCB工程老兵量产交付负责人 的口吻重写,语言更自然、逻辑更紧凑、细节更扎实,同时严格遵循您提出的全部优…

UNet人脸融合镜像体验:操作简单效果惊艳

UNet人脸融合镜像体验:操作简单效果惊艳 1. 为什么这款人脸融合工具让人眼前一亮 你有没有试过想把朋友的脸换到自己的旅行照里,或者把偶像的五官融合进一张艺术海报中?过去这类操作需要专业修图软件、数小时精调,甚至还得懂图层…

移动端适配进展如何?unet响应式界面改造案例

移动端适配进展如何?unet响应式界面改造案例 1. 项目背景:从桌面到指尖的卡通化体验升级 你有没有试过在手机上打开一个AI工具,结果发现按钮小得点不准、图片上传区域根本找不到、参数滑块拖不动,最后只能切回电脑继续操作&…

AI抠图还能这么玩?CV-UNet镜像快捷操作技巧曝光

AI抠图还能这么玩?CV-UNet镜像快捷操作技巧曝光 1. 这不是普通抠图——它让透明边缘“自己长出来” 你有没有试过用传统工具抠一张带发丝、半透明纱巾或玻璃反光的人像?花半小时调边缘,结果还是白边、毛刺、糊成一片。而CV-UNet镜像打开网页…

个人IP打造:自媒体博主形象统一设计方案

个人IP打造:自媒体博主形象统一设计方案 在自媒体时代,一个辨识度高、风格统一的视觉形象,往往比内容本身更快被记住。你有没有发现,那些粉丝量百万的博主,无论出现在小红书、抖音还是公众号,头像、封面、…

Z-Image-Turbo异构硬件适配:国产GPU部署可行性验证案例

Z-Image-Turbo异构硬件适配:国产GPU部署可行性验证案例 1. 为什么需要关注国产GPU上的图像生成模型部署 最近不少团队开始尝试把高性能图像生成模型搬到国产AI加速卡上运行,Z-Image-Turbo就是其中值得关注的一个。它不像一些大而全的文生图模型那样吃资…

识别结果能复制吗?手把手教你导出Paraformer文本

识别结果能复制吗?手把手教你导出Paraformer文本 你刚用Speech Seaco Paraformer ASR模型识别完一段会议录音,屏幕上跳出一行清晰的中文:“今天我们重点讨论大模型在客服场景的落地路径……”——可下一秒你就愣住了:这行字怎么保…

Qwen3-0.6B代码解释器功能实测,日志分析利器

Qwen3-0.6B代码解释器功能实测,日志分析利器 你是否遇到过这样的场景:服务器突然告警,几十万行Nginx访问日志里混着5条499错误,运维同学正对着grep -v "200" access.log | head -20反复敲命令;又或者开发调…

2026最新变送器推荐!工业测量仪表权威榜单发布,技术服务双优助力精准测控 全国变送器/压力变送器/差压变送器服务公司推荐

引言 当前工业4.0与智能制造加速推进,过程测量仪表作为工业生产的“神经末梢”,其精度、稳定性与智能化水平直接影响生产效率与能源优化。据中国仪器仪表行业协会最新数据显示,国内工业变送器市场规模年增长率达12.…

实测fft npainting lama对复杂背景的修复能力

实测FFT NPainting LaMa对复杂背景的修复能力 在图像编辑领域,移除图片中的干扰元素——无论是水印、路人、电线还是多余物体——始终是高频需求。但真正考验算法实力的,从来不是干净背景下的简单擦除,而是复杂纹理、多层结构、高对比边缘与…

YOLOv13多尺度检测能力实测,小物体不丢失

YOLOv13多尺度检测能力实测,小物体不丢失 在工业质检产线识别0.5厘米的电路焊点、无人机巡检中捕捉百米外的电力绝缘子缺陷、智能交通系统实时定位密集车流中的远距离行人——这些场景共同指向一个长期困扰目标检测落地的核心难题:小目标极易漏检&#…

2026最新传感器推荐!工业级传感器权威榜单发布,精准测控赋能高效生产 压力传感器/流量传感器/物位传感器品牌推荐

引言 工业4.0时代,传感器作为智能制造的"神经末梢",其测量精度与可靠性直接决定工业生产效率与低碳转型进程。据国际自动化协会(ISA)最新行业报告显示,全球工业传感器市场年复合增长率达12.3%,但在高温…

想做声纹比对?试试这个开箱即用的CAM++镜像

想做声纹比对?试试这个开箱即用的CAM镜像 声纹识别这件事,听起来很“黑科技”,但其实离我们并不远——银行APP的人脸声纹双重验证、智能门锁的语音唤醒、企业内部的语音考勤系统……背后都藏着说话人识别技术。不过,真正想自己动…