#python #math #pygame
#python #математика #pygame
Вопрос:
У меня возникли некоторые проблемы в моем приложении pygame, которое я создаю. В меню есть кнопки, которые изменяют скорость выполнения моей симуляции (путем изменения speed
в clock.tick(speed*10)
). Это, однако, также замедляет скорость реагирования кнопок меню. Если я установлю в игре значение speed
в любом месте ниже 0,5, кнопкам speed и play / pause потребуется до пяти секунд, чтобы зарегистрировать щелчок. Итак, я попытался создать свой собственный способ обойти это:
speed = 1 # defined previously ingame
timeSlow = 0
timeSlowGoal = 0
while True: # game loop
if speed < 1:
timeSlowGoal = reciprocal(speed) # well here's my problem
else:
timeSlowGoal = -1
if timeSlowGoal != -1:
if timeSlow >= timeSlowGoal:
timeSlow = 0
# more code that actually does stuff
else:
timeSlow = 1
# doesn't match, try again
В Python для изменения переменной есть такие приемы, как int()
, string()
и float()
. Конечно, reciprocal()
не работает. Существует ли какая-нибудь функция, подобная этой, которая получает значение, обратное числу (которое в данном случае всегда является десятичным), или мне нужно просто выполнить некоторую причудливую математику, чтобы получить это?
(конечно, если все это не нужно и у вас есть лучшее решение моей первой проблемы, дайте мне знать)
РЕДАКТИРОВАТЬ: Хорошо, есть очень простое решение для этого, которое я упустил из виду. 1 / n всегда равно n. Нет необходимости в функции reciprocal(), потому что это так просто. Это то, что я получаю за то, что забываю математику в начальной школе.
Комментарии:
1. Под обратной величиной вы подразумеваете 1 / n?
2. @jatinderjit Да, это значение, обратное n, если n — целое число. Это просто. Что мне нужно, так это способ получить 2 из 1/2, 4 из 1/4 и т.д.
3. Нет, 1 / n всегда является обратной величиной (независимо от того, является ли n целым числом или даже иррациональным). 1 / (1/2) равно 2.
4. Используйте
timeSlowGoal = 1.0/speed
, чтобы получить значение, обратное, поскольку, как мы все учили в начальной математике в школе, 1 / (1 / x) = x . Что касается зависания кнопок, вы не предоставляете достаточно информации, чтобы иметь возможность найти решение.5. Что ж, похоже, я забыл об этом. Спасибо jatinderjit за напоминание.
Ответ №1:
Предполагая, что вы используете Python 3, измените
timeSlowGoal = reciprocal(speed)
Для
timeSlowGoal = 1 / speed
Просто убедитесь, что вы не пытаетесь сделать это, если скорость равна нулю.
Ответ №2:
Я не знаю, почему у вас такой огромный кусок кода, потому что обратное значение числа можно просто упомянуть как: 1/n
Итак, ваша reciprocal
функция может быть просто записана как:
def reciprocal(n):
return 1.0 / n
Здесь я использую 1.0/n
вместо 1/n
того, чтобы в python результирующей от деления была дробь, либо в числителе, либо в знаменателе должно быть значение дроби.
Пример запуска:
>>> reciprocal(3)
0.3333333333333333
>>> reciprocal(0.3333333)
3.00000030000003 # Not '3' because of the loss in the precision of value entered
>>> reciprocal(reciprocal(3))
3.0 # Doing reciprocal twice returns "3"
Комментарии:
1. Я предполагаю, что второй ответ не возвращает 3, потому что ваш ввод не повторяет 3 вечно (или, по крайней мере, до тех пор, пока python не перестанет заботиться). Спасибо за ваш ответ.
2. @NoRt9001: Когда вы записываете дроби типа
1/3
,1/6
как десятичные, всегда происходит некоторая потеря точности. Когда вы инвертируете их снова, разница в исходном значении возникает из-за потери точности на предыдущем шаге3. Я бы использовал это и также включил
round()
функцию, на случай, если точность может быть фактором позже с переменной.4. @maze88: Если подумать, это нехорошо, поскольку вы будете играть с точностью до фактического значения. Потому что результат отличается, потому что мы предоставили менее точное значение.
reciprocal(reciprocal(3))
ВОЗВРАТ"3.0"