2017-03-09 61 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應該初始化MovingRectangle類內將其凍結1和3

爲此之間的值,則需要「干將」需要點擊'二傳手的數量和該計數器正在跟蹤MovingRectangle在應凍結之前需要點擊多少次。

當您的「解凍」方法被調用的MovingRectangle,重新初始化之間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) 
       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; 
} 

}