游戏开发实战(三):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复刻「崩坏星穹铁道」嗷呜嗷呜事务所---源码级解析该小游戏背后的算法与设计模式【纯原创】
文章目录 奇美拉类摸鱼仔,负能量,真老实,小坏蛋,压力怪治愈师小团体画饼王平凡王坏脾气抗压包请假狂请假王内卷王受气包跑路侠看乐子背锅侠抢功劳急先锋说怪话帮倒忙小夸夸工作狂职业经理严酷恶魔职场清流 开始工作吧小奇美拉没想…...
DeepSpeed简介及加速模型训练
DeepSpeed是由微软开发的开源深度学习优化框架,专注于大规模模型的高效训练与推理。其核心目标是通过系统级优化技术降低显存占用、提升计算效率,并支持千亿级参数的模型训练。 官网链接:deepspeed 训练代码下载:git代码 一、De…...
AIGC降重工具
使用 PyQt5 和 Python-docx 实现AIGC降重工具 在日常工作中,文档处理是一个常见的任务,尤其是对于需要批量处理文档内容的场景。今天,我将分享一个使用 PyQt5 和 Python-docx 库实现的简单文档处理工具。这个工具可以帮助用户选择文档文件&a…...
PYTHON训练营DAY31
项目拆分 src/data/load_data.py # -*- coding: utf-8 -*- import sys import io # 设置标准输出为 UTF-8 编码 sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8) import pandas as pddef load_data(file_path: str) -> pd.DataFrame:"""加…...
使用VGG-16模型来对海贼王中的角色进行图像分类
动漫角色识别是计算机视觉的典型应用场景,可用于周边商品分类、动画制作辅助等。 这个案例是一个经典的深度学习应用,用于图像分类任务,它使用了一个自定义的VGG-16模型来对《海贼王》中的七个角色进行分类,演示如何将经典CNN模型…...
AI-02a5a7.神经网络-与学习相关的技巧-正则化
过拟合 过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。 在机器学习的问题中,过拟合是很常见的问题。 而机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模…...
C# 常用密码加密与解密技术完全指南
目录 密码安全的核心概念 加密 vs 哈希:何时使用? 密钥管理的重要性 常见攻击手段(中间人攻击、彩虹表) 基础加密技术 对称加密(AES) 非对称加密(RSA) 哈希算法(SH…...
C++ QT 与 win32 窗口可以互操作
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->setWindowTitle("天下第一剑"); // HWND hwnd FindWindow(L"天下第一剑",L"天下第一剑"); // qDebug()<<…...
MySQL--day4--排序与分页
(以下内容全部来自上述课程) 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …...
文件操作和IO—初识文件
认识文件 狭义上的文件(file),是针对硬盘这种持久化存储的IO设备,当我们想要进行数据保存的时候,往往不是保存成一个整体,而是独立成一个个的单位进行保存,这个独立的单位就被抽象成文件的概念…...
P2670 [NOIP 2015 普及组] 扫雷游戏
P2670 [NOIP 2015 普及组] 扫雷游戏 - 洛谷 #include<bits/stdc.h> using namespace std; int n,m; char a[105][105]; int main(){cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j){cin>>a[i][j];}}for(int i1;i<n;i){for(int j1;j<m;j){…...
HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)
1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网(State Grid Corporation of China,简称 SGCC)的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用,用户可以实时追踪家庭用电量情况&…...
02 基本介绍及Pod基础排错
01 yaml文件里的字段错误 # 多打了一个i导致的报错 [rootmaster01 yaml]# cat 01-pod.yaml apiVersion: v1 kind: Pod metadata:name: likexy spec:contaiiners:- name: aaaimage: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 [rootmaster01 yaml]# kubectl …...
9 定时任务与周期性调度
一、定时任务核心机制 1.1 基础调度配置 # celery.py from celery import Celery from celery.schedules import crontabapp Celery(proj) app.conf.beat_schedule {daily-report: {task: report.generate,schedule: crontab(hour3, minute30), # 每天3:30执行args: (),op…...
macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight
macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight 对比分析四款常见 macOS 高效工具,涵盖功能、插件生态、开发者支持、适用人群等维度,帮助你选择最适合自己的效率助手。 🔍 一、基本介绍 工具名简介SpotlightmacOS …...
接口测试速成指南:基础知识+工具使用全解析
你是否也有这样的经历:项目初期接口文档混乱,测试人员无从下手;开发说接口OK,测试却频繁遇坑?别怕,接口测试并没你想得那么难! “接口测试怎么做?用什么工具?”面试官一…...
SpringSecurity基础入门
一个身份认证、授权、防御常见攻击的框架。 spring security 中文网:Spring Security中文网 自定义配置 基于内存的用户认证 实现步骤如下: 在配置类中创建security的配置类: Configuration //声明当前类为配置类 EnableWebSecurity //…...
MySQL的安装及相关操作
目录 一. 数据库产生的背景 二. 数据库操作系统的组成 2.1 数据库(Database) 2.2 数据库管理系统(DBMS, Database Management System) 2.3 应用程序(Application) 三. 数据库的分类 3.1 关系数据库 3.2 非关系数据库 四. MySQL安装 4.1yum安装 1. Ubuntu 2. cent…...
【Code】Foundations 2017- Catalogue, List of Tables, List of Figures
Foundations 2017 目录 | Catalogue表格目录 | List of Tables图表目录 | List of Figures 目录 | Catalogue 英文原文中文翻译词汇学习(音标和解释)1. General1. 总则1.1 Scope1.1 范围1.2 Glossary1.2 术语表Glossary [ˈɡlɒsəri] 术语表ÿ…...
【TCGA-CRC】TCGA数据读取
写在前面 参考已有的帖子写的,但是临床数据和UCSC的不同。有知道的小伙伴欢迎指正。 rm(list ls()); gc() test1 data.table::fread("./00_Rawdata/GDCdata/TCGA-COAD/Transcriptome_Profiling/Gene_Expression_Quantification/00ae9ab8-6eaa-4085-af72-26…...
BYUCTF 2025
几周没会的比赛了,都是一题游。这周的BYU还不错,难度适中,只是时间有点短。周末时间不够。 Crypto Many Primes from Crypto.Util.number import bytes_to_long, getPrime import randomflag open("flag.txt").read().encode()…...
【Linux】初见,基础指令(续)
前言: 上文讲解了部分指令,本文我们来讲解剩下的指令【Linux】初见,基础指令-CSDN博客 cat指令 语法:cat 选项 文件 功能:打印文件中的内容 选项: -b 对非空行输出进行编号 -n 对输出的说有行进行编号…...
《MambaLLIE:基于隐式Retinex感知的低光照增强框架与全局-局部状态空间建模》学习笔记
Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目录 摘要 一、介绍 二、相关工作 2.1 低光图像增强 2.2 视觉空间状态模型 三、方法 3.1 预备知识 3.2 整体流程 3.3 全局优先-局部次之状态空间块 四、实验 4.1 基准数据集与实施细节 4.2 对比实验 4…...
计算机图形学Games101笔记--几何
第二部分:几何 几何介绍 光栅化解决如何渲染,几何研究模型如何存储在GPU的内存中。几何主要分为两种:隐式几何和显式几何。 **隐士几何:**用点之间的关系存储,如球的计算公式。更一般的可以用f(x,y,z)。我们可以令f…...
Web开发-Python应用Flask框架Jinja模版绑定路由参数传递页面解析SSTI注入
知识点: 1、安全开发-Python-Flask&Jinja2 2、安全开发-Python-路由传参&SSTI注入 演示案例-WEB开发-Python-Flask框架&Jinja2模版&路由传参&SSTI注入 0、Pycharm 配置Python解析 新建Flask项目 1、路由传参 app.route(/) app.route(/<id…...
聚焦开放智能,抢占技术高地 | 2025 高通边缘智能创新应用大赛第五场公开课来袭!
随着2025高通边缘智能创新应用大赛的推进,越来越多的参赛者关注如何借助高性能硬件突破技术瓶颈、打造差异化作品。 5月27日晚8点,大赛将开启初赛阶段的第五场专题公开课——由美格软件研究院院长李书杰领衔,深入解析高通平台的底层架构与参…...
NMOS和PMOS的区别
1 区分NMOS和PMOS:衬底箭头指向G级的是NMOS,衬底箭头背向G级的是PMOS 2 区分D和S级:针对NMOS,体二极管的正方向为S级;针对PMOS,体二极管正的方向为D级 3 区分电流方向:针对NMOS,电…...
Paillier加密方案的原理、实现与应用(vs)
一、实验目的 1、掌握NTL的基本配置和方法(以下是以visualstudio为例) 2、掌握Paillier加密方案的原理与实现 ①钥匙生成:首先,生成一把钥匙,包括钥匙和私钥匙。钥匙由两个大素数(p,q)的乘积n和一个整数g组成&#…...
Metal入门,使用Metal绘制3D图形
这次是使用Metal绘制一个立方体,并且添加旋转效果,绘制正方形的步骤很简单,我们绘制一个正方形就相当于绘制两个三角形,那么绘制一个正方体,我们很容易想到需要绘制他六个面,很显然,我们也需要把…...
Java 04 API
API 简介 一些已经写好的应用程序编程接口Object toString 默认返回的是当前对象在堆内存中的地址值信息:类的全类名十六进制哈希值返回该对象的返回值 class A{ } //返回的是地址哦 String sA.toString(); //细节:使用打印语句,打印对象…...
基于Gitee 的开发分支版本管理规范
一、版本管理规范概述 目的:规范代码分支管理和版本发布流程,提高团队协作效率,确保代码质量和版本可追溯性。适用范围:基于 Gitee 平台开发的所有项目。分支策略:采用 Git Flow 模型的变体,主要分支包括 …...
HOW - 结合 AI 进行 Tailwind 样式开发
文章目录 情况 1:使用 Tailwind CSS 与手写传统 CSS 的开发效率对比情况 2:AI Tailwind 自动生成 UI 的效率如何?总结 在 WHAT - Tailwind 样式方案(不写任何自定义样式) 中我们已经简单介绍过 Tailwind。今天主要认识…...
系统数据对接-从获取到处理的全流程
在后端架构的复杂生态中,子系统间或与外部系统的对接是常态,其核心要义在于实现数据的精准传输。本文聚焦于数据传输后的运算逻辑与异常处理机制,旨在为后端开发者提供深度见解。 一、数据获取机制:触发式与定时任务的权衡 &…...
Java 09Stream流与File类
Stream流与File类 Stream流 简化集合和数组的操作,startWith(“张”) 第一个为这个返回true String1.获取Stream对象 单列集合 双列集合 先获得键值对 在遍历数组 零散的数据 Stream<Integer> arrStream.of(1,2,34,3); stream.forEach(sss); 即可2.中间…...
《光与影:33号远征队》栩栩如生的角色动画是如何创建的?
《光与影:33号远征队》是一款由Sandfall Interactive公司开发的回合制RPG游戏,背景是一个黑暗的幻想世界。游戏因其独特的艺术风格和引人注目的叙事赢得了无数赞誉,成为今年大热游戏中的一匹黑马。 在该游戏制作中Sandfall依靠包括Xsens在内的…...
GESP2024年12月认证C++二级( 第三部分编程题(1)寻找数字)
参考程序(枚举): #include <iostream> //#include <cmath> using namespace std;int main() {int t;cin >> t;while (t--) {long long a;cin >> a;bool found false;// 枚举 b for (long long b 1; b * b * b * b…...
《探索具身智能机器人视觉-运动映射模型的创新训练路径》
视觉 - 运动映射模型作为实现智能交互与精准行动的核心,吸引着全球科研人员与技术爱好者的目光。这一模型就像机器人的 “神经中枢”,连接着视觉感知与肢体运动,使机器人能够在复杂的现实环境中灵活应对各种任务。 传统的视觉 - 运动映射模型…...
Python打卡DAY31
今日的示例代码包含2个部分 notebook文件夹内的ipynb文件,介绍下今天的思路项目文件夹中其他部分:拆分后的信贷项目,学习下如何拆分的,未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文件命名规范的文件夹管理机器学…...
【SPIN】PROMELA远程引用与控制流验证(SPIN学习系列--5)
PROMELA语言提供了两种强大的机制用于验证并发系统:远程引用(remote references)和进程变量引用。这些机制使得在不引入额外状态变量的情况下,能够精确描述系统状态和属性。 远程引用(Remote References) 远程引用允许你直接引用进程中的控制位置(labe…...
GMSL:汽车里的音视频传输
参考链接: blog.csdn.net/weixin_50875614/article/details/119995651 blog.csdn.net/syjie19900426/article/details/145269782 SerDes 应用场景 WHAT GMSL是什么 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司推出的一种…...
Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程
在前面有多篇关于jdk1.8的ConcurrentHashMap研究是基于源代码给出的深度分析,要知道多线程环境下的ConcurrentHashMap内部运行机制是相对复杂的,好在IDEA提供的相关断点和Debug功能确实好用,使得多线程调试起来直观,通过这种方式能…...
【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
fdisk和parted的区别
在Linux系统中,fdisk和parted是两种常用的分区工具。虽然它们都可以对硬盘进行分区,但在功能和适用范围上有显著的区别。 fdisk fdisk主要用于MBR(主引导记录)分区表的管理。MBR分区表有以下特点: 支持小于2TB的硬盘…...
springMVC拦截器,拦截器拦截策略设置
目录 1、MyInterceptor1 2、UserController 3、MvcConfig,拦截器4种拦截方法策略 做请求的校验,如果校验没有通过,直接返回,原来下面的处理,就不用处理了 将request进行拦截校验 将response进行拦截校验 preHandle…...
如何测试北斗卫星通讯终端的性能?
测试北斗卫星通讯终端的性能需从功能、性能、环境适应性、可靠性等多维度展开,以下是具体测试内容与方法: 一、基础功能测试 验证终端是否满足北斗系统的核心通讯功能。 (1)通信模式测试 短报文通信 测试终端发送 / 接收短报…...
基于MakeReal3D的虚拟预装系统:飞机装配效率与精度的双重突破
在航空制造领域,飞机部件的对接装配是飞机制造过程中的关键环节。传统的部件装配方式高度依赖操作人员的经验和反复调整,调姿过程耗时较长,且难以保证每次装配都能达到最优状态。随着虚拟现实技术的成熟,虚拟装配技术作为一种新兴…...
IP54是什么?
IP54是什么 定义 IP54是一种国际标准,用来指示设备的防护等级,该标准由国际电工委员会(IEC)制定,并在许多领域广泛使用13。IP是Ingress Protection的缩写,IP等级是针对电气设备外壳对异物侵入的防护等级。…...
Python异步编程详解
Python异步编程详解 引言 异步编程是Python中处理并发操作的重要方式,它允许程序在等待I/O操作时执行其他任务,从而提高程序的整体效率。本文将详细介绍Python异步编程的概念、实现方式以及实际应用场景。 1. 异步编程基础 1.1 什么是异步编程&#x…...
AUC与Accuracy的区别
下面分别解释下这两句话的含义及其原因,并说明 AUC 与 Accuracy(准确率)的区别: AUC 是阈值无关的指标 • 含义:在二分类问题中,模型通常会输出一个概率值或打分,需要设定一个阈值来将这些概…...
差分数组:原理与应用
一、什么是差分数组 差分数组是一种高效处理区间更新操作的数据结构技巧,特别适用于需要对数组的某个区间进行频繁增减操作的场景。差分数组的核心思想是通过存储相邻元素的差值而非元素本身,将区间操作转化为端点操作,从而将时间复杂度从O(…...