запустить только один метод Java наугад - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужно запустить программу на Java, которая генерирует случайное тетромино.У меня есть код для всех семи, хранящихся в отдельных методах:

public class TetrisComponent extends JComponent{
    public void paintComponent(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        Rectangle2D.Double i = new Rectangle2D.Double(0, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i);
        g2.setColor(Color.CYAN);
        g2.fill(i);

        Rectangle2D.Double i2 = new Rectangle2D.Double(50, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i2);
        g2.setColor(Color.CYAN);
        g2.fill(i2);

        Rectangle2D.Double i3 = new Rectangle2D.Double(100, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i3);
        g2.setColor(Color.CYAN);
        g2.fill(i3);

        Rectangle2D.Double i4 = new Rectangle2D.Double(150, 100, 50, 50);
        g2.setColor(Color.black);
        g2.draw(i4);
        g2.setColor(Color.CYAN);
        g2.fill(i4);
    }

    public void paintComponentj(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        Rectangle2D.Double j = new Rectangle2D.Double(200, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j);
        g2.setColor(Color.blue);
        g2.fill(j);

        Rectangle2D.Double j2 = new Rectangle2D.Double(250, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j2);
        g2.setColor(Color.blue);
        g2.fill(j2);

        Rectangle2D.Double j3 = new Rectangle2D.Double(300, 500, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j3);
        g2.setColor(Color.blue);
        g2.fill(j3);

        Rectangle2D.Double j4 = new Rectangle2D.Double(300, 550, 50, 50);
        g2.setColor(Color.black);
        g2.draw(j4);
        g2.setColor(Color.blue);
        g2.fill(j4);
    }
}

Как мне запустить эту программу (у меня есть отдельный класс TetrisViewer), чтобы запустить только метод paintComponent или paintComponentj,но случайно?Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Я должен реорганизовать ваш код следующим образом. Вы можете проверить случайное логическое выражение, чтобы рандомизировать создание компонента.

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.swing.JComponent;

public class TetrisComponent extends JComponent{

    private Map <String, Object> rectanglesIseries;
    private Random randomGenerator;


    public TetrisComponent() {
        rectanglesIseries = new HashMap<>();
        randomGenerator = new Random();
    }

    private void paintComponent(Graphics g){    

        Graphics2D g2 = (Graphics2D)g;

        rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {0, 100, 50, 50},"i");
        rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {50, 100, 50, 50},"i2");
        rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {100, 100, 50, 50},"i3");
        rectangleInitializer(g2,Color.black,Color.CYAN,new int[] {150, 100, 50, 50},"i4");

    }

    private void paintComponentj(Graphics g){
        Graphics2D g2 = (Graphics2D)g;

        rectangleInitializer(g2,Color.black,Color.blue,new int[] {200, 500, 50, 50},"j");
        rectangleInitializer(g2,Color.black,Color.blue,new int[] {250, 500, 50, 50},"j2");
        rectangleInitializer(g2,Color.black,Color.blue,new int[] {300, 500, 50, 50},"j3");
        rectangleInitializer(g2,Color.black,Color.blue,new int[] {300, 500, 50, 50},"j4");

    }

    private void rectangleInitializer(Graphics2D g2,Color drawColor,Color fillColor, int [] size, String element) {
        rectanglesIseries.put(element, (Object)new Rectangle2D.Double());
        g2.setColor(drawColor);
        g2.draw((Rectangle2D.Double)rectanglesIseries.get(element));
        g2.setColor(fillColor);
        g2.fill((Rectangle2D.Double)rectanglesIseries.get(element));
    }

    public void randomComponentBuilder(Graphics g) {
        if (randomGenerator.nextBoolean()) {
            paintComponent(g);
        } else {
            paintComponentj(g);
        }   
    }
}
0 голосов
/ 24 сентября 2018

Я бы обернул эти два в другой метод, который случайным образом выбирает один из этих методов:

private Random rand = new Random();
public void paintRandom(Graphics g) {
    if (rand.nextBoolean()) {
        paintComponent(g);
    } else {
       paintoComponentj(g);
    }
}

РЕДАКТИРОВАТЬ: Чтобы ответить на вопрос в комментариях, вы можете использовать идею для более чем двух методов, выбрав случайный int вместо случайного boolean.Чтобы избежать шаблонной структуры if-else или switch-case, элегантным решением может быть хранение ссылок на все соответствующие методы в списке и случайный выбор индекса для вызова:

private Random rand = new Random();
private final List<Consumer<Graphics>> PAINT_METHODS =
    Arrays.asList(this::paintComponent, this::paintComponentj /* etc... */);

public void paintRandom(Graphics g) {
    PAINT_METHODS.get(rand.nextInt(PAINT_METHODS.size())).accept(g);
}
...