制作一款打飞机游戏48:敌人转向
射击功能
有一个重要的功能我们还没实现,那就是射击。目前,敌人还不能射击,这显然是不行的。因此,我们决定添加一个射击命令,暂时用一个显示圆圈的方式来表示射击动作。
编程语言的调试
有趣的是,我们创造了自己的编程语言,现在还需要为它编写调试工具,以确保我们编写的代码没有bug。这听起来有点讽刺,但确实是必要的。
射击命令的实现
我们决定将这个射击命令命名为“fir”(fire的缩写)。当我们执行这个命令时,敌人会发射一个子弹,尽管现在我们还不知道子弹的具体类型和参数。我们会在后续的开发中逐步完善这些细节。
射击动画与效果
为了让射击效果更逼真,我们决定在敌人身上添加一个“muzzle flash”(枪口闪光)效果。这个效果会跟随敌人移动,并在射击时显示。我们还设置了一个简单的逻辑,当闪光效果的年龄(存在时间)超过一定值时,就将其删除。
无限循环的问题
在开发过程中,我们遇到了一个无限循环的问题。由于“do brain”函数是递归的,如果在“brain”中没有适当的等待命令来中断循环,就会导致程序陷入无限循环。为了解决这个问题,我们添加了一个深度检查机制,当递归深度超过一定值时,就停止执行。
敌人的转向与动画
接下来,我们想让敌人能够执行转向动作。我们通过设置敌人的朝向(heading)和速度(speed)来实现这一点。为了让转向动作更自然,我们还引入了动画速度(ASP)和动画方向(ADR)的概念,使敌人的移动更加平滑。
射击后撤退的动作
我们尝试实现一个“射击后撤退”的动作,但效果并不理想。这个问题我们会在下一集中继续探讨。
代码的执行状态显示
为了方便调试,我们决定在编辑器中添加一个功能,显示当前正在执行的代码行。我们通过添加一个可移动的红色线条来实现这一点,当代码执行到某一行时,这条线就会移动到对应的位置。
pico-8 cartridge // http://www.pico-8.com
version 41
__lua__
--todo-- goal
-- 5 snek
-- 6 bumrush
-- 7 boss-- todofunction _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","fir","adr"}execy=0scroll=0enemies={}muzz={}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)end-- temp muzzle flashesfor m in all(muzz) dom.r-=1if m.en thencircfill(m.en.x,m.en.y,m.r,7)endif m.r<=0 thendel(muzz,m)endenddrawmenu()line(1,execy,1,execy+6,9)
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={}execy=-16if 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 doif enemies[1] thenlocal myen=enemies[1]if myen.brain==selbrain and myen.bri==i thenexecy=ly-9endendlocal 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,depth)--★ remove robustnessif braincheck(e)==false then return endlocal depth=depth or 1if depth>100 thenif #msg>0 thenmsg[1].t=5elseadd(msg,{txt="infinite loop",t=5})endreturnend -- robustness code 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=="adr" then--animate directione.adrt=par1e.adrs=par2elseif cmd=="got" then--gotoe.brain=par1e.bri=par2-3elseif cmd=="fir" then--firefirebul(e,par1,par2)else--★ extra robustnessreturnende.bri+=3if quit then return enddobrain(e,depth+1)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=nilendendif e.adrt thene.ang+=e.adrsif abs(e.adrt-e.ang)<abs(e.adrs) thene.ang=e.adrte.adrt=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
endfunction firebul(_en,par1,par2)add(muzz,{en=_en,r=8})
end
__gfx__
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00077000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00700700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
__map__
0000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
相关文章:

制作一款打飞机游戏48:敌人转向
射击功能 有一个重要的功能我们还没实现,那就是射击。目前,敌人还不能射击,这显然是不行的。因此,我们决定添加一个射击命令,暂时用一个显示圆圈的方式来表示射击动作。 编程语言的调试 有趣的是,我们创…...
鸿蒙OSUniApp打造多功能图表展示组件 #三方框架 #Uniapp
使用UniApp打造多功能图表展示组件 在当前移动应用开发领域,数据可视化已成为不可或缺的一部分。无论是展示销售数据、用户增长趋势还是其他业务指标,一个优秀的图表组件都能有效提升用户体验。UniApp作为一款跨平台开发框架,如何在其中实现…...
Chrome浏览器实验性API computePressure的隐私保护机制如何绕过?
一、computePressure API 设计原理与隐私保护机制 1.1 API 设计目标 computePressure是W3C提出的系统状态监控API,旨在: • 提供系统资源状态的抽象指标(非精确值) • 防止通过高精度时序攻击获取用户指纹 • 平衡开发者需求与用户隐私保护 1.2 隐私保护实现方式 // 典…...

RK3588 串行解串板,支持8路GMSL相机
RK3588 支持的 GMSL 相机接入数量取决于所使用的解串板型号及配置方案: xcDeserializer3.0 解串板 可接入最多 8 路 2M GMSL2 相机1。 xcDeserializer4.0 解串板 支持 4 路 2M GMSL2 相机1。 边缘计算盒解决方案 部分商用方案可实现 4 或 8…...

OracleLinux7.9-ssh问题
有套rac环境,db1主机无法ssh db1和db1-priv,可以ssh登录 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…...

手机换IP真的有用吗?可以干什么?
在当今数字化时代,网络安全和个人隐私保护日益受到重视。手机作为我们日常生活中不可或缺的工具,其网络活动痕迹往往通过IP地址被记录和追踪。那么,手机换IP真的有用吗?它能为我们带来哪些实际好处?本文将为你一一解答…...
提示词设计模板(基于最佳实践)
1. 任务清晰化 模糊指令 ➜ 明确指令 ❌ "写一篇关于环保的文章" ✅ *"列出5种城市环保措施,并分别说明其对减少碳排放的影响(要求:数据支持案例)"* 2. 任务步骤化 案例:策划线上营销活动 1.…...

如何实现一个运动会计分系统?(C语言版)
一、需求分析 设计一个运动会计分系统,计分信息包括参加学校,参与项目,性别,名次个数,各个学校获得名次信息。该系统具有以下功能 数据录入: 链表或结构体数组组织数据数据报表: 依照规定的报表格式对数据打印报表数据排序: 按照要求对数据进行统计,含简单统计及综合统计…...
《P4391 [BalticOI 2009] Radio Transmission 无线传输 题解》
题目描述 给你一个字符串 s1,它是由某个字符串 s2 不断自我连接形成的(保证至少重复 2 次)。但是字符串 s2 是不确定的,现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 L,表示给出字符串的长度。…...
tocmat 启动怎么设置 jvm和gc
在生产环境中部署 Java Web 应用时,我们经常需要给 Tomcat 设置 JVM 参数和 GC 策略,以提高性能、稳定性和可观察性。以下是完整教程: 一、Tomcat 设置 JVM 启动参数的方式 1. 修改 startup 脚本(推荐) 以 Linux 系统…...
[思维模式-37]:什么是事?什么是物?什么事物?如何通过数学的方法阐述事物?
一、基本概念 1、事(Event) “事”通常指的是人类在社会生活中的各种活动、行为、事件或情况,具有动态性和过程性,强调的是一种变化、发展或相互作用的流程。 特点 动态性:“事”往往涉及一系列的动作、变化和发展过程。例如&a…...
面向对象设计模式之代理模式详解
文章目录 面向对象设计模式之代理模式详解面向对象思想:现代软件开发的基石代理模式:巧妙的中间层设计JavaScript 语法点与代理模式的结合JavaScript 实现代理模式示例代理模式的应用场景 面向对象设计模式之代理模式详解 在现代软件开发的浩瀚领域中&a…...
C++【STL】(2)string
C【STL】string用法扩展 1. assign:为字符串赋新值 用于替换字符串内容,支持多种参数形式。 常用形式: // 用另一个字符串赋值 str.assign("Hello World");// 用另一个字符串的子串(从第6个字符开始,取5…...

嵌入式学习笔记 - STM32 ADC,多重转换,内部参考电压,过采样,逐次逼近原理,采样时间
一 多个ADC器件,多重转换速率 每个型号MCU通常由多个ADC器件,比如STM32F4有三个ADC器件,每个ADC器件有一个最大转换速率,一般为2.4Mhz,即一个ADC器件每秒最多转换2.4M次,两次转换之间需要有时间间隔&#…...

团结引擎 1.5.0 发布,抖音小游戏平台即将开放、Shader Graph功能新增…引擎能力再提升!
「团结引擎 1.5.0」来啦!本次技术更新的内容,涵盖了小游戏、团结引擎车机版、OpenHarmony、Shader Graph、Muse Chat、Hub&License、代码升级、Digital Asset Manager for Tuanjie、团结官方开源车模 Sample 几大方向。 小游戏 在 Tuanjie 1.5.0 版…...
如何下载 Microsoft SQL Server Management Studio 2019
SQL Server Management Studio 是什么,为什么你需要它 SSMS 是 Microsoft 用于管理 SQL Server 环境的主要工具。它为 Windows 用户提供了一个图形用户界面,本质上是数据库管理员和开发人员处理 SQL Server 的指挥中心。重点是——尽管你可能认为它与 SQL Server 捆绑在一起…...
【SSL部署与优化】HTTP/2与HTTPS的协同效应
HTTP/2与HTTPS的协同效应:为何HTTP/2强制要求TLS 1.2? HTTP/2是HTTP协议的现代升级版,旨在通过多路复用、头部压缩等技术提升性能。然而,HTTP/2的设计与部署与HTTPS(TLS加密)紧密相关,甚至强制…...

如何配置activemq,支持使用wss协议连接。
1、到阿里云申请一个证书,通过后下载jks证书。 2、配置activemq: 打开activemq安装目录中“conf/activemq.xml”,增加以下记录: <transportConnectors> <transportConnector name"wss" uri"…...
GO语言内存管理结构
文章目录 1、内存分区1.1、栈(Stack)1.2、堆(Heap) 2、堆内存管理结构2.1、内存分配器(MCache → MArena → MSpan → MHeap)2.2、大小分类(Size Class)2.3、分配流程 3、垃圾回收&a…...

初学c语言14(指针6)
一.sizeof和strlen的对比 1.sizeof 操作符,计算变量所占空间大小 2.strlen 库函数,函数原型为: 求的是字符串的长度,统计的是“\0”之前的字符个数 二.指针和笔试题解析 补充:数组名的意义 1.sizeof(数组名) 这…...

数字化转型-4A架构之技术架构
4A架构系列文章 数字化转型-4A架构(业务架构、应用架构、数据架构、技术架构) 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 一、 技术架构 Technology Architecture 1. 技…...
什么是SparkONYarn模式
1. 什么是 Spark on YARN? Spark on YARN 是 Apache Spark 的一种部署模式,允许 Spark 应用程序在 Hadoop YARN 集群上运行,充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成,使企业能够在同一集群…...

kaggle薅羊毛
参考:https://pytorch-tutorial.readthedocs.io/en/latest/tutorial/chapter05_application/5_1_kaggle/#512-kaggle https://github.com/girls-in-ai/Girls-In-AI/blob/master/machine_learning_diary/data_analysis/kaggle_intro.md 1,code training…...

TCP 三次握手建立连接详解
文章目录 一、三次握手流程1、第一次握手2、第二次握手3、第三次握手 二、引申问题1、报文丢失,会发生什么?1.1、第一次握手丢失1.2、第二次握手丢失1.3、第三次握手丢失 2、为什么 ISN(Initial Sequence Number,初始序列号) 不固定3、为什么…...

高海拔和远距离的人员识别:面部、体型和步态的融合
大家读完就觉得有帮助记得关注和点赞!!! 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别(BRIAR)计划等监视场景中,其中生物识别数据是在长…...
Golang实践录:在go中使用curl实现https请求
之前曾经在一个 golang 工程调用 libcur 实现 https的请求,当前自测是通过的。后来迁移到另一个小系统出现段错误,于是对该模块代码改造,并再次自测。 问题提出 大约2年前,在某golang项目使用libcurl进行https请求(参…...

自然语言处理入门级项目——文本分类
文章目录 前言1.数据预处理1.1数据集介绍1.2数据集抽取1.3划分数据集1.4数据清洗1.5数据保存 2.样本的向量化表征2.1词汇表2.2向量化2.3自定义数据集2.4备注 结语 前言 本篇博客主要介绍自然语言处理领域中一个项目案例——文本分类,具体而言就是判断评价属于积极还…...
如何利用大模型对文章进行分段,提高向量搜索的准确性?
利用大模型对文章进行分段以提高向量搜索准确性,需结合文本语义理解、分块策略优化以及向量表示技术。以下是系统性的解决方案: 一、分块策略的核心原则 语义完整性优先 分块需确保每个文本单元在语义上独立且完整。研究表明,当分块内容保持单一主题时,向量嵌入的语义表征能…...

一发入魂:极简解决 SwiftUI 复杂视图未能正确刷新的问题(上)
概述 各位似秃非秃小码农们都知道,在 SwiftUI 中视图是状态的函数,这意味着状态的改变会导致界面被刷新。 但是,对于有些复杂布局的 SwiftUI 视图来说,它们的界面并不能直接映射到对应的状态上去。这就会造成一个问题࿱…...
深入理解 Dijkstra 算法:原理、实现与优化
算法核心思想 Dijkstra算法采用贪心策略,其核心思想可以概括为: 初始化:设置起点到自身的距离为0,到其他所有点的距离为无穷大 迭代处理: 从未处理的顶点中选择当前距离起点最近的顶点 标记该顶点为已处理 通过该顶…...