#python #python-3.x #discord.py
#python #python-3.x #discord.py
Вопрос:
У меня есть несколько условий для этой игры, если пользователь достигает определенной суммы денег, то тем больше денег они крадут, если другой пользователь находится на их уровне.
У меня возникла проблема при попытке разобраться в логике. Я добавил комментарии с вопросами, но я просто не знаю, есть ли более простой способ подойти к такого рода вещам.
Начинать ли мне с меньшего значения при запуске своих операторов if или мне следует начинать с больших значений?
# do I need to put a check and money(message.author) < 500000 here?
if money(message.author) >= 20000 and money(user) < 20000:
do_thing1()
# do I need to put a check and money(user) < 500000 here?
elif money(message.author) < 20000 and money(user) >= 20000:
do_thing1()
# do I need to put a check money(message.author) and money(user) < 500000 here?
elif money(message.author) >= 20000 and money(user) >= 20000:
do_thing2()
# do I need to put a check and money(user) >= 20000 here?
elif money(message.author) >= 500000 and money(user) < 500000:
do_thing2()
# do I need to put a check and money(message.author) >= 20000 here?
elif money(message.author) < 500000 and money(user) >= 500000:
do_thing2()
elif money(message.author) >= 500000 and money (user) >= 500000:
do_thing3()
Комментарии:
1. Рассматривая это более внимательно, я не думаю, что я описал все в своем ответе ниже. Какие именно случаи вы хотите обработать?
Ответ №1:
Обратите внимание, что вы не показываете, что произойдет, если у обоих будет меньше 20000, или если у обоих будет больше 20000, но меньше 500000. Я покажу, где они обрабатываются ниже.
if money(message.author) < 20000 and money(user) < 20000:
do_thing0() # both have < 20000. You didn't show this case.
elif money(message.author) < 20000 or money(user) < 20000:
do_thing1() # only one of them has < 20000
elif money(message.author) < 500000 and money(user) < 500000:
do_thingX() # both have >= 20000 but < 500000. You didn't show this case.
elif money(message.author) < 500000 or money(user) < 500000:
do_thing2() # both have >= 20000, only one of them has < 5000000
else:
do_thing3() # both have >= 500000
Если вас не волнуют случаи, когда у обоих есть < 20000
или у обоих есть >= 20000 and < 500000
, то вы можете сократить это с помощью эксклюзивных редакторов:
elif money(message.author) < 20000 ^ money(user) < 20000:
do_thing1() # only one of them has < 20000
elif money(message.author) < 500000 ^ money(user) < 500000:
do_thing2() # both have >= 20000, only one of them has < 5000000
elif money(message.author) >= 500000 and money(user) >= 50000
do_thing3() # both have >= 500000
Обратите внимание, что в последнем случае нам нужно быть явными, иначе мы поймаем все, что не было обнаружено в наших первых двух случаях, и здесь я предполагаю, что вы не хотите ловить случай, когда у обоих, например, меньше 20000.
Ваш код выполняется последовательно, поэтому, если вы пройдете одну из проверок, это расскажет вам кое-что о диапазоне, в котором вы находитесь, и вы сможете соответствующим образом настроить свою логику.
Например, как только вы выполнили elif money(message.author) < 500000 and ...
проверку, вы знаете, что оба money(message.author) >= 20000
и money(user) >= 20000
потому что вы бы не зашли так далеко, если бы это было не так.
Комментарии:
1. Вау, я думаю, я просто слишком много думал об этом! Большое спасибо за быстрый ответ, я попробую это. Мой вопрос в том,
money(message.author) > 20000 and money(user) < 20000
будет ли он все еще вызыватьelif money(message.author) < 20000 or money(user) < 20000:
?2. Не следует ли в случае do_thing1 использовать xor
^
вместоor
?3. Я не думаю, что я уловил все в своем первоначальном сообщении. Я обновил его и добавил комментарии, показывающие, что улавливает каждый случай. Я надеюсь, что это поможет.
4. Ах, я только что заметил использование
or
в вашем ответе. Это устраняет необходимость в двух дополнительных проверках>= and <
и< and >=
. Очень хорошее и подробное объяснение. Еще раз спасибо!
Ответ №2:
# Do I need to put a check and money(message.author) < 500000 here?
Да, вы делаете, в противном случае некоторые из ваших случаев будут включать другие, например, если money(message.author) == 500001
и money(user) == 1
, вы, вероятно, хотите, чтобы dothing2
произошло, но вместо этого это сработает dothing1
.
Вы могли бы использовать цепочку сравнения для них, например, вместо
if money(message.author) >= 20000 and money(message.author) < 500000 and money(user) < 20000:
dothing1
вы могли бы использовать гораздо более короткий
if 20000 <= money(message.author) < 500000 and money(user) < 20000:
dothing1
Кроме того, определение двух временных переменных ma = money(message.author)
и mu = money(user)
может значительно улучшить читаемость. Учитывая большое количество операторов if
и elif
, вы могли бы даже определить ma1 = ma < 20000
, ma2 = 20000 <= ma < 500000
и т.д., Но это может быть излишним. Вы также могли бы определить переменные low = 20000
и high = 500000
, предотвращая опечатки (это четыре нуля или пять?) и упрощая изменение этого в будущем.
if low <= ma < high and mu < low:
do_thing1()
elif ma < low and low <= mu < high:
do_thing1()
elif low <= ma and low <= mu:
do_thing2()
elif high <= ma and mu < high:
do_thing2()
elif ma < high and high <= mu:
do_thing2()
elif high <= ma and high <= mu:
do_thing3()
Комментарии:
1. Вау, этот ответ тоже хорош. Основная цель — это не сумма
user message.author
денег, а проверить, есть ли у них обоих определенная сумма в файле JSON, тогда он возьмет деньги изuser
и добавит их вmessage.author
. Код довольно длинный, поэтому я попытался немного упростить свой вопрос. Если они оба достигают определенной суммы денег, украденная сумма увеличивается (с помощью объявленной переменной, когда она добавляется в файл json), но если один человек находится на этом определенном уровне, а другой нет, я хочу, чтобы он принимал только меньшую сумму.