Вопросы по программированию в Python

Board index Геймдев в Blender Игровой движок Blender

Description: Все вопросы и обсуждения, касающиеся BGE
Moderators: exooman, denis8424

Post #1by sagefoedo » 14.09.2014, 01:08

Подскажите пожалуйста, почему может не работать контроллер выражение с именами клавиш? с property все работает правильно а вот с клавишами беда( Помогите.
sagefoedo
Posts: 1

Post #2by ЛегоГлаз » 16.09.2014, 18:56

sagefoedo, в скрипте называется ИМЯ контроллера, не тип. Возможно, проблема в этом. Проверяйте, чтоб совпададали.
текст сверху - ложь.
ЛегоГлаз M
Avatar
Location: из девственных лесов
Posts: 117


Post #3by maks-dll » 17.09.2014, 11:00

Не знал в какой раздел это написать. Помогите оптимизировать скрипт :) Вчера весь вечер это сочинял :-~

Code: Select all
a = 11 # нужно узнать, простое это число или нет
b = 1
x = 0
while b < a:
    c = a/b
    d = round(c)
    if (a == int(a)) and (c == d) and (a > 0) and (a/a == 1) and (a/1 == a) : x = x + 1
    b = b + 1
    if b >= a:
        if not(x > 1) : print ("Это простое число")
        else :          print ("Это не простое число")

Дело в том, что маленькие числа типа 11, 857, 453, и т.д. считает быстро, но если набрать 82734, то уже медленно выполняется, а если 645673591234659, то всё зависает.
maks-dll M
Posts: 62

  • 1

Post #4by stark » 17.09.2014, 11:41

Выглядит сложно. Но я вижу, что поиск идёт делением до самого числа a. Это делать совершенно необязательно - достаточно поискать до корень из a. А это гораздо меньше итераций.

Ну и число 645673591234659 не влазит в 32-бит разрядную сетку, но в 64-бит влазит. Как у Python с такими числами, норм?

Также операция деления одна из самых медленных на компьютере. Выводи прогресс - наверняка оно не зависает, а просто запредельно долго считает. Можно расчитывать на десятки миллионов делений в секунду, но и тогда оно будет при полном просмотре считать число 645673591234659 в течении миллионов секунд - не дождаться.
Last edited by stark on 17.09.2014, 12:13, edited 1 time in total.
stark M
Posts: 2246


  • 1

Post #5by Korchy » 17.09.2014, 12:03

maks-dll,
Для сильного упрощения есть вероятностные методы. Смотри здесь http://edunow.su/site/content/algorithms/opredelenie_prostoty_chisla
А если нужно точно - только делением на корень из числа, как уже сказал stark
Korchy M
Avatar
Posts: 3024



  • 2

Post #6by andreymal » 17.09.2014, 14:25

maks-dll, фиг знает, что ты этим кодом хотел сделать, но простейшее вычисление «в лоб» без указанных выше оптимизаций по идее должно выглядеть так
Code: Select all
def isSimple(a):
    i = 1
    while i < a - 1:
        i += 1
        if not a % i:
            return False
    return True

print(isSimple(9973))
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #7by VertexHater » 17.09.2014, 18:03

Задался проблемой сделать для игрового персонажа очень большую скорость, наподобии Quake или Heretic. И естественно стандартный скрипт с изменением obj.worldPosition уперся в проблему хождения сквозь стены.
Щито поделать не знаю :-/. Разве что мудрить с увеличением тиков в секунду, но оно как то дико и непонятно как .
Есть идеи?
VertexHater
Posts: 1

Post #8by maks-dll » 26.09.2014, 14:56

Спасибо всем за помощь по "простым числам")
Ещё вопрос созрел, в консоли при выполнении скрипта такая ошибка:
KeyError: "CList[key]: ''camera'' key not in list"
Но по факту всё работает как надо. Почему так?
maks-dll M
Posts: 62

Post #9by andreymal » 26.09.2014, 15:37

Потому что, очевидно, ключа "camera" нет в каком-то списке
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #10by maks-dll » 26.09.2014, 16:48

А это может быть из-за того, что в другую сцену объект линкован, который скрипт выполняет?
maks-dll M
Posts: 62

Post #11by andreymal » 26.09.2014, 19:31

Телепатия тут не работает, надо файл
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #12by maks-dll » 26.09.2014, 20:25

Да, конечно, вот. И нужна именно эта техника с двумя сценами.
maks-dll M
Posts: 62

Post #13by andreymal » 26.09.2014, 20:56

Ну всё правильно, у тебя во второй сцене объекта rendercam действительно нет, надо переделывать.
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #14by maks-dll » 26.09.2014, 21:01

andreymal wrote:во второй сцене объекта rendercam действительно нет
Дак да, его там и не может быть, он же в rendercam.001 превратиться. А если линковать, то изображение идёт с камеры второй сцены. В общем, фиг знает.
maks-dll M
Posts: 62

  • 2

Post #15by andreymal » 26.09.2014, 21:02

maks-dll wrote:Дак да, его там и не может быть
Вот и не надо на той сцене вообще скрипт запускать)
Ты хитренький, обошёл проблему получения доступа к объекту с другой сцены созданием линка и заработал кучу другой головной боли (а ещё две вторых сцены добавляется), я сейчас переделываю.

Added after 15 minutes 24 seconds:
(почему моё сообщение слишком короткое, если я файл прикрепил?)
Attachments
key_not_in_list_fix.zip
(84.85 KiB) Downloaded 82 times
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #16by maks-dll » 27.09.2014, 10:04

andreymal, Спасибо! O:-) Ха, я и не замечал никогда два чёрных кадра, а реально заметно, когда задержку побольше поставить. А ещё я испугался, когда увидел пустышку перед камерой)
maks-dll M
Posts: 62

Post #17by Bibo » 27.09.2014, 19:10

Здравствуйте.
Как у чисел можно избежать возможности получения экспоненциальной записи типа 1.23456e-7? То бишь, ограничить кол-во знаков после запятой, но без округления как при использовании функции round.
Bibo
Avatar
Posts: 605

Post #18by denis8424 » 28.09.2014, 15:17

Bibo, с помощью спецификатора формата
http://pep8.ru/doc/tutorial-2.6/8.html
тут посмотри еще, глава "Ввод-вывод"
http://ru.m.wikibooks.org/wiki/Python_3.1
denis8424
Avatar
Posts: 724

Post #19by andreymal » 28.09.2014, 16:22

Спецификатор формата округляет же
Читая эту подпись, вы впустую потратили 5 секунд своей жизни.
andreymal M
Avatar
Posts: 1195

Post #20by denis8424 » 28.09.2014, 16:41

позор на мои седины :suicid:
наверное надо писать функцию, которая будет готовить данные перед отправкой на вывод. типа такой:
Code: Select all
import math
pi = math.pi

def out(longOne, num):
    stringOne = str(longOne)
    listStrings = stringOne.split('.')
    if len(listStrings) == 1:
        print(stringOne)
    elif len(listStrings) == 2:
        print(listStrings[0] + '.' + listStrings[1][0:num])
    else:
        print('Получилась какая-то лажа')

print(pi)
out(pi, 4)

коряво, конечно. скорее всего есть в самом Питоне нужная функция.

Added after 36 minutes 4 seconds:
VertexHater, не используй изменение координат для перемещения, лучше задавай скорость
denis8424
Avatar
Posts: 724

Next

Return to Игровой движок Blender

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest