Остановка цикла после выполнения условия Java - PullRequest
0 голосов
/ 22 мая 2019

У меня есть код, который ищет в заданной области определенный цвет. Однако я хочу сделать снимок экрана с областью (выполнено), выполнить поиск по всей ее цветовой области (выполнено), и, если цвет появляется , снова выполнить поиск для той же области. Если цвет не найден, выйдите из сценария. Я не могу понять, где поставить операторы if и скобки. То, что у меня сейчас, не совсем работает.

import java.awt.*;
import java.awt.image.BufferedImage;



public class Main {
    public static void main(String[] args) throws AWTException {
        boolean isFound = true;
        while (isFound == true){
            BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
            BufferedImage image2 = new Robot().createScreenCapture(new Rectangle(70, 102,200,222));
            isFound = false;
            for (int y = 0; y < image2.getHeight(); y++) {
                for (int x = 0; x < image2.getWidth(); x++) {
                    Color pixcolor = new Color(image2.getRGB(x, y));
                    int red = pixcolor.getRed();
                    int green = pixcolor.getGreen();
                    int blue = pixcolor.getBlue();
                    System.out.println("Red  = " + red);
                    System.out.println("Green  = " + green);
                    System.out.println("Blue  = " + blue);

                    if (red == 255 & green == 255 & blue == 0){
                        isFound = true;
                    }
                    else{
                        isFound = false;
                    }

                }

            }
        }
        while (isFound == false){
            System.exit(1);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Как правило, когда у вас есть три уровня вложенных циклов, самое время разбить ваш метод на части. Этот код будет выглядеть намного проще, если вы реорганизуете поиск цвета из кода, который повторяет поиск. Это может выглядеть так.

public class BreakWhenNoYellow {

    public static void main(String[] args) {
        BufferedImage capture = null;
        Rectangle screenRegion = new Rectangle(70, 102, 200, 220);
        do {
            capture = new Robot().createScreenCapture(screenRegion);
        } while (containsColor(capture, Color.YELLOW));
    }

    private boolean containsColor(BufferedImage image, Color toFind) {
        for (int y = 0; y < image.getHeight(); y++) {
            for (int x = 0; x < image.getWidth(); x++) {
                if (toFind.equals(new Color(image.getRGB(x, y)))) {
                   return true;
                }
            }
        }
        return false;
    } 
}

Здесь второй метод проверяет изображение на наличие цвета. Если он находит правильный цвет, он немедленно возвращает true и больше не проверяет. Возвращается false только после проверки всего изображения, если цвет не найден.

Метод main просто захватывает необходимую область снова и снова и использует второй метод для проверки на желтый. Как только желтый не найден, он выйдет.

1 голос
/ 22 мая 2019

Несколько вещей, которые могут помешать вам получить ожидаемое поведение:

  1. Вы должны использовать && вместо & в своем утверждении if.
  2. Я не знаюНе думаю, что вам нужно установить isFound = false до окончания цикла.
  3. Вы должны выйти из цикла, как только найдете совпадение.
  4. Вам не нужно использовать второй while цикл, просто дайте ему прекратить.

Попробуйте это:

public class Main {
    public static void main(String[] args) throws AWTException {
        boolean isFound = false;
        while (!isFound){
            BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
            BufferedImage image2 = new Robot().createScreenCapture(new Rectangle(70, 102,200,222));
            for (int y = 0; y < image2.getHeight(); y++) {
                for (int x = 0; x < image2.getWidth(); x++) {
                    Color pixcolor = new Color(image2.getRGB(x, y));
                    int red = pixcolor.getRed();
                    int green = pixcolor.getGreen();
                    int blue = pixcolor.getBlue();
                    System.out.println("Red  = " + red);
                    System.out.println("Green  = " + green);
                    System.out.println("Blue  = " + blue);

                    if (red == 255 && green == 255 && blue == 0){
                        isFound = true;
                        break;
                    }
                }
            }
        }
        if (!isFound){
            System.exit(1);
        }
    }
}
1 голос
/ 22 мая 2019

Я изменил цикл while с бесконечным циклом, потому что автор хотел сделать цикл, пока цвет не был найден на скриншоте. Если цвет не найден (isFound == false), приложение закрывается с помощью команды System.exit (1).

import java.awt.image.BufferedImage;

public class Main {
    public static void main(String[] args) throws AWTException {
        while (true){
            BufferedImage image = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
            BufferedImage image2 = new Robot().createScreenCapture(new Rectangle(70, 102,200,222));
            boolean isFound = false;
            for (int y = 0; y < image2.getHeight(); y++) {
                for (int x = 0; x < image2.getWidth(); x++) {
                    Color pixcolor = new Color(image2.getRGB(x, y));
                    int red = pixcolor.getRed();
                    int green = pixcolor.getGreen();
                    int blue = pixcolor.getBlue();
                    System.out.println("Red  = " + red);
                    System.out.println("Green  = " + green);
                    System.out.println("Blue  = " + blue);

                    if (red == 255 && green == 255 && blue == 0){
                        isFound = true;
                        break;
                    }
                }
            }
            if(!isFound) {
               System.exit(1);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...