使用更少的 if 语句
Using fewer if statements
我正在尝试为 Discord 的 One Night Ultimate Werewolf 游戏编写代码。我已经想出了第一步,选择卡片,并通过直接消息发送角色。下一步,是通过 DM 创建命令,例如“!seer”,让 seer 执行她的操作。问题是:我不知道如何让机器人检查消息作者是否真的是先知。我正在考虑执行以下操作:变量 dargon
、ven
、rocky
等是玩家名称,其中存储了玩家 ID。 dargon_c
、ven_c
、rocky_c
等变量分配了玩家的狼人牌。
try:
global dargon_c, ven_c, nastith_c, rocky_c, petra_c, center_c, left_center_c, right_center_c
target = await bot.fetch_user(dargon)
await target.send('Your card is: ' + cards[0])
dargon_c = cards[0]
target = await bot.fetch_user(ven)
await target.send('Your card is: ' + cards[1])
ven_c = cards[1]
target = await bot.fetch_user(nastith)
await target.send('Your card is: ' + cards[2])
nastith_c = cards[2]
target = await bot.fetch_user(rocky)
await target.send('Your card is: ' + cards[3])
rocky_c = cards[3]
target = await bot.fetch_user(petra)
await target.send('Your card is: ' + cards[4])
petra_c = cards[4]
center_c = cards[5]
left_center_c = cards[6]
right_center_c = cards[7]
except:
ctx.channel.send("Some users didn't recieve their cards")
dargon_c = 'Seer'
@bot.command()
async def seer(ctx):
global see
if ctx.author.id == dargon and dargon_c == 'Seer':
ctx.channel.send('Card')
if ctx.author.id == ven and ven_c == 'Seer':
see = ctx.content[3:]
ctx.channel.send('Card')
有什么方法可以做到这一点而无需为每个命令执行 100 if
个块?
尝试使用列表。格式如下所示:
记住列表索引从 0 开始,然后向上。
因此,如果列表是 ["hello", "world]
,则 [0] 是你好,[1] 是世界。
myCards = [
["dargon", 0],
["ven",1]
]
for i in myCards:
target = await bot.fetch_user(i[0])
await target.send('Your card is: ' + cards[1])
或者甚至更好,将所有这些内容放在一个 json 文件中,让机器人从中读取。
{
"dargon_c": { "name": "dargon", "index": 0},
"ven_c": { "name": "ven", "index": 1},
}
json.load(open('path/to/file.json', 'r'))["dargon_c"]["name"] # "dargon"
我正在尝试为 Discord 的 One Night Ultimate Werewolf 游戏编写代码。我已经想出了第一步,选择卡片,并通过直接消息发送角色。下一步,是通过 DM 创建命令,例如“!seer”,让 seer 执行她的操作。问题是:我不知道如何让机器人检查消息作者是否真的是先知。我正在考虑执行以下操作:变量 dargon
、ven
、rocky
等是玩家名称,其中存储了玩家 ID。 dargon_c
、ven_c
、rocky_c
等变量分配了玩家的狼人牌。
try:
global dargon_c, ven_c, nastith_c, rocky_c, petra_c, center_c, left_center_c, right_center_c
target = await bot.fetch_user(dargon)
await target.send('Your card is: ' + cards[0])
dargon_c = cards[0]
target = await bot.fetch_user(ven)
await target.send('Your card is: ' + cards[1])
ven_c = cards[1]
target = await bot.fetch_user(nastith)
await target.send('Your card is: ' + cards[2])
nastith_c = cards[2]
target = await bot.fetch_user(rocky)
await target.send('Your card is: ' + cards[3])
rocky_c = cards[3]
target = await bot.fetch_user(petra)
await target.send('Your card is: ' + cards[4])
petra_c = cards[4]
center_c = cards[5]
left_center_c = cards[6]
right_center_c = cards[7]
except:
ctx.channel.send("Some users didn't recieve their cards")
dargon_c = 'Seer'
@bot.command()
async def seer(ctx):
global see
if ctx.author.id == dargon and dargon_c == 'Seer':
ctx.channel.send('Card')
if ctx.author.id == ven and ven_c == 'Seer':
see = ctx.content[3:]
ctx.channel.send('Card')
有什么方法可以做到这一点而无需为每个命令执行 100 if
个块?
尝试使用列表。格式如下所示:
记住列表索引从 0 开始,然后向上。
因此,如果列表是 ["hello", "world]
,则 [0] 是你好,[1] 是世界。
myCards = [
["dargon", 0],
["ven",1]
]
for i in myCards:
target = await bot.fetch_user(i[0])
await target.send('Your card is: ' + cards[1])
或者甚至更好,将所有这些内容放在一个 json 文件中,让机器人从中读取。
{
"dargon_c": { "name": "dargon", "index": 0},
"ven_c": { "name": "ven", "index": 1},
}
json.load(open('path/to/file.json', 'r'))["dargon_c"]["name"] # "dargon"