改进战斗循环以避免不必要的重复提升代码可读性

为了优化战斗循环以避免不必要的重复,并提升代码的可读性,通常需要关注以下几个方面:

提取重复代码到函数中:将重复执行的代码块提取为函数,可以简化主逻辑并提高可读性和可维护性。

简化逻辑分支:避免嵌套的 if-else 语句,使用简洁的逻辑表达。

确保状态可读和明确:用清晰的变量名和注释来说明每个状态,确保代码更易于理解。

我们可以通过一个简单的战斗循环示例来演示这些原则。假设我们有一个玩家与敌人进行回合制战斗的游戏。

1、问题背景

在给定的代码中,玩家可以为两个角色创建一个战斗游戏。游戏包括两个角色: Charone 和 Chartwo,都有力量和技能属性。玩家可以为每个属性输入值,然后游戏将计算他们的修改器,根据角色的差异,然后他们将掷骰子来确定谁赢得了回合。战斗循环将继续进行,直到其中一个角色的强度属性达到0,此时该角色死亡,游戏结束。

然而,在给定的代码中,存在重复代码,导致可读性差,维护困难。代码中,骰子滚动功能运行两次,这似乎是不必要的。此外,还有许多全局变量,导致代码难以阅读和理解。

2、解决方案

为了解决代码中的问题,改进战斗循环,使其变得更简洁和易读,具体改进措施包括:

消除重复代码:

将骰子滚动功能合并到一个函数中,只在代码中调用一次。

使用字典来存储角色的力量和技能信息,以便更轻松地访问和更新这些信息。

使用循环来迭代戰鬥回合,从而簡化 кода。

消除全局变量:

将所有全局变量移动到一个单独的类中,以便更轻松地管理和访问这些变量。

下面是改进后的代码:

importrandom

importtime

importmath

importsys

classFighter:

def__init__(self,name,strength,skill):

self.name=name

self.strength=strength

self.skill=skill

defis_alive(self):

returnself.strength>0

defhealth_mod(self,other_fighter):

delta=abs(self.strength-other_fighter.strength)

returnint(delta/5)

defskill_mod(self,other_fighter):

delta=abs(self.skill-other_fighter.skill)

returnint(delta/5)

defattack(self,other_fighter):

# wait_for_enter("Hit Enter to fight!")

# figure out mod values

health_mod=self.health_mod(other_fighter)

skill_mod=self.skill_mod(other_fighter)

self_roll=roll()

other_roll=roll()

# slow_print(

#     "Health mod: {}   Skill mod: {}   {} rolls {}   {} rolls {}"

#     .format(

#         health_mod, skill_mod,

#         self.name,  self_roll,

#         other_fighter.name, other_roll

#     )

# )

# figure out who won this round

ifself_roll==other_roll:

print("Draw! No damage done.")

else:

winner,loser=(self,other_fighter)ifself_roll>other_rollelse(other_fighter,self)

print("{} hits {}!".format(winner.name,loser.name))

winner.strength+=health_mod

winner.skill+=skill_mod

loser.strength-=health_mod

loser.skill-=skill_mod

# show results

print('')

print(self)

print(other_fighter)

print('')

def__str__(self):

return"{}: strength {}, skill {}".format(self.name,max(self.strength,0),max(self.skill,0))

defroll(die_sides=6):

returnrandom.randint(1,die_sides)

deffight():

charone=Fighter("Charone",60,70)

chartwo=Fighter("Chartwo",65,75)

print("\n{} encounters {}\nBattle Initiated!".format(charone.name,chartwo.name))

whilecharone.is_alive()andchartwo.is_alive():

charone.attack(chartwo)

chartwo.attack(charone)

winner,loser=(charone,chartwo)ifcharone.is_alive()else(chartwo,charone)

print("{} has died; {} wins!".format(loser.name,winner.name))

defmain():

whileTrue:

fight()

ifnotget_tf("Would you like to play again? (Y/n)"):

print("Goodbye!")

break

if__name__=="__main__":

main()

注释:

在循环中使用 pause 来添加延迟,以便用户可以看到正在发生的事情。

使用 slow_print 将骰子掷骰的结果缓慢地打印出来,以便更具戏剧性。

使用 wait_for_enter 函数来等待用户按回车键,这样他们才能在每个回合中继续前进。

将 charone_strength 和 chartwo_strength 变量初始化为 60 和 65,并将 charone_skill 和 chartwo_skill 变量初始化为 70 和 75。

在 battle 函数中,使用 charone 和 chartwo 对象来跟踪每个角色的属性,而不是使用全局变量。

代码示例:

roll 函数:

defroll(die_sides=6):

returnrandom.randint(1,die_sides)

Fighter 类:

classFighter:

def__init__(self,name,strength,skill):

self.name=name

self.strength=strength

self.skill=skill

defis_alive(self):

returnself.strength>0

defhealth_mod(self,other_fighter):

delta=abs(self.strength-other_fighter.strength)

returnint(delta/5)

defskill_mod(self,other_fighter):

delta=abs(self.skill-other_fighter.skill)

returnint(delta/5)

defattack(self,other_fighter):

# wait_for_enter("Hit Enter to fight!")

# figure out mod values

health_mod=self.health_mod(other_fighter)

skill_mod=self.skill_mod(other_fighter)

self_roll=roll()

other_roll=roll()

print(

"Health mod: {}   Skill mod: {}   {} rolls {}   {} rolls {}"

.format(

health_mod,skill_mod,

self.name,self_roll,

other_fighter.name,other_roll

           )

       )

# figure out who won this round

ifself_roll==other_roll:

print("Draw! No damage done.")

else:

winner,loser=(self,other_fighter)ifself_roll>other_rollelse(other_fighter,self)

print("{} hits {}!".format(winner.name,loser.name))

winner.strength+=health_mod

winner.skill+=skill_mod

loser.strength-=health_mod

loser.skill-=skill_mod

# show results

print('')

print(self)

print(other_fighter)

print('')

def__str__(self):

return"{}: strength {}, skill {}".format(self.name,max(self.strength,0),max(self.skill,0))

battle 函数:

defbattle(charone,chartwo):

globalcharone_strength

globalcharone_skill

globalchartwo_strength

globalchartwo_skill

ifplayer1==player2:

print("\nThis round is a draw! No damage done")

elifplayer1>player2:

charone_strength=charone_str+str_mod

charone_skill=charone_skl+skl_mod

chartwo_strength=chartwo_skl-str_mod

chartwo_skill=chartwo_skl-skl_mod

print"\n"+charone+" won this round"

print"\n"+"Character 1:",charone

print"Strength:",charone_strength

print"Skill:",charone_skill

time.sleep(1)

print"\nCharacter 2:",chartwo

print"Strength:",chartwo_strength

print"Skill:",chartwo_skill

elifplayer2>player1:

chartwo_strength=chartwo_str+str_mod

chartwo_skill=chartwo_skl+skl_mod

charone_strength=charone_str-str_mod

charone_skill=charone_skl-skl_mod

print"\n"+chartwo+" won this round"

print"\nCharacter 2:",chartwo

print"Strength

改进后的战斗循环具有以下优势:

消除重复代码:通过提取攻击逻辑到函数中,减少了冗余代码。

代码清晰、模块化:每个函数只做一件事情,使得代码更加易于理解和维护。

增强可扩展性:未来可以更容易地添加新功能和调整现有逻辑。

这种编写方式使代码更具可读性和灵活性,是对复杂战斗系统的一个良好开端。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容