Bài viết phổ biến của tác giả
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我主要是一名 C++ 开发人员,但我经常编写 Python 脚本。我目前正在为游戏编写骰子模拟器,但我不确定在 Python 中解决我的问题的最佳方法。
一共有三种玩家技能,每个玩家一强、中一、弱一。我编写了一些类来计算每个玩家技能的骰子面。
这些技能存在于一个枚举中,而不是到处写字符串。不过,技能也有机会“翻倍”,变得更强。
鉴于我正在返回一个技能枚举元素列表,指示技能翻倍的最佳方法是什么?
到目前为止我考虑过的事情:
nhập khẩu ngẫu nhiên
from abc import ABC, abstractmethod
from enum import Enum
from collections import namedtuple
class Skill(Enum):
Might = 1,
Wisdom = 2,
Cunning = 3
class Die(ABC):
@abstractmethod
def _faces(self):
'''Returns the faces of this die'''
vượt qua
def roll(self):
'''Returns a random face'''
return random.choice(self._faces())
PlayerSkills = namedtuple("PlayerSkills", ("strong", "medium", "weak"))
class PlayerDie(Die):
@abstractmethod
def _skills(self):
'''Returns the characer's skills'''
vượt qua
def _faces(self):
'''Work out the faces of the die based off the skills'''
skills = self._skills()
#I want this to return a representation of the skill, not a string.
#But then I'd be mixing Enums and not-Enums
return [
self._double(skills.strong),
self._double(skills.medium),
skills.strong.name,
skills.strong.name,
skills.medium.name,
skills.weak.name
]
def _double(self, skill):
return f"Double {skill.name} (block)"
class CookDie(PlayerDie):
def _skills(self):
return PlayerSkills(Skill.Might, Skill.Cunning, Skill.Wisdom)
print(CookDie().roll())
1 Câu trả lời
一种可能的方法是使您的枚举成为 Flag
反而:
from enum import Flag, auto
class Skill(Flag):
Might = auto()
Wisdom = auto()
Cunning = auto()
Doubled = auto()
>>> for i in (1, 2, 4, 9, 10, 12):
... i, Skill(i)
(1, )
(2, )
(4, )
(9, )
(10, )
(12, )
str()
(或一个联合成员(member)),您可以添加自己的
__str__
:
class Skill(Flag):
Might = auto()
Wisdom = auto()
Cunning = auto()
Doubled = auto()
#
def __str__(self):
cls = self.__class__
cls_name = cls.__name__
doubled = (self & cls.Doubled or "") and " x2"
base = (self & ~cls.Doubled) or self
name = base.name
if name is None:
name = '|'.join(s.name for s in Skill if s & base)
return "%s.%s%s" % (cls_name, name, doubled)
for i in (1, 2, 4, 9, 10, 12):
i, str(Skill(i))
(1, 'Skill.Might')
(2, 'Skill.Wisdom')
(4, 'Skill.Cunning')
(9, 'Skill.Might x2')
(10, 'Skill.Wisdom x2')
(12, 'Skill.Cunning x2')
关于python - 表示 "doubled"枚举值的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60786460/
Tôi là một lập trình viên xuất sắc, rất giỏi!