当前位置: 首页 > article >正文

制作一款打飞机游戏47:跳转

编辑器的问题

我们开始为不同的敌人编写一些行为,到目前为止进展顺利,一切都很棒。但上次我们遇到了一些问题,我们发现在这个编辑器中编写代码有时有点困难,因为当你想要在某行之间插入内容时,你不得不删除一切然后重新构建。

我在想,如果我们能在每行的末尾添加一个加号按钮会怎么样呢?就像Excel编辑器中的列表视图那样,每行都有一个加号按钮,点击它就可以在下面添加一行。我觉得这主意不错,当然,如果你们有更好的解决方案,欢迎告诉我。


实现加号按钮

好的,现在我们在每行的末尾都添加了一个加号按钮。这样,当我们按下这个按钮时,就可以在下面添加一行了。不过,目前这个加号总是显示在所有行的末尾,而不仅仅是当前选中的行。我想我们可以通过一些智能检测来实现,只有当光标在当前行时,才显示该行的加号按钮。

经过一番尝试,我成功实现了这个功能。现在,只有当光标停留在某行时,该行的末尾才会显示加号按钮,这样我们就可以方便地在那里插入新行了。


调整敌人移动逻辑

接下来,我们要解决敌人移动速度和位置控制的问题。目前,敌人的移动速度和它们在屏幕上到达的位置是相关联的,因为我们有一个weight语句来控制这些。但这样很不方便,因为每次我们想要调整敌人的移动速度时,还得同时调整weight值。

我想到了一个更好的办法,那就是不再等待一定数量的帧,而是等待敌人移动了一定数量的像素后再继续执行代码。这样,我们就可以只调整速度值,而不用担心位置会发生变化了。

经过一番修改和测试,我成功实现了这个功能。现在,无论我们如何调整敌人的移动速度,它们都会在屏幕上到达相同的位置。


引入“跳转”命令

最后,我想引入一个非常强大的新命令——“跳转”(Go To)。这是一个在旧式编程中常用的命令,它允许程序直接跳转到代码中的某一行开始执行。虽然现代编程中很少使用这种命令,因为它可能会导致代码难以理解和维护,但在我们的游戏中,它可能会有一些有趣的用途。

例如,在BOSS战中,我们可以将BOSS的不同阶段分成多个“大脑”(Brain),然后在每个阶段的末尾使用“跳转”命令切换到下一个“大脑”。这样,我们就可以将BOSS战分成多个部分来编写,而不需要在一个巨大的“大脑”中处理所有逻辑。

当然,使用“跳转”命令也需要小心谨慎,因为它可能会引入一些难以调试的错误。所以,我还实现了一些额外的检查来确保“跳转”命令的正确性。

pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
--todo
-- animate speed-- goal
-- 3 turnaround
-- 4 shoot on retreat
-- 5 snek
-- 6 bumrush
-- 7 boss-- todo
--- change brains?!function _init()--- customize here ---#include shmup_brains.txt#include shmup_brains_meta.txtfile="shmup_brains.txt"filem="shmup_brains_meta.txt"arrname="brains"data=brains#include shmup_myspr.txt#include shmup_enlib.txt#include shmup_anilib.txt----------------------debug={}msg={}_drw=draw_brain_upd=update_brainmenuitem(1,"export",export)reload(0x0,0x0,0x2000,"cowshmup.p8")curx=1cury=1scrolly=0scrollx=0selbrain=1cmdlist={"hed","wai","asp","got"}scroll=0enemies={}poke(0x5f2d, 1)
endfunction _draw()_drw()if #msg>0 thenbgprint(msg[1].txt,64-#msg[1].txt*2,80,14)msg[1].t-=1if msg[1].t<=0 thendeli(msg,1)end  end-- debug --cursor(4,4)color(8)for txt in all(debug) doprint(txt)endendfunction _update60()dokeys()mscroll=stat(36)scroll+=0.2scroll=scroll%16_upd()
endfunction dokeys()if stat(30) thenkey=stat(31)if key=="p" thenpoke(0x5f30,1)endelsekey=nilendend
-->8
--drawfunction draw_brain()cls(13)if flr(scroll)%2==0 thenfillp(0b0000111100001111.1)elsefillp(0b1111000011110000.1)endfor i=0,7 doline(i*16,0,i*16,128,5)endfillp(▥)for i=-1,7 doline(0,i*16+scroll,128,i*16+scroll,5)endfillp()for e in all(enemies) dodrawobj(e)enddrawmenu()
endfunction draw_table()cls(2)--spr(0,0,0,16,16)drawmenu()--[[for i=1,#data dofor j=1,#data[i] dobgprint(data[i][j],2+18*j,2+8*i,7)endend]]
endfunction drawmenu()if menu thenfor i=1,#menu dofor j=1,#menu[i] dolocal mymnu=menu[i][j]local c=mymnu.c or 13if i==cury and j==curx thenc=7if _upd==upd_type thenc=0endendbgprint(mymnu.w,mymnu.x+scrollx,mymnu.y+scrolly,13)   bgprint(mymnu.txt,mymnu.x+scrollx,mymnu.y+scrolly,c) endendendif menui thenfor i=1,#menui dofor j=1,#menui[i] dolocal mymnui=menui[i][j]local c=mymnui.c or 13if i==cury and j==curx thenc=7if _upd==upd_type thenc=0endend bgprint(mymnui.w,mymnui.x+scrollx,mymnui.y+scrolly,13)   bgprint(mymnui.txt,mymnui.x+scrollx,mymnui.y+scrolly,c) endendendif _upd==upd_type thenlocal mymnu=menu[cury][curx]local txt_bef=sub(typetxt,1,typecur-1)local txt_cur=sub(typetxt,typecur,typecur)local txt_aft=sub(typetxt,typecur+1)txt_cur=txt_cur=="" and " " or txt_cur if (time()*2)%1<0.5 thentxt_cur="\^i"..txt_cur.."\^-i"endlocal txt=txt_bef..txt_cur..txt_aftbgprint(txt,mymnu.x+scrollx,mymnu.y+scrolly,7)end
end-->8
--updatefunction update_setup()refresh_setup()if btnp(⬆️) thencury-=1endif btnp(⬇️) thencury+=1endcury=mid(2,cury,#menu)curx=2if btnp(❎) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="meta" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1callback=enter_metaendendif btnp(🅾️) then_upd=update_brainrefresh_brain()returnendif data[selbrain] thenif #enemies==0 thenlocal selmeta=meta[selbrain]if enlib[selmeta[1]]!=nil thenspawnen(selmeta[1],selmeta[2],selmeta[3])end  enddoenemies()elseenemies={}endendfunction update_brain()refresh_brain()if btnp(⬆️) thencury-=1endif btnp(⬇️) thencury+=1endcury=mid(1,cury,#menu)if cury==1 thenif btnp(⬅️) thenselbrain-=1enemies={}endif btnp(➡️) thenselbrain+=1enemies={}endselbrain=mid(1,selbrain,#data+1)elseif btnp(⬅️) thencurx-=1endif btnp(➡️) thencurx+=1endcurx=mid(1,curx,#menu[cury])endif btnp(❎) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="edit" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1callback=enter_brainelseif mymnu.cmd=="newline" thenadd(data[mymnu.cmdb],"wai",mymnu.cmdi)add(data[mymnu.cmdb],0,mymnu.cmdi+1)add(data[mymnu.cmdb],0,mymnu.cmdi+2)cury+=1curx=1elseif mymnu.cmd=="setup" thenrefresh_setup()_upd=update_setupreturnelseif mymnu.cmd=="newbrain" thenadd(data,{"wai",0,0})add(meta,{1,64,10})endreturn endif data[selbrain] thenif #enemies==0 thenlocal selmeta=meta[selbrain]if enlib[selmeta[1]]!=nil thenspawnen(selmeta[1],selmeta[2],selmeta[3])endenddoenemies()elseenemies={}end
endfunction update_table()refresh_table()if btnp(⬆️) thencury-=1endif btnp(⬇️) thencury+=1endcury=(cury-1)%#menu+1cury-=mscrollcury=mid(1,cury,#menu)if btnp(⬅️) thencurx-=1endif btnp(➡️) thencurx+=1endif cury<#menu thencurx=(curx-2)%(#menu[cury]-1)+2elsecurx=1endlocal mymnu=menu[cury][curx]if mymnu.y+scrolly>110 thenscrolly-=4endif mymnu.y+scrolly<10 thenscrolly+=4endscrolly=min(0,scrolly)if mymnu.x+scrollx>110 thenscrollx-=2endif mymnu.x+scrollx<20 thenscrollx+=2endscrollx=min(0,scrollx)if btnp(❎) thenlocal mymnu=menu[cury][curx]if mymnu.cmd=="edit" then_upd=upd_typetypetxt=tostr(mymnu.txt)typecur=#typetxt+1callback=enter_tableelseif mymnu.cmd=="newline" thenadd(data,{0})  elseif mymnu.cmd=="newcell" thenadd(data[mymnu.cmdy],0)endend
endfunction upd_type()if key thenif key=="\r" then-- enterpoke(0x5f30,1)callback()returnelseif key=="\b" then--backspaceif typecur>1 thenif typecur>#typetxt thentypetxt=sub(typetxt,1,#typetxt-1)elselocal txt_bef=sub(typetxt,1,typecur-2)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..txt_aftendtypecur-=1endelseif typecur>#typetxt thentypetxt..=keyelselocal txt_bef=sub(typetxt,1,typecur-1)local txt_aft=sub(typetxt,typecur)typetxt=txt_bef..key..txt_aftendtypecur+=1endendif btnp(⬅️) thentypecur-=1endif btnp(➡️) thentypecur+=1endtypecur=mid(1,typecur,#typetxt+1)
end
-->8
--toolsfunction bgprint(txt,x,y,c)print("\#0"..txt,x,y,c)
endfunction split2d(s)local arr=split(s,"|",false)for k, v in pairs(arr) doarr[k] = split(v)endreturn arr
endfunction spacejam(n)local ret=""for i=1,n doret..=" "endreturn ret
endfunction mspr(si,sx,sy)local _x,_y,_w,_h,_ox,_oy,_fx,_nx=unpack(myspr[si])sspr(_x,_y,_w,_h,sx-_ox,sy-_oy,_w,_h,_fx==1)if _fx==2 thensspr(_x,_y,_w,_h,sx-_ox+_w,sy-_oy,_w,_h,true)endif _nx thenmspr(_nx,sx,sy)end
endfunction cyc(age,arr,anis)local anis=anis or 1return arr[(age\anis-1)%#arr+1]
endfunction drawobj(obj)mspr(cyc(obj.age,obj.ani,obj.anis),obj.x,obj.y)--★if coldebug and obj.col thenmsprc(obj.col,obj.x,obj.y)end
endfunction onscreen(obj)if obj.x<-8 then return false endif obj.y<-8 then return false endif obj.x>136 then return false endif obj.y>136 then return false end return true
end
-->8
--i/o
function export()local s=arrname.."=split2d\""for i=1,#data doif i>1 thens..="|"endfor j=1,#data[i] doif j>1 thens..=","ends..=data[i][j]endends..="\""printh(s,file,true)local s="meta=split2d\""for i=1,#meta doif i>1 thens..="|"endfor j=1,#meta[i] doif j>1 thens..=","ends..=meta[i][j]endends..="\""printh(s,filem,true)add(msg,{txt="exported!",t=120})--debug[1]="exported!"
end
-->8
--uifunction refresh_setup()menu={}menui={}add(menu,{{txt="brain "..selbrain,w="        ",cmd="",x=3,y=3,c=13  }})local cap={"en:"," x:"," y:"}local selmeta=meta[selbrain]for i=1,3 dolocal lne={}add(lne,{txt=cap[i],w="  ",cmd="",x=3,y=3+i*6+2,c=13  })add(lne,{txt=selmeta[i],w="   ",cmd="meta",cmdy=i,x=3+12,y=3+i*6+2,c=13  })add(menu,lne)endendfunction refresh_brain()menu={}menui={}if selbrain>#data then--empty brain slotadd(menu,{{txt="< new brain ",w="           ",cmd="newbrain",x=3,y=3,c=13  }}) returnendadd(menu,{{txt="< brain "..selbrain.." >",w="            ",cmd="head",x=3,y=3,c=13  }}) add(menu,{{txt="◆setup",w="       ",cmd="setup",x=3,y=3+8,c=13 }})local mybra=brains[selbrain]local ly=19for i=1,#mybra,3 dolocal lne={}add(lne,{txt=mybra[i],w="   ",cmd="edit",cmdi=i,cmdb=selbrain,x=3,y=ly,c=13    })local lx=3+14 for j=1,2 dolocal mytxt=tostr(mybra[i+j])add(lne,{txt=mytxt,w=spacejam(#mytxt),cmd="edit",cmdi=i+j,cmdb=selbrain,x=lx,y=ly,c=13    })lx+=#mytxt*4+2endif cury==#menu+1 thenadd(lne,{txt="+",w=" ",cmd="newline",cmdi=i+3,cmdb=selbrain,x=lx,y=ly,c=13    })endadd(menu,lne)ly+=8endif menu[cury] thenlocal mymnu=menu[cury][curx]if mymnu and mymnu.cmd=="edit" thenadd(menui,{{txt="i:"..mymnu.cmdi,w="    ",cmd="",x=3,y=120,c=15    }})endend
endfunction refresh_table()menu={}menui={}for i=1,#data dolocal lne={}local linemax=#data[i]if i==cury thenlinemax+=1  endadd(lne,{txt=i,w="   ",cmd="",x=4,y=-4+8*i,c=2  })for j=1,linemax doif j==#data[i]+1 thenadd(lne,{txt="+",w=" ",cmd="newcell",cmdy=i,x=-10+14*(j+1),y=-4+8*i, })elseadd(lne,{txt=data[i][j],cmd="edit",cmdx=j,cmdy=i,x=-10+14*(j+1),y=-4+8*i,w="   "})endendadd(menu,lne)endadd(menu,{{txt=" + ",w="   ",cmd="newline",x=4,y=-4+8*(#data+1), }})
endfunction enter_table()local mymnu=menu[cury][curx]local typeval=typetxtif typeval==nil or typeval=="" thenif mymnu.cmdx==#data[mymnu.cmdy] and typetxt=="" then--delete celldeli(data[mymnu.cmdy],mymnu.cmdx)if mymnu.cmdx==1 thendeli(data,mymnu.cmdy)end_upd=update_tablereturnend  typeval=0end   data[mymnu.cmdy][mymnu.cmdx]=typeval_upd=update_table
endfunction enter_brain()_upd=update_brainlocal mymnu=menu[cury][curx]local typeval=typetxtenemies={}if mymnu.cmdi%3==1 then--editing command entryif typeval=="" thendeli(data[mymnu.cmdb],mymnu.cmdi)deli(data[mymnu.cmdb],mymnu.cmdi)deli(data[mymnu.cmdb],mymnu.cmdi)if #data[mymnu.cmdb]==0 thendeli(data,mymnu.cmdb)deli(meta,mymnu.cmdb)add(msg,{txt="brain deleted!",t=120})endreturnelse local found=false for c in all(cmdlist) doif typeval==c thenfound=trueend endif not found thentypeval="wai"endendelse--editing parameterstypeval=tonum(typetxt)if typeval==nil thentypeval=0endenddata[mymnu.cmdb][mymnu.cmdi]=typevalendfunction enter_meta()_upd=update_setuplocal mymnu=menu[cury][curx]local typeval=tonum(typetxt)enemies={}if typeval==nil thentypeval=0endmeta[selbrain][mymnu.cmdy]=typevalend
-->8
--enemyfunction dobrain(e)--★ remove robustnessif braincheck(e)==false then return endlocal mybra=brains[e.brain]local quit=falseif e.bri<#mybra thenlocal cmd=mybra[e.bri]local par1=mybra[e.bri+1]local par2=mybra[e.bri+2]if cmd=="hed" then--set heading / speede.ang=par1e.spd=par2e.aspt=nilelseif cmd=="wai" then--wait x framese.wait=par1e.dist=par2quit=trueelseif cmd=="asp" then--animate speede.aspt=par1e.asps=par2elseif cmd=="got" then--★ remove robustnesse.brain=par1e.bri=par2-3else--★ extra robustnessreturnende.bri+=3if quit then return enddobrain(e)end
endfunction doenemies()for e in all(enemies) doif e.wait>0 thene.wait-=1elseif e.dist<=0 thendobrain(e)endif e.aspt thene.spd+=e.aspsif abs(e.aspt-e.spd)<abs(e.asps) thene.spd=e.aspte.aspt=nilendende.sx=sin(e.ang)*e.spde.sy=cos(e.ang)*e.spde.dist=max(0,e.dist-abs(e.spd))e.x+=e.sxe.y+=e.sye.age+=1if not onscreen(e) thendel(enemies,e)endendendfunction spawnen(eni,enx,eny)local en=enlib[eni]add(enemies,{x=enx,y=eny,ani=anilib[en[1]],anis=en[2],sx=0,sy=0,ang=0,spd=0,brain=selbrain,bri=1,age=0,flash=0,hp=en[4],col=en[5],wait=0,dist=0})endfunction braincheck(e)if brains[e.brain]==nil thenif #msg>0 thenmsg[1].t=5elseadd(msg,{txt="bad brain "..e.brain,t=5})endreturn falseendlocal mybra=brains[e.brain]if e.bri<1 thenif #msg>0 thenmsg[1].t=5elseadd(msg,{txt="brain command index < 1",t=5})endreturn falseelseif e.bri<#mybra thenlocal cmd=mybra[e.bri]local found=falsefor c in all(cmdlist) doif c==cmd thenfound=trueendendif found==false thenif #msg>0 thenmsg[1].t=5elseadd(msg,{txt="bad command "..cmd,t=5})endreturn falseendendreturn true
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

相关文章:

制作一款打飞机游戏47:跳转

编辑器的问题 我们开始为不同的敌人编写一些行为&#xff0c;到目前为止进展顺利&#xff0c;一切都很棒。但上次我们遇到了一些问题&#xff0c;我们发现在这个编辑器中编写代码有时有点困难&#xff0c;因为当你想要在某行之间插入内容时&#xff0c;你不得不删除一切然后重…...

本地部署ollama及deepseek(linux版)

一、安装ollama export OLLAMA_MIRROR"https://ghproxy.cn/https://github.com/ollama/ollama/releases/latest/download"curl -fsSL https://ollama.com/install.sh | sed "s|https://ollama.com/download|$OLLAMA_MIRROR|g" | shexport OLLAMA_MIRROR&q…...

Java Spring Boot项目目录规范示例

以下是一个典型的 Java Spring Boot 项目目录结构规范示例&#xff0c;结合了分层架构和模块化设计的最佳实践&#xff1a; text 复制 下载 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…...

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明

针对共享内存和上述windows消息机制 在C++ 和qt之间的案例 进行详细举例说明 以下是关于在 C++ 和 Qt 中使用共享内存(QSharedMemory)和 Windows 消息机制(SendMessage / PostMessage)进行跨线程或跨进程通信的详细示例。 🧩 使用 QSharedMemory 进行进程间通信(Qt 示例…...

vue H5解决安卓手机软键盘弹出,页面高度被顶起

开发中安卓机上遇到的软键盘弹出导致布局问题 直接上代码_ 在这里插入代码片 <div class"container"><div class"appContainer" :style"{height:isKeyboardOpen? Heights :inherit}"><p class"name"><!-- 绑定…...

CSS专题之自定义属性

前言 石匠敲击石头的第 12 次 CSS 自定义属性是现代 CSS 的一个强大特性&#xff0c;可以说是前端开发需知、必会的知识点&#xff0c;本篇文章就来好好梳理一下&#xff0c;如果哪里写的有问题欢迎指出。 什么是 CSS 自定义属性 CSS 自定义属性英文全称是 CSS Custom Proper…...

问题 | 当前计算机视觉迫切解决的问题

当前计算机视觉领域虽然在技术上取得了显著进展&#xff0c;但仍面临一系列关键挑战。结合最新研究与应用现状&#xff0c;以下是最迫切需要解决的几大问题&#xff1a; 1. 数据质量与多样性不足 高质量标注数据的获取&#xff1a;训练高效模型依赖大量精准标注的数据&#x…...

七、深入 Hive DDL:管理表、分区与洞察元数据

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月13日 专栏&#xff1a;Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据&#xff1a;SHOW 命令的威力结语&#xff1a;DDL 与 SHOW&#xff0c;Hive 管理的双翼练习题一、选择题二、代码题…...

Qt6.x检查网络是否在线(与Qt 5.x不同)

Qt 5.x.x 要判断客户端网络是否联通&#xff0c;一般用如下方法&#xff1a; #include <QNetworkConfigurationManager>auto netWorkCheck new QNetworkConfigurationManager(); auto flag netWorkCheck->isOnline(); Qt 6.x.x 废弃了 QNetworkConfigurationManag…...

直接在Excel中用Python Matplotlib/Seaborn/Plotly......

本次分享如何利用pyxll包&#xff0c;实现直接在Excel中使用Python Matplotlib/Seaborn/Plotly等强大可视化工具。 pyxll配置 pyxll安装 pip install pyxll pyxll install pyxll自定义方法 例如&#xff0c;自定义一个计算斐波那契数的方法fib&#xff0c;并使用pyxll装饰器…...

React面试常问问题详解

以下是30个React面试中常见的问题及简要解析&#xff0c;涵盖基础概念、核心原理、性能优化、Hooks、状态管理等方面&#xff0c;适用于初中高级开发者准备面试时参考&#xff1a; 一、React 基础与核心概念 React 是什么&#xff1f; React 是由 Facebook 开发的用于构建用户界…...

【Java】网络编程(Socket)

网络编程 Socket 我们开发的网络应用程序位于应用层&#xff0c;TCP和UDP属于传输层协议&#xff0c;在应用层如何使用传输层的服务呢&#xff1f;在应用层和传输层之间&#xff0c;则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口&#xff0c;应用程…...

思科(Cisco ASA/Firepower)、华三(H3C)、华为(Huawei USG)防火墙 的基础配置

以下是针对 思科&#xff08;Cisco ASA/Firepower&#xff09;、华三&#xff08;H3C&#xff09;、华为&#xff08;Huawei USG&#xff09;防火墙 的基础配置指南&#xff0c;涵盖 区域划分、安全策略、NAT、路由 等核心功能。配置示例基于通用场景&#xff0c;实际部署时需根…...

华为海思系列----昇腾张量编译器(ATC)模型转换工具----入门级使用指南(LINUX版)

由于官方SDK比较冗余且经常跨文档讲解且SDK整理的乱七八糟,对于新手来说全部看完上手成本较高,本文旨在以简短的方式介绍 CAFFE / ONNX 模型转 om 模型,并进行推理的全流程。希望能够帮助到第一次接触华为海思框架的道友们。大佬们就没必要看这种基础文章啦! 注:本…...

supabase 怎么新建项目?

在 Supabase 中新建项目主要通过官方网站的仪表盘 (Dashboard) 来完成。以下是详细步骤&#xff1a; 通过 Supabase 仪表盘新建项目&#xff1a; 注册/登录 Supabase 账户&#xff1a; 访问 Supabase 官网&#xff1a;https://supabase.com/如果你还没有账户&#xff0c;点击 …...

Windows环境下maven的安装与配置

1.检查JAVA_HOME环境变量 Maven是使用java开发的&#xff0c;所以必须知道当前系统环境中的JDK的安装目录。 搜索栏直接输入“cmd” 或者 WinR 输入cmd 在打开的终端窗口输入“echo %JAVA_HOME”&#xff0c;就可以看到jdk的位置了。 如果没有的话&#xff0c;请参考我的文章&a…...

LeetCode:513、找树左下角的值

//递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* t…...

Vxe UI vue vxe-table 实现表格数据分组功能,不是使用树结构,直接数据分组

Vxe UI vue vxe-table 实现表格数据分组功能&#xff0c;不是使用树结构&#xff0c;直接数据分组 查看官网&#xff1a;https://vxetable.cn gitbub&#xff1a;https://github.com/x-extends/vxe-table gitee&#xff1a;https://gitee.com/x-extends/vxe-table 代码 通过…...

如何禁止chrome自动更新

百度了一下 下面这个方法实测有效 目录 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable 3、验证是否禁止更新成功&#xff1a; 1、WINR 输入 services.msc 2、在Services弹窗中找到下面两个service并disable GoogleUpdater InternalService…...

阳光学院【2020下】计算机网络原理-A卷-试卷-期末考试试卷

一、单选题&#xff08;共25分&#xff0c;每空1分&#xff09; 1.ICMP协议工作在TCP/IP参考模型的 ( ) A.主机-网络 B.网络互联层 C.传输层 D.应用层 2.下列关于交换技术的说法中&#xff0c;错误的是 ( ) A.电路交换适用于突发式通信 B.报文交换不能满足实时通信 C.报文…...

Spring Boot 使用 OSHI 实现系统运行状态监控接口

在实际开发中&#xff0c;我们经常需要获取服务器的运行状态&#xff0c;例如&#xff1a;CPU 使用率、内存使用情况、磁盘状态、JVM 运行信息等&#xff0c;以便于运维监控和性能分析。本文将基于 Spring Boot OSHI 实现一个系统信息接口&#xff0c;可返回当前服务运行的详细…...

FastAPI+MongoDB+React实现查询博客详情功能

第一部分:FastAPI 和 MongoDB 后端 确保你的 FastAPI 应用已经配置好,并且 MongoDB 数据库已经运行。以下是完整的后端代码: # main.py from fastapi import FastAPI, HTTPException, Depends from motor.motor_asyncio import AsyncIOMotorClient from pydantic import B…...

kotlin-协程(什么是一个协程)

1.什么指一个协程对于线程来说一个thread就是就是指一个线程&#xff0c;thread为什么成为线程呢&#xff1f;因为他实现了对线程的一个抽象管理&#xff0c;可以管理这个线程&#xff0c;启动&#xff0c;可以查看各种信息 那么协程呢&#xff1f; public fun CoroutineScop…...

数组和切片的区别

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…...

WPF内嵌其他进程的窗口

WPF内嵌其他进程窗口的常见方法有 HwndHost SetParent 和 WindowsFormsHost WinForms Panel SetParent 推荐使用自定义HwndHost 两者的对比区别 示例代码 public class MyWndHost : HwndHost {const int WS_CHILD 0x40000000;const int WS_VISIBLE 0x10000000;const i…...

阿里云购买ECS 安装redis mysql nginx jdk 部署jar 部署web

服务&#xff1a;ECS防火墙要开启、阿里云控制平台&#xff1a;网路端口安全策略要设置 阿里云服务维护 1.安装JDK 查询要安装jdk的版本,命令&#xff1a;yum -y list java* 命令&#xff1a;yum install -y java-1.8.0-openjdk.x86_64 yum install -y java-17-openjdk.x8…...

CVPR2025 | Prompt-CAM: 让视觉 Transformer 可解释以进行细粒度分析

Prompt-CAM: Making Vision Transformers Interpretable for Fine-Grained Analysis 摘要-Abstract引言-Introduction方法-Approach预备知识-PreliminariesPrompt-CAM: Prompt Class Attention Map特征识别与定位-Trait Identification and Localization变体与扩展-Variants an…...

Fabric系列 - SoftHSM 软件模拟HSM

在 fabric-ca-server 上使用软件模拟的 HSM(密码卡) 功能 安装 SoftHSMv2 教程 SoftHSMv2 默认的配置文件 /etc/softhsm2.conf默认的token目录 /var/lib/softhsm/tokens/ 初始化和启动fabric-ca-server&#xff0c;需要设置一个管理员用户的名称和密码 初始化令牌 # 初始…...

解锁 DevOps 新境界 :使用 Flux 进行 GitOps 现场演示 – 自动化您的 Kubernetes 部署

前言 GitOps 是实现持续部署的云原生方式。它的名字来源于标准且占主导地位的版本控制系统 Git。GitOps 的 Git 在某种程度上类似于 Kubernetes 的 etcd&#xff0c;但更进一步&#xff0c;因为 etcd 本身不保存版本历史记录。毋庸置疑&#xff0c;任何源代码管理服务&#xf…...

LLM大模型中的基础数学工具—— 信号处理与傅里叶分析

Q51: 推导傅里叶变换 的 Parseval 定理 傅里叶变换的 Parseval 定理揭示了啥关系&#xff1f; Parseval 定理揭示了傅里叶变换中时域与频域的能量守恒关系&#xff0c;即信号在时域的总能量等于其在频域的总能量。这就好比一个物体无论从哪个角度称重&#xff0c;重量始终不…...