游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录
- 奇美拉类
- 摸鱼仔,负能量,真老实,小坏蛋,压力怪
- 治愈师
- 小团体
- 画饼王
- 平凡王
- 坏脾气
- 抗压包
- 请假狂
- 请假王
- 内卷王
- 受气包
- 跑路侠
- 看乐子
- 背锅侠
- 抢功劳
- 急先锋
- 说怪话
- 帮倒忙
- 小夸夸
- 工作狂
- 职业经理
- 严酷恶魔
- 职场清流
- 开始工作吧小奇美拉
- 没想到吧,我还在!(优化)
本博文是奇美拉项目的完结篇章
前两个篇连接如下:
游戏开发实战(一):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所—源码级解析该小游戏背后的算法与设计模式【纯原创】-CSDN博客
游戏开发实战(二):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所—源码级解析该小游戏背后的算法与设计模式【纯原创】-CSDN博客
项目Github: https://github.com/Hanachirusat/Chimeras
奇美拉类
摸鱼仔,负能量,真老实,小坏蛋,压力怪
这些奇美拉并没有技能,平平无奇。我们对所有奇美拉的攻击力快照设置了property(只读)。我们不希望可以随意更改奇美拉快照,而只有每回合开始时调用相应的方法来固定攻击力快照。
#**摸鱼仔【3,2】**:平平无奇
class Myz(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=2self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #观察模式,2观察所有1观察自身外的所有0只观察自身self.__skill=Falseself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):pass#**负能量【7,3】:**平平无奇
class Fnl(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=7self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0self.__skill=Falseself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):pass#**真老实【1,16】:**平平无奇
class Zls(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=1self.__hp=16self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0self.__skill=Falseself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):pass#**小坏蛋【3,5】:**平平无奇
class Xhd(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0self.__skill=Falseself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):pass##**压力怪【5,3】**:平平无奇
class Ylg(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=5self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0self.__skill=Falseself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):pass
治愈师
每回合开始,使前一格同伴体力+1
治愈师进观察自身,如果变化的属性不是自己则直接返回。代码中的new_value-old_value)==1
是防御性编程。用于辅助发现episode相关的逻辑错误(每回合episode只能+1)
#**治愈师【温暖,2,5】:**==每回合开始==,使前一格同伴`体力+1`
class Zys(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):returnif changed_attr=="episode" and (new_value-old_value)==1 and self.__on:position=self.queue.members_list.index(self)+1#如果前面一格有队友if position<=len(self.queue.members_list-1):self.queue.members_list[position].hp+=1
小团体
每回合开始时,使前两格同伴效率+1
,其余同伴体力-1
小团体的实际技能生效情况和自身位置相关。我们先对它前面两格(直到队头奇美拉)的同伴效率+1。其余体力同伴-1可能会触发其他奇美拉的被动技能,因此我们先记住其余奇美拉对象,然后再对这些奇美拉对象的hp-1。
class Xtt(ChimerasEntity):#__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否登场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):returnif changed_attr=="episode" and (new_value-old_value)==1 and self.__on:position=self.queue.members_list.index(self)l=len(self.queue.members_list)#前两格同伴效率+1for i in range(position+1,min(position+3,l)):self.queue.members_list[i].atk += 1# 其余同伴体力-1,体力-1可能触发其他同伴的技能导致位置发生变化# w我们先记录需要-1的同伴chi_hp_decrease=[]for i in range(position):chi_hp_decrease.append(self.queue.members_list[i])for chi in chi_hp_decrease:chi.hp -= 1
画饼王
登场技判断需要保证旧值为False。回合技能需要保证再第二回合触发。
# **画饼王【话术,2,7】:**==登场后==所有同伴`效率+8 `,==若自身在场,每回合==使所有同伴`效率-2`
class Hbw(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=7self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#登场后,所有同伴效率+8if changed_attr=="on" and old_value==False and self.__on:for i in self.queue.members_list:if i!=self:i.atk+=8# 若自身在场,每回合所有同伴效率-2,这个应该从第二回合开始算,第二回合的时候1-》2.old_value应该为1if changed_attr=="episode" and (new_value-old_value)==1 and old_value>0 and self.__on:for i in self.queue.members_list:if i!=self:i.atk-=2
平凡王
先记录场上所有无特性同伴的效率和体力,之后进行截断(上限为25)。注意:这里单词的实际意思可能是单个奇美拉的意思,因为登场技能只会发动一次,因此不存在技能发动单次的含义)
# **平凡王【联合,7,7】:**==登场后==,获得场上`所有无特性同伴100%的效率和体力`(单次上限均为25)
class Pfw(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=7self.__hp=7self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#登场后,获得场上所有无特性同伴100%的效率和体力if changed_attr=="on" and old_value==False and self.__on:a,h=0,0for i in self.queue.members_list:if i!=self:a+=min(i.atk,25)h+=min(i.hp,25)#单次上限均为25self.__atk+=aself.__hp+=h
坏脾气
只有当前奇美拉不是最后一个奇美拉时才会发动技能
# **坏脾气【发作,AT:2,HP:9】:**==自身工作时==:使`后一格`同伴`体力-1`
class Hpq(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=9self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身工作时if changed_attr=="work_num" and new_value>old_value and self.__on:#获得当前位置position=self.queue.members_list.index(self)#如果后面有同伴,则使后面同伴hp-1if position>0:self.queue.members_list[position-1].hp-=1
抗压包
使得同伴效率降增加并不会实际触发技能,因此可以直接操作,并不需要先记录需要加buff的奇美拉对象
#**抗压包【熟练,2,5】:**==自身体力降低时==使`前后一格`同伴`效率+1`
class Kyb(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身体力降低时if changed_attr=="hp" and new_value<old_value and self.__on:#获得当前位置position=self.queue.members_list.index(self)l=len(self.queue.members_list.index(self))position_before=position+1position_after=position-1if position_before>=0 and position_before<l:self.queue.members_list[position_before].atk+=1if position_after >= 0 and position_after < l:self.queue.members_list[position_after].atk += 1
请假狂
# **请假狂【装病,2,7】:**==自身体力降低后==,与`后一格`同伴`交换位置`,并使自身`效率+2`
class Qjk(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=7self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身体力降低时if changed_attr=="hp" and new_value<old_value and self.__on:#获得当前位置position=self.queue.members_list.index(self)#如果不在队列最后,则与后一格同伴交换位置,并使自身体力+2if position>0:self.queue.members_list[position-1],self.queue.members_list[position]=self.queue.members_list[position],self.queue.members_list[position-1]self.atk += 2
请假王
# **请假王【开摆,6,3】**:==自身体力降低后==,与`后一格`同伴`交换位置`,并使自身`体力+3`
class Qjw(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=6self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身体力降低时if changed_attr == "hp" and new_value < old_value and self.__on:# 获得当前位置position = self.queue.members_list.index(self)# 如果不在队列最后,则与后一格同伴交换位置if position > 0:self.queue.members_list[position - 1], self.queue.members_list[position] = self.queue.members_list[position], self.queue.members_list[position - 1]self.hp += 3
内卷王
# **内卷王【激励,3,8】:**==自身完成工作时==:获得`效率+2`,`体力+3`
class Njw(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=8self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身完成工作时,if changed_attr=="complete_work_num" and new_value>old_value and self.__on:self.atk+=2self.hp+=3
受气包
# **受气包【道歉,2,5】:** ==自身体力降低时==,使全局同伴`效率+1`
class Sqb(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身体力降低时if changed_attr == "hp" and new_value < old_value and self.__on:for i in self.queue.members_list:if i!=self:i.atk+=1
跑路侠
跑路侠累到后和后一个同伴一起逃离工作,根据前面提到的“规则”,我们不直接修改后一个同伴的生命,而是修改on属性为False,在每回合结束后,会把所有on属性为False的奇美拉清理出队列。此外,为了确保跑路侠hp小于0后一定离场(后续其他奇美拉对他加hp也不起作用),我们增加了一个hp-100的语句,为了防止这个语句继续调用跑路侠的技能,跑路下的技能判断条件为,旧的hp>0,新的hp<1(<=0)。(如果你还记得我们之前提到过的,在eval中用下划线修改私有属性并不会通知观察者,那么这里你就可以优雅的用self.__hp+=100
)
# **跑路侠【怂恿,1,1】**:==自身累倒时==,和后一格同伴一起`逃离工作`,并使其他同伴`体力+8`
class Plx(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=1self.__hp=1self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #只监控自身的属性变化从而保证每回合只触发一次被动技能self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#自身累倒时if changed_attr == "hp" and new_value < 1 and old_vale>0 and self.__on:slef.__hp-=100position=self.queue.members_list.index(self)# 使得后一格同伴离场,不修改后一格同伴的生命值if position>0:self.queue.members_list[position-1].on=False# 使得其他同伴体力+8for i in range(len(self.queue.members_list)):if i<(position-1) or (i> position):self.queue.members_list[i].hp+=8
看乐子
正如上文提到的,对于同一个奇美拉,看乐子可能触发两次被动。这也是有道理的,奇美拉生命值小于0表示累倒了。但是同伴可以给他加buff,使她的hp>0,此时又充满活力了,所以可以再次工作累倒。
# **看乐子【围观,3,3】**:==同伴累到后==,自身`效率+2`,`体力+2`
class Klz(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴累倒后if changed_attr == "hp" and new_value < 1 and old_vale>0 and self.__on:self.atk+=2self.hp+=2
背锅侠
# **背锅侠【接锅,3 ,6:**==同伴累倒时==,使该同伴`体力+10`,自身逃离工作
class Bgx(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=6self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴累倒后if changed_attr == "hp" and new_value < 1 and old_vale>0 and self.__on:#同伴累到后体力为hp,不会出现负体力,但这里不要用等于10#可能会出现其他奇美拉也给他加血,并且先于该奇美拉。print(f"\t给{changed_obj.name}加buff,hp+10!")changed_obj.hp+=10#注意此时不能修改self.queue.remove_member,因为我们无法保证此时弱引用集合已经遍历完毕。#如果直接修改,可能会会导致集合在遍历过程中被修改了,因此我们需要保证所有的技能都执行完,才移除on属性为False的奇美拉。也就是在每回合最后才移除奇美拉。self.on=False
抢功劳
这里需要保证work的hp>0,道理也很简单,如果工作已经被完成了,尘埃落定,如何抢功劳呢?由于追加工作可能触发其他奇美拉的被动,因此我们先判断是否完成工作,然后再修改complete_work_num属性。
# **抢功劳【独占,15,2:** ==同伴工作时==:若自身效率》=剩余工作进度,则进行`追加工作`完成该任务
class Qgl(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=15self.__hp=2self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴工作时,进行追加工作不算if changed_attr == "work_num" and (new_value-old_value)==1 and self.__on:#如果回合开始时的效率足以完成任务if self.__fixed_atk>=self.queue.work.hp and self.queue.work.hp>0:#进行一次追加攻击self.queue.work.hp-=self.__fixed_atkif self.queue.work.hp < 1:#完成工作也可能触发其他同伴的技能,因此需要最后执行self.complete_work_num += 1#追加攻击可能触发其他同伴的技能,导致继续工作一次,因此需要最后执行self.append_work_num+=1
急先锋
# **急先锋【带头,2,5】:**==同伴工作或追加工作时==,自身与前一格同伴`交换位置`,并且`体力+6`
class Jxf(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=2self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴工作或追加工作时,if (changed_attr =="work_num" or changed_attr=="append_work_num") and (new_value-old_value)==1:position=self.queue.members_list.index(self)#如果当前奇美拉不是第一个奇美拉if position<len(self.queue.members_list)-1:print(f"\t{self.name}与前一格奇美拉交换位置")#与前一格同伴交换位置self.queue.members_list[position],self.queue.members_list[position+1]=\self.queue.members_list[position+1],self.queue.members_list[position]self.hp+=6
说怪话
# **说怪话【暗讽,14,1】:**==同伴完成工作时==,使该同伴`效率+4 `并发表自己的意见
class Sgh(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=14self.__hp=1self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴完成工作时if changed_attr == "complete_work_num" and (new_value-old_value)==1 and self.__on:#使该同伴效率+4changed_obj.atk+=4#发表锐评print(f"{self.name}对{changed_obj.name}发表了锐评")
帮倒忙
# **帮倒忙【捣乱,-1,5】:**==同伴工作时==,自身进行一次`追加工作`
class Bdm(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=-1self.__hp=5self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴工作时候if changed_attr =="work_num" and (new_value-old_value)==1 and self.__on:#自身进行追加攻击,工作小于0的时候也可以继续追加攻击获得buffself.queue.work.hp-=self.__fixed_atkprint(f"\t{self.name}进行一次追加攻击!")#追加攻击后立刻判断是否完成工作if self.queue.work.hp < 1:self.complete_work_num += 1self.append_work_num+=1
小夸夸
# **小夸夸【鼓励,3,3】:**==同伴工作或追加工作时==,若同伴效率》5使其`效率+2 `
class Xkk(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=3self.__hp=3self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴工作或追加工作时if (changed_attr == "work_num" or changed_attr== "append_work_num") and (new_value-old_value)==1 and self.__on:#如果同伴效率>5,使效率+2if changed_obj.atk>5:#小夸夸监控所有队友的所有属性,因此修改atk也会进入小夸夸的eval但是不会执行任何语句。print(f"\t给{changed_obj.name}加buff,atk+2!")changed_obj.atk+=2
工作狂
# **工作狂【争先 6,10】:**==同伴工作或追加工作时==,进行一次等于自身50%效率的`追加工作`
class Gzk(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=6self.__hp=10self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴工作或追加工作时if (changed_attr == "work_num" or changed_attr== "append_work_num") and (new_value-old_value)==1 and self.__on:#进行一次相当于自身50%效率的追加攻击self.queue.work.hp-=(self.__fixed_atk/2)print(f"\t{self.name}进行一次追加攻击!")if self.queue.work.hp<1:self.complete_work_num+=1self.append_work_num+=1
职业经理
# **职业经理【自我驱动】:**==登场后==:使全体奇美拉`效率+3`,`体力+3`
class Zyjl(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=6self.__hp=10self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=0 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self!=changed_obj):return#同伴工作或追加工作时if changed_attr == "on" and old_value==False and self.__on:#使所有成员效率和体力都+3for i in self.queue.members_list:i.hp+=3i.atk+=3
严酷恶魔
# **严酷恶魔【不准停!】:**奇美拉==完成工作后==,使其`效率+5`
class Ykem(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=6self.__hp=10self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=1 #监控自己以外的所有同伴self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):if(self==changed_obj):return#同伴完成工作后if changed_attr == "complete_work_num" and (new_value-old_value)==1 and self.__on:#使其效率+5changed_obj.atk+=5
职场清流
# **职场清流【抚慰之心】:**==登场后==:全体奇美拉`效率+2`。奇美==拉追加工作==后:使其`效率+1`
class Zcql(ChimerasEntity):__observed_attrs__ = ('atk', 'hp','episode','on','work_num','append_work_num','mode','skill','complete_work_num')def __init__(self, name):super().__init__(name)self.name=nameself.__atk=6self.__hp=10self.__episode=0 #每回合开始都会先增加回合数self.__on=False #是否在场,True为登场,刚开始的时候为Falseself.__work_num=0 #工作次数self.__append_work_num=0 #追加攻击次数self.__mode=2 #监控自己及其所有奇美拉self.__skill=Trueself.__complete_work_num = 0self.__fixed_atk=0@propertydef fixed_atk(self):return self.__fixed_atkdef set_fix_atk(self):self.__fixed_atk=self.__atkdef eval(self, changed_obj, changed_attr, old_value, new_value):#登场后,全体奇美拉效率+2if changed_attr == "on" and old_value==False and changed_obj==self and self.__on:for i in self.queue.members_list:print(f"\t给{i.name}加buff,atk+2!")i.atk+=2#同伴追加攻击后,使其效率+1if changed_attr == "append_work_num" and (new_value-old_value)==1 and changed_obj!=self and self.__on:print(f"\t给{changed_obj.name}加buff,{changed_attr} atk+1!")changed_obj.atk+=1
开始工作吧小奇美拉
我们把工作也定义成一个类,该类中仅有攻击力和生命值属性,同时设置这两个属性的property描述符。我们把所有的工作逻辑都集成在奇美拉队列类中,我们在该类中新增三个方法
- work_once,选定第一个在场并且hp>0的奇美拉,使其进行一次工作
- work_episode,执行一个工作回合,在该函数中处理每回合工作前和工作后的一些信息。例如工作前增加回合数,固定攻击力。工作后判断奇美拉是否应该离场
- begin_work,该方法接受一个工作对象,然后循环调用work_episode直到完成工作或者所有奇美拉都累到了
Task类
class Task():def __init__(self,atk=5,hp=150):self._atk = atkself._hp = hp@propertydef atk(self):return self._atk@atk.setterdef atk(self,value):self._atk=value@propertydef hp(self):return self._hp@hp.setterdef hp(self,value):self._hp=value
begin_work:
class InteractionQueue:"""管理相互观察的队列"""#......此处参见本系列的上一篇博文
def begin_work(self,work):self.work=workprint("开始工作...")#奇美拉登场for i in self.members_list:i.on=Trueself.leader.on=True#1 更新回合数,固定攻击力#2 第一个奇美拉攻击(立即判断工作是否被完成)#3 其他奇美拉发动技能)#4 判断奇美拉是否离场(循环内判断),或者工作是否被完成(循环条件判断)while(work.hp>0):live=self.work_episode()if not live and work.hp>0:print("工作未完成,奇美拉都累坏了~")print("工作已全部完成~")
work_episode
class InteractionQueue:"""管理相互观察的队列"""#......此处参见本系列的上一篇博文
def work_episode(self):self.episode += 1print(f"===开始第{self.episode}回合的工作===")#先处理episode+1的逻辑,这时可能会触发被动,这个被动可能加攻击力for chi in self.members_list:chi.episode+=1#开始工作前的最后时刻固定攻击力for chi in self.members_list:# 固定奇美拉攻击力chi.set_fix_atk()print("\t工作前:")print("\t", end="")for chi in self.members_list:print(f"{chi.name}[atk:{chi.atk},hp:{chi.hp}]", end="")print("\n",end="")print(f"\tWork[atk:{self.work.atk},hp:{self.work.hp}]")# 奇美拉开始工作self.work_once()print("\t请脑部工作画面呀QwQ")# 根据奇美拉的生命值判断是否应该离场,并触发离场被动for chi in self.members_list:if chi.hp<1:chi.on=Falseself.remove_member(chi)#防御性编程if chi.on==False:self.remove_member(chi)print("\t工作后:")print("\t", end="")for chi in self.members_list:print(f"{chi.name}[atk:{chi.atk},hp:{chi.hp}]", end="")print("\n",end="")print(f"\tWork[atk:{self.work.atk},hp:{self.work.hp}]")#如果本回合结束后奇美拉都离场了if len(self.members_list)==0:return Falseelse:return True
work_once
class InteractionQueue:"""管理相互观察的队列"""#......此处参见本系列的上一篇博文
def work_once(self):before_work_hp=self.work.hpwork_chi=Nonefor chi in reversed(self.members_list):if chi.hp>0 and chi.on:work_chi=chibreak#开始工作,这时进触发自己hp降低的被动self.work.hp-=work_chi.atkafter_work_hp=self.work.hp#开始触发技能,自身 体力降低,或同伴累倒后work_chi.hp-=self.work.atk#触发工作时和完成工作时的被动work_chi.work_num+=1if before_work_hp>0 and after_work_hp<1:work_chi.complete_work_num+=1
最后,给出我们非常简单的main函数,完结撒花,★,°:.☆( ̄▽ ̄)/$:.°★ 。🌸🌸🌸
import time
import unittest
from observer import InteractionQueue, Task
from chimeras import *if __name__=="__main__":queue=InteractionQueue()jxf=Jxf("急先锋")queue.add_member(jxf)gzk=Gzk("工作狂")queue.add_member(gzk)bdm=Bdm("帮倒忙")queue.add_member(bdm)xkk=Xkk("小夸夸")queue.add_member(xkk)bgx=Bgx("背锅侠")queue.add_member(bgx)zcql=Zcql("职场清流")queue.add_leader(zcql)work=Task(atk=5,hp=80)queue.begin_work(work)
没想到吧,我还在!(优化)
**不同的奇美拉应该监控特定属性:**回忆一下我们的元类和基类的实现,__observed_attrs__
存放的更像是subject的主题,也就是其他奇美拉关注的属性。那么对于同一个奇美拉,不同的奇美拉可能观察该奇美拉的不同属性,这就需要属性分类。
我们可以把属性进行分类(或者说分级),相应的我们把observer也进行分类(和前面属性的分类是一一对应的)。在属性变化的时候,根据属性的级别,遍历不同的observer集合,调用被动技能和该属性有关的奇美拉的eval方法,而不是调用所有奇美的eval方法。
有序弱引用:我们在queue中保存所有对象的强引用(list保存),此时我们必须手动调用queue的remove函数。如果我们打算在成员的析构函数中调用queue的remove函数就会出现一个奇怪的循环。如果我们忘记调用queue的remove_member函数,我们del成员,但是由于queue中保留着成员的引用,所以不会执行成员的析构函数。由于不会执行析构函数,所以queue中一直保留着成员的引用。解决办法可以采用有序弱引用。
我们需要自己基于weakref来实现一个有序弱引用类。这里给出基于有序字典来实现的思路:我们创建一个key为id(递增,)value为弱引用对象的有序字典。每次我们手动递增id。添加弱引用的时候需要判断该弱引用对象是否已经存在地点内。
相关文章:
游戏开发实战(三):Python复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉类摸鱼仔,负能量,真老实,小坏蛋,压力怪治愈师小团体画饼王平凡王坏脾气抗压包请假狂请假王内卷王受气包跑路侠看乐子背锅侠抢功劳急先锋说怪话帮倒忙小夸夸工作狂职业经理严酷恶魔职场清流 开始工作吧小奇美拉没想…...

使用glsl 来做视频矫正
描述、优点 使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。 优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显 矫正的基本作…...

03-Web后端基础(Maven基础)
1. 初始Maven 1.1 介绍 Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。 Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性…...
LLM驱动下的软件工程再造:驾驭调试、测试与工程化管理的智能新范式
摘要: 大语言模型(LLM)驱动的软件开发正以前所未有的力量重塑整个行业,从以人为中心的编码模式迅速转向意图驱动和AI编排的智能生成。这场变革带来了生产力的指数级飞跃,但也对传统软件工程中调试、测试和代码工程化管理的核心支柱发起了深刻挑战。本文将剖析这些根本性转…...
大语言模型与人工智能:技术演进、生态重构与未来挑战
目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…...
SpringSecurity授权、认证
引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency><groupId>org.springframework.boot</groupId><artifactI…...

蓝桥杯19682 完全背包
问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi,价值为 wi。每件物品可以使用无限次。 请问可以通过什么样的方式选择物品,使得物品总体积不超过 M 的情况下总价值最大,输出这个最大价值即可。 输入格式 第一行…...

DeepSeek源码解构:从MoE架构到MLA的工程化实现
文章目录 **一、代码结构全景:从模型定义到分布式训练****二、MoE架构:动态路由与稀疏激活的工程化实践****1. 专家路由机制(带负载均衡)****数学原理:负载均衡损失推导** **三、MLA注意力机制:低秩压缩与解…...
leetcode 3355. 零数组变换 I 中等
给定一个长度为 n 的整数数组 nums 和一个二维数组 queries,其中 queries[i] [li, ri]。 对于每个查询 queries[i]: 在 nums 的下标范围 [li, ri] 内选择一个下标 子集。将选中的每个下标对应的元素值减 1。 零数组 是指所有元素都等于 0 的数组。 …...

【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理
方面 (Aspect)内容总结 (Content Summary)论文标题NavGPT: 在视觉与语言导航中使用大型语言模型进行显式推理 (NavGPT: Explicit Reasoning in Vision-and-Language Navigation with Large Language Models)核心问题探究大型语言模型 (LLM) 在复杂具身场景(特别是视…...

(T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
一、不小心删除 今天是2025年5月15日,非常沉重的一天,就在今早8点左右的时候我打算继续做我的毕业设计,由于开机的过程十分缓慢(之前没有),加上刚开机电脑有卡死的迹象,再加上昨天晚上关电脑前…...
创建react工程并集成tailwindcss
1. 创建工程 npm create vite admin --template react 2.集成tailwndcss 打开官网跟着操作一下就行。 Installing Tailwind CSS with Vite - Tailwind CSS...

TDengine 安全部署配置建议
背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明,并提供部署和配置建议,为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…...
Axure全链路交互设计:快速提升实现能力(基础交互+高级交互)
想让你的设计稿像真实App一样丝滑?本专栏带你玩转Axure交互,从选中高亮到动态面板骚操作,再到中继器表单花式交互,全程动图教学,一看就会! 本专栏系统讲解多个核心交互效果,是你的Axure交互急救…...
为什么wifi有信号却连接不上?
WiFi有信号,无法连接WiFi网络的可能原因及解决方法: 1.长时间使用路由器,路由器可能会出现假死现象。重启无线路由器即可。 2.认证类型不合适。尝试更改路由器的认证类型,选择安全的 “WPA2-PSK” 类型模式要好,下面…...

蓝桥杯框架-LED蜂鸣器继电器
蓝桥杯框架-LED蜂鸣器继电器 一,新建工程文件二,配置keil三,完善框架 一,新建工程文件 在桌面上新建一个文件夹:用于存放所有工程文件 在文件夹中再建立一个文件夹DEMO_01:这是我们的第一个工程文件 在第…...

uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)
完成了商品的添加和展示,下面的文字将继续进行商品页面的处理,主要为商品信息的修改的页面以及后天逻辑的处理。 本文主要介绍了商品信息修改页面的实现过程。首先,页面布局包括编辑和删除功能,未来还可添加上架和下架按钮。通过c…...

Dify的大语言模型(LLM) AI 应用开发平台-本地部署
前言 今天闲着,捣鼓一下 Dify 这个开源平台,在 mac 系统上,本地部署并运行 Dify 平台,下面记录个人在本地部署Dify 的过程。 Dify是什么? Dify是一个开源的大语言模型(LLM)应用开发平台&#…...

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
以下通过点亮LED进行基本使用流程演示,实际可以连接复杂外设(SPI、CAN、ADC等) 单模块使用 RX、TX、5V和GND接到串口模块;X5接5V;Y2接LED;LED-接GND 串口模块插上电脑后,LED没有亮;因为此时模…...
移动端前端调试调研纪实:从痛点出发,到 WebDebugX 的方案落地
这个月我接到一个内部调研任务:为公司的新一代 Hybrid 框架选型合适的前端调试解决方案。初衷其实很简单——以前的调试方式效率太低,影响开发和测试协同,产品问题总是复现难、修复慢。 于是我花了两周时间,试用了包括 Eruda、Re…...

8 种快速易用的Python Matplotlib数据可视化方法
你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python 的 Matplotlib 库是你数据可视化的最佳伙伴!它简单易用、功能强大,能将枯燥的数字变成引人入胜的图表。无论是学生、数据分析师还是程序员&…...
【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】
1. 背景 本节主要讨论 高通 蓝牙 hal 中,的一些流程。 看看你是否都清楚如下问题: 高通芯片电如何控制?串口是在哪里控制的?固件如何下载?初始化流程是怎么样的? 如果你已经对上述讨论的问题,…...

C# 深入理解类(实例构造函数)
实例构造函数 实例构造函数是一个特殊的方法,它在创建类的每个新实例时执行。 构造函数用于初始化类实例的状态。如果希望能从类的外部创建类的实例,需要将构造函数声明为public。 图7-2阐述了构造函数的语法。除了下面这几点,构造函数看起…...

RabbitMQ——消息确认
一、消息确认机制 生产者发送的消息,可能有以下两种情况: 1> 消息消费成功 2> 消息消费失败 为了保证消息可靠的到达消费者(!!!注意:消息确认机制和前面的工作模式中的publisher confi…...

测试W5500的第2步_使用ioLibrary库创建TCP客户端
ioLibrary库下载地址:文件下载地址:https://gitee.com/wiznet-hk/STM32F10x_W5500_Examples 源文件下载地址:https://gitee.com/wiznet-hk 没有注册的,只能复制粘贴了。 本文介绍了如何初始化STM32的硬件资源,配置W5500的网络参数ÿ…...

深度学习之用CelebA_Spoof数据集搭建一个活体检测-训练好的模型用MNN来推理
一、模型转换准备 首先确保已完成PyTorch到ONNX的转换:深度学习之用CelebA_Spoof数据集搭建活体检测系统:模型验证与测试。这里有将PyTorch到ONNX格式的模型转换。 二、ONNX转MNN 使用MNN转换工具进行格式转换:具体的编译过程可以参考MNN的…...
【Java】泛型在 Java 中是怎样实现的?
先说结论 , Java 的泛型是伪泛型 , 在运行期间不存在泛型的概念 , 泛型在 Java 中是 编译检查 运行强转 实现的 泛型是指 允许在定义类 , 接口和方法时使用的类型参数 , 使得代码可以在不指定具体类型的情况下操作不同的数据类型 , 从而实现类型安全的代码复用 的语言机制 . …...

开源安全大模型Foundation-Sec-8B实操
一、兴奋时刻 此时此刻,晚上22点55分,从今天早上6点左右开始折腾,花费了接近10刀的环境使用费,1天的休息时间,总算是把Foundation-Sec-8B模型跑起来了,中间有两次胜利就在眼前,但却总在远程端口转发环节出问题,让人难受。直到晚上远程Jupyter访问成功那一刻,眉开眼笑,…...

【JavaWeb】MySQL
1 引言 1.1 为什么学? 在学习SpringBootWeb基础知识(IOC、DI等)时,在web开发中,为了应用程序职责单一,方便维护,一般将web应用程序分为三层,即:Controller、Service、Dao 。 之前的案例中&am…...

微信小游戏流量主广告自动化浏览功能案例5
功能需求: 支持APP单行文本框输入1个小程序链接,在“文件传输助手”界面发送小程序链接并进入。 主要有“文章列表首页”和“文章内容”页面。每个页面支持点击弹窗广告、槽位广告、视频广告入口、视频广告内第三方广告。 弹窗广告、槽位广告、视频广…...