【问题标题】:run only one java method at random随机只运行一个java方法
【发布时间】:2018-09-24 02:10:45
【问题描述】:

我必须运行一个生成随机 tetromino 的 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 方法,但随机运行?有没有办法做到这一点?

【问题讨论】:

    标签: java random methods


    【解决方案1】:

    我会将这两者包装在另一种随机选择其中一种方法的方法中:

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

    编辑:
    要回答 cmets 中的问题,您可以通过选择随机的 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);
    }
    

    【讨论】:

    • 如果你有两种以上的方法,有什么办法吗?像 4 或 5
    • @kailacochran 当然,您可以选择随机的int 而不是随机的boolean。请参阅我编辑的答案。
    • 只需为每个调用打乱数组并返回第一个元素。更好读。
    【解决方案2】:

    我必须重构你的代码如下。你可以测试一个随机的布尔表达式来随机创建组件。

    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);
            }   
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-27
      • 1970-01-01
      • 2018-10-28
      • 2019-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-28
      相关资源
      最近更新 更多