2017-03-09 24 views
0

私のプロジェクトでは、移動する四角形に1から3の間のランダムな値を割り当てることになっています。クリックするたびに、必要なクリックの数が少なくなるはずです。カウントが0に達すると、フリーズします。フリーズされた矩形が別のフリーズされた矩形にタッチされた場合、凍結する必要のあるクリック数の新しい乱数で再度移動を開始する必要があります。私はそれを複数のクリックでフリーズさせる方法についています。複数のクリック後にフリーズ移動する長方形

import java.util.Random; 
public class Main { 

public static void main(String[] args) { 

    MovingRectangle[] rectangles = new MovingRectangle[5]; 


    Random rng = new Random(); 
    for (int i = 0; i < rectangles.length; i++) { 
     rectangles[i] = new MovingRectangle(
       rng.nextDouble(), // x in [0, 1) 
       rng.nextDouble(), // y in [0, 1) 
       rng.nextDouble() * 0.02 - 0.01, // vx in [-0.01, 0.01) 
       rng.nextDouble() * 0.02 - 0.01, // vy in [-0.01, 0.01) 
       rng.nextDouble() * 0.2 + 0.1, // width in [0.1, 0.3) 
       rng.nextDouble() * 0.2 + 0.1 // height in [0.1, 0.3) 
       ); 
    } 

    while (true) { 
     StdDraw.clear(StdDraw.GRAY); 

     boolean clickCount = false; 
     int clickStatus = rng.nextInt(3); 
     int frozenCount = 0; 
     for (int i = 0; i < rectangles.length; i++) { 


       if (StdDraw.mousePressed()) { 
        ++clickStatus; 
        if (clickStatus > 3) { 
         clickStatus = 3; 
        } 
       } else { 
        clickStatus = 0; 
       } 
       if(clickStatus == 3) { 
       clickCount = true; 
       } 


      if (StdDraw.mousePressed() 
        && rectangles[i].containsPoint(StdDraw.mouseX(), StdDraw.mouseY()) && (clickCount = true)) { 
       rectangles[i].freeze(); 
      } 

      rectangles[i].draw(); 
      rectangles[i].update(); 

      if (rectangles[i].isFrozen()) { 
       frozenCount++; 
      } 
      for (int j = i+1; j < rectangles.length; j++) { 

        if (rectangles[i].collidesWith(rectangles[j])) { 

        rectangles[i].unfreeze(); 
        rectangles[j].unfreeze(); 
        } 
       } 
     } 
     StdDraw.setPenColor(StdDraw.WHITE); 
     StdDraw.filledRectangle(0.2, 0.03, 0.2, 0.03); 
     StdDraw.setPenColor(StdDraw.BLACK); 
     StdDraw.textLeft(0.0, 0.03, "Rectangles remaining: " + 
       (rectangles.length - frozenCount)); 


     if (frozenCount == rectangles.length) { 
      StdDraw.setPenColor(StdDraw.WHITE); 
      StdDraw.filledRectangle(0.5, 0.5, 0.1, 0.05); 
      StdDraw.setPenColor(StdDraw.BLACK); 
      StdDraw.text(0.5, 0.5, "You Win!"); 
     } 
     StdDraw.show(25); 
    } 
} 

}

import java.util.Random; 

public class MovingRectangle { 

private double x; 
private double y; 


private double vx; 
private double vy; 
private boolean isFrozen; 
private boolean frozen; 

private int red; 
private int green; 
private int blue; 


private double halfWidth; 
private double halfHeight; 


Random rng; 

public MovingRectangle(double x, double y, double vx, 
     double vy, double width, double height) { 

    this.x = x; 
    this.y = y; 
    this.vx = vx; 
    this.vy = vy; 
    this.isFrozen = false; 
    this.halfWidth = width/2; 
    this.halfHeight = height/2; 


    rng = new Random(); 


    randomColor(); 
} 

public void randomColor() { 

    red = rng.nextInt(256); 
    green = rng.nextInt(256); 
    blue = rng.nextInt(256); 
} 

public void draw() { 
    int a = rng.nextInt(4); 

    if (isFrozen) { 
     StdDraw.setPenColor(StdDraw.RED); 
    } else { 
     StdDraw.setPenColor(red, green, blue); 
    } 
    StdDraw.filledRectangle(x, y, halfWidth, halfHeight); 
    StdDraw.setPenColor(StdDraw.BLACK); 
    //StdDraw.text(x, y, "" + a); 


    StdDraw.setPenRadius(0.01); 
    StdDraw.setPenColor(StdDraw.BLACK); 
    StdDraw.rectangle(x, y, halfWidth, halfHeight); 
} 

public void update() { 
    if (isFrozen) { 
     return; 
    } 


    x += vx; 
    y += vy; 


    if (x - halfWidth < 0) { 
     vx *= -1; 
     x = 0 + halfWidth; 
     randomColor(); 
    } 


    if (x + halfWidth > 1) { 
     vx *= -1; 
     x = 1 - halfWidth; 
     randomColor(); 
    } 


    if (y - halfHeight < 0) { 
     vy *= -1; 
     y = 0 + halfHeight; 
     randomColor(); 
    } 


    if (y + halfHeight > 1) { 
     vy *= -1; 
     y = 1 - halfHeight; 
     randomColor(); 
    } 
} 

public void freeze() { 

    isFrozen = true; 
} 

public void unfreeze() { 
    if (!isFrozen) { 
    return; 
    } 
    isFrozen = false; 
} 

public boolean isFrozen() { 
    // returns true if the rectangle is frozen 
    return isFrozen; 
} 

public boolean containsPoint(double a, double b) { 
    // Returns true if and only if the point (a, b) 
    // is contained inside the rectangle 
    return a > x - halfWidth // left edge 
      && a < x + halfWidth // right edge 
      && b > y - halfHeight // bottom edge 
      && b < y + halfHeight; // top edge 
} 
public int getX() { 
    return (int) x; 
}public int getY() { 
    return (int) y; 
} 

public boolean collidesWith(MovingRectangle other) { 
    return x < other.x + other.halfWidth && x + halfWidth > other.x && y < other.y + 
      other.halfHeight && y + halfHeight > other.y; 
} 
public boolean atSameLocation(MovingRectangle other) { 
    return this.x == other.getX() && this.y == other.getY(); 
} 
} 

答えて

0

長方形があなたのMovingRectangleオブジェクトクラス内でクリックされた回数を追跡します。そのオブジェクトデータを参照して、フリーズメソッドを呼び出す必要があるかどうかを判断する必要があります。

あなたMovingRectangleのコンストラクタは、そのためには1と3

の間の値にそれを凍結するために必要なクリック数を初期化する必要があり、あなたがMovingRectangleクラス内で「ゲッター」と「セッター」を必要になりますMovingRectangleをフリーズする前にクリックする必要がある回数を記録しているカウンタ。

あなたの「凍結解除」メソッドはMovingRectangleに呼び出されたとき、私は部分的に解決策を見つけた1と3

0

の間の乱数にカウンターを再初期化します。フリーズするのに必要なクリック数が正しく保存されておらず、1回のクリック数が正しくカウントされませんが、ほとんどの場合は動作します。

import java.util.Random; 
public class Main { 

public static void main(String[] args) { 

    MovingRectangle[] rectangles = new MovingRectangle[5]; 


    Random rng = new Random(); 
    for (int i = 0; i < rectangles.length; i++) { 
     rectangles[i] = new MovingRectangle(
       rng.nextDouble(), // x in [0, 1) 
       rng.nextDouble(), // y in [0, 1) 
       rng.nextDouble() * 0.02 - 0.01, // vx in [-0.01, 0.01) 
       rng.nextDouble() * 0.02 - 0.01, // vy in [-0.01, 0.01) 
       rng.nextDouble() * 0.2 + 0.1, // width in [0.1, 0.3) 
       rng.nextDouble() * 0.2 + 0.1, // height in [0.1, 0.3) 
       rng.nextInt(3) + 1 
       ); 
    } 

    while (true) { 
     StdDraw.clear(StdDraw.GRAY); 
     if (StdDraw.mousePressed()) { 

    } 
     // where check click status 

     int clickCount = 0; 
     int clickStatus = 0; 
     int frozenCount = 0; 
     for (int i = 0; i < rectangles.length; i++) { 
       if (StdDraw.mousePressed()) { 
        ++clickStatus; 
        if (clickStatus > 2) { 
         clickStatus = 2; 
        } 
       } else { 
        clickStatus = 0; 
       } 
       if(clickStatus == 1) { 
       clickCount++; 
       clickCount = 3; 
       } 


      if (StdDraw.mousePressed() 
        && rectangles[i].containsPoint(StdDraw.mouseX(), StdDraw.mouseY())) { 
       rectangles[i].setclicksRemaining(); 
       rectangles[i].freeze(); 
      } 

      rectangles[i].draw(); 
      rectangles[i].update(); 

      if (rectangles[i].isFrozen()) { 
       frozenCount++; 
      } 
      for (int j = i+1; j < rectangles.length; j++) { 

        if (rectangles[i].collidesWith(rectangles[j])) { 

        rectangles[i].unfreeze(); 
        rectangles[j].unfreeze(); 
        rectangles[i].draw(); 
        rectangles[j].draw(); 
        } 
       } 
     } 
     StdDraw.setPenColor(StdDraw.WHITE); 
     StdDraw.filledRectangle(0.2, 0.03, 0.2, 0.03); 
     StdDraw.setPenColor(StdDraw.BLACK); 
     StdDraw.textLeft(0.0, 0.03, "Rectangles remaining: " + 
       (rectangles.length - frozenCount)); 


     if (frozenCount == rectangles.length) { 
      StdDraw.setPenColor(StdDraw.WHITE); 
      StdDraw.filledRectangle(0.5, 0.5, 0.1, 0.05); 
      StdDraw.setPenColor(StdDraw.BLACK); 
      StdDraw.text(0.5, 0.5, "You Win!"); 
     } 
     StdDraw.show(25); 
    } 
} 

}

import java.util.Random; 

public class MovingRectangle { 
Random rng; 
private double x; 
private double y; 


private double vx; 
private double vy; 
private boolean isFrozen; 
private boolean frozen; 

private int red; 
private int green; 
private int blue; 

private int clicksRemaining; 

private double halfWidth; 
private double halfHeight; 




// Your constructor for the MovingRectangle should 
//initialize the number of clicks needed to freeze it to a value between 1 and 3. 
public void clicksRemaining() { 

    clicksRemaining = rng.nextInt(3) + 1; 
} 
public void setclicksRemaining() { 
    if (clicksRemaining < 1) { 
     clicksRemaining = 1; 
    } 
    --clicksRemaining; 
} 
public int getclicksRemaining() { 
    return clicksRemaining; 
} 


public MovingRectangle(double x, double y, double vx, 
     double vy, double width, double height, int clicksRemaining) { 

    this.x = x; 
    this.y = y; 
    this.vx = vx; 
    this.vy = vy; 
    this.isFrozen = false; 
    this.halfWidth = width/2; 
    this.halfHeight = height/2; 
    this.clicksRemaining = clicksRemaining; 


    rng = new Random(); 


    randomColor(); 
} 


public void randomColor() { 

    red = rng.nextInt(256); 
    green = rng.nextInt(256); 
    blue = rng.nextInt(256); 
} 

public void draw() { 

    if (isFrozen) { 
     StdDraw.setPenColor(StdDraw.RED); 
    } else { 
     StdDraw.setPenColor(red, green, blue); 
    } 
    StdDraw.filledRectangle(x, y, halfWidth, halfHeight); 
    StdDraw.setPenColor(StdDraw.BLACK); 
    StdDraw.text(x, y, "" + clicksRemaining); 


    StdDraw.setPenRadius(0.01); 
    StdDraw.setPenColor(StdDraw.BLACK); 
    StdDraw.rectangle(x, y, halfWidth, halfHeight); 
} 

public void update() { 
    if (isFrozen) { 
     return; 
    } 


    x += vx; 
    y += vy; 


    if (x - halfWidth < 0) { 
     vx *= -1; 
     x = 0 + halfWidth; 
     randomColor(); 
    } 


    if (x + halfWidth > 1) { 
     vx *= -1; 
     x = 1 - halfWidth; 
     randomColor(); 
    } 


    if (y - halfHeight < 0) { 
     vy *= -1; 
     y = 0 + halfHeight; 
     randomColor(); 
    } 


    if (y + halfHeight > 1) { 
     vy *= -1; 
     y = 1 - halfHeight; 
     randomColor(); 
    } 
} 

public void freeze() { 

    isFrozen = true; 
} 

public void unfreeze() { 
    if (!isFrozen) { 
    return; 
    } 
    clicksRemaining = rng.nextInt(3) + 1; 
    isFrozen = false; 
} 

public boolean isFrozen() { 
    return isFrozen; 
} 

public boolean containsPoint(double a, double b) { 
    return a > x - halfWidth // left edge 
      && a < x + halfWidth // right edge 
      && b > y - halfHeight // bottom edge 
      && b < y + halfHeight; // top edge 
} 
public int getX() { 
    return (int) x; 
}public int getY() { 
    return (int) y; 
}public int gethalfWidth() { 
    return (int) halfWidth; 
}public int gethalfHeight() { 
    return (int) halfHeight; 
} 

public boolean collidesWith(MovingRectangle other) { 

    return x - halfWidth < other.x + other.halfWidth && x + halfWidth > other.x - other.halfWidth && y - halfHeight < other.y + 
      other.halfHeight && y + halfHeight > other.y - halfHeight; 
} 

}

関連する問題