Я думаю, что метод равенства не является правильным. И это вызывает некоторые проблемы с обнаружением столкновений. Нельзя предполагать, что два автомобиля с одинаковым свойством являются одним и тем же объектом. Например:
e.add(new Car( 0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));
e.add(new Car( 0, 63, 2, new Color(1.0f,1.0f,1.0f, 1.0)));
В этом случае происходит столкновение, но оно никогда не будет обнаружено, поскольку два объекта с помощью реализованного метода equals одинаковы.
В таких ситуациях, как игровой движок или система моделирования, полезно различать каждый объект в вашем мире с помощью идентификатора, поскольку каждый экземпляр уникален.
Более того, как говорит @Jason, чтобы правильно зафиксировать столкновение, вы должны вычислить длину или ширину объекта.
Вы ищете всесильного '*?'
http://docs.python.org/3 /howto/regex.html#greedy-versus-non-greedy
the не жадные квалификаторы * ?, + ?, ?? или {m, n}? [...] соответствует так же мало текст , насколько это возможно.
Не будет \\ (. *? \\)
работа? Это не жадный синтаксис.
>>> x = "a (b) c (d) e"
>>> re.search(r"\(.*\)", x).group()
'(b) c (d)'
>>> re.search(r"\(.*?\)", x).group()
'(b)'
квалификаторы «
*
», «+
» и «?
» являются жадными; они соответствуют как можно большему количеству текста. Иногда такое поведение нежелательно; если RE<. *>
сопоставлено с '', оно будет соответствовать всей строке, а не только '
title H1>
. Добавление '
?
' после того, как квалификатор заставляет его выполнить совпадение не жадным или минимальным образом; будет сопоставлено как можно меньше символов. Использование. *?
в предыдущем выражении будет соответствовать только ''.
Как говорили другие, используя? модификатор в квантификаторе * решит вашу непосредственную проблему, но будьте осторожны, вы начинаете уходить в области, где регулярные выражения перестают работать, и вместо этого вам нужен синтаксический анализатор. Например, строка «(foo (bar)) baz» вызовет у вас проблемы.
Хотите, чтобы оно совпадало с "(b)"? Делай, как предложили Цитракс и Паоло. Вы хотите, чтобы это соответствовало "b"? Выполните
>>> x = "a (b) c (d) e"
>>> re.search(r"\((.*?)\)", x).group(1)
'b'
Использование неадекватного матча - хорошее начало, но я бы также посоветовал вам пересмотреть любое использование . *
- что по этому поводу?
groups = re.search(r"\([^)]*\)", x)
Прежде всего, я не предлагаю использовать "*" в regexes. Да, я знаю, это - наиболее используемый мультисимвольный разделитель, но это - тем не менее, плохая идея. Это вызвано тем, что, в то время как это действительно соответствует любому объему повторения для того символа, "любой" включает 0, который обычно является чем-то, для чего Вы хотите бросить синтаксическую ошибку, не принять. Вместо этого я предлагаю использовать эти +
знак, который соответствует любому повторению длины> 1. Кроме того, от того, что я вижу, Вы имеете дело с заключенными в скобки выражениями фиксированной длины. В результате можно, вероятно, использовать {x, y}
синтаксис для специфического определения желаемой длины.
Однако, если Вам действительно нужно нежадное повторение, я предлагаю консультироваться со всесильным ?
. Это при размещении после в конце любого regex спецификатора повторения вынудит ту часть regex найти наименьшее количество суммы текста возможным.
Однако я был бы очень осторожен с ?
как он, как Звуковая Отвертка в Докторе, Которого, имеет тенденцию сделать, как я должен поместить его, "немного" нежелательные вещи если не тщательно калиброванный. Например, для использования входа в качестве примера это определило бы ((1)
(отметьте отсутствие второго rparen) как соответствие.