Ваша проблема кажется еще одним примером того, почему многие люди (включая меня) рекомендуют всегда добавлять фигурные скобки (даже для блоков с 1 оператором - они могут не оставаться такими):
Посмотрите на этот фрагмент:
if (shape.contains(x,y))
counter++;
if(counter % 2 == 1) {
...
Он не делает то, что вы думаете, т.е. если вы нажмете на фигуру, counter
get увеличивается, но остальные проверки выполняются для каждые форма.Это потому, что для компилятора код выглядит так:
if (shape.contains(x,y))
counter++;
if(counter % 2 == 1) {
...
Таким образом, когда вы нажмете на круг, counter
будет равен 1, и, следовательно, counter % 2 == 1
будет истинным для каждого круга, проверяемого впоследствии.
Итак, добавьте фигурные скобки вокруг кода с отступом.Кроме того, вы можете захотеть разорвать цикл, как только обнаружите попадание, так как вы, вероятно, не заинтересованы также в проверке всех остальных кругов.
Возможно, вы также захотите ввести класс Circle
, который можетвыглядеть так:
class Circle {
Shape shape;
Color color;
... //additional properties, e.g. position, and methods
public boolean wasHit(int x, int y) {
return shape.contains(x,y);
}
public boolean isValid() {
return Color.WHITE.equals( color );
}
}
Тогда вы бы перебрали те, которые вот так:
for( Circle circle : circles ) {
if( circle.wasHit(x, y) {
if( circle.isValid() ) {
//do what you'd need here, e.g. change the shape to a rectangle
} else {
//error
}
//break the loop since other circles can't be hit or we're not interested in those
break;
}
}