处理:如果在平局中更改了计数器,我会在哪里初始化?

时间:2016-12-07 02:52:18

标签: java processing

Table t1;
import ddf.minim.*;
AudioPlayer player;
Minim minim;
int stickColR=0;
int stickColG=0;
int stickColB=0;
int counter=0;
//--------------
void setup(){
  size(1000,600);
  smooth();
  t1 = new Table(1000,600);
  t1.startGame();
  //sound player setup
  minim= new Minim(this);
  player=minim.loadFile("ballsound.mp3");

}
//--------------
void draw(){
  strokeWeight(10);
  stroke(255,0,0);
  fill(26, 218, 35);
  rect(0, 0, 1000, 600);
  fill(0);
  noStroke();
  ellipse(0, 0, 100, 100);
  ellipse(1000, 0, 100, 100);
  ellipse(0, 600, 100, 100);
  ellipse(1000, 600, 100, 100);
  t1.updatePos();  //calling the function to update the position of the balls
  t1.visualize();  // Function responsible for drawing the balls


}

//--------------
void mousePressed(){
  t1.mousePressed(mouseX-t1.x,mouseY-t1.y);
}
//--------------
void mouseReleased(){
  t1.mouseReleased(mouseX-t1.x,mouseY-t1.y);
}
//=============================
class Table{
  boolean GameIsOver=false;
  float drag = 0.99;
  float bounce = 0.4;
  float wallBounce = 0.3;
  float pushFactor = 0.4;
  float maxPush = 20;
  color[] ballColors = new color[]{color (255), color (216,7,17),color(17,242,225), color ( #45B4CE) , color ( #6A6347) , color (#E80909) ,color (#CEA9A9)};
  Ball[] balls;
  Ball selectedBall;
  int x,y,width,height;


  //--------------
  Table(int w, int h){
    width = w;
    height = h;
  }
  //--------------
  void startGame(){
    buildBalls(5);
  }
  //--------------
  void buildBalls(int count){
    balls = new Ball[2*count+1];
    int x_coor_red=600;
    int y_coor_red=300;
    int x_coor_green=626;
    int y_coor_green=313;
    for(int i=0;i<count;i++)
    {
      balls[i] = new Ball(x_coor_red, y_coor_red,i+1, this);
      x_coor_red+=26;
      y_coor_red-=13;
      if(i>=3)
      {
        x_coor_red-=26;
        y_coor_red+=26;
      }

    }

    for(int i=0;i<count;i++)
    {
      balls[count+i] = new Ball( x_coor_green, y_coor_green,i+2, this);
      x_coor_green+=26;
      y_coor_green+=13;
      if(i==1)
      {
        x_coor_green-=26;
        y_coor_green-=20;
      }
      if(i==2)
      {
        y_coor_green-=20;
      }
      if(i==3)
      {
        x_coor_green-=45;
      }
    }
    balls[2*count] = new Ball( 0.5*(width), 0.5*(height),0, this);
  }
  //--------------
  void updatePos(){
    //simulation
    for(int i=0;i<balls.length;i++)
      balls[i].update();

    //collision detection
    for(int i=0;i<balls.length;i++)
      for(int j=i+1;j<balls.length;j++)
        balls[i].collisionDetect(balls[j]);
  }
  //--------------
  void visualize(){
    translate(x,y);
    noStroke();

    //draw stick

    if(mousePressed && selectedBall!= null && (mouseX<=26+selectedBall.x || mouseX>26-selectedBall.x) && selectedBall.ballColor==color(255)){
      stickColR+=2;
      stickColB+=2;
      strokeWeight(4);

      stroke(stickColR, stickColG, stickColB);
      line ( mouseX , mouseY , mouseX + cos (atan2 ( mouseY -selectedBall.y , mouseX - selectedBall.x) )*300 , mouseY +  sin( atan2 ( mouseY - selectedBall.y , mouseX -selectedBall.x ))*300);
    }
    //drawing
    for(int i=0;i<balls.length;i++){
      balls[i].visualize();

      //Balls"disappearing" in corners
      if(balls[i].x<50 && (balls[i].y<50 || balls[i].y>550) || balls[i].x>950 &&(balls[i].y<50 || balls[i].y>550)){
      player.rewind();
      player.play();
       if(balls[i].ballColor==color(255))
       {
         textSize(25);
         text("Cue Ball Sunk. GAME OVER",350,560);
       }

       fill(0);
       ellipse(0,0,100,100);
       ellipse(1000, 0, 100, 100);
       ellipse(0, 600, 100, 100);
       ellipse(1000, 600, 100, 100);
       balls[i].x=1200;
       balls[i].y=0;
       counter++;
       if (balls[i].ballColor != 255 && counter>=3)
       {   
         textSize(25);
         text("YOU WIN", 350,560);
       }  
    }        
  }
  }
  //--------------
  float kineticEnergy(){
    float energy=0;
    for(int i=0;i<balls.length;i++)
      energy += mag( balls[i].vx, balls[i].vy );
    return energy;
  }
  //--------------
  void mousePressed(int mx, int my){
    for(int i=0;i<balls.length;i++)
      if( dist(balls[i].x,balls[i].y,mx,my) < balls[i].radius) {
        selectedBall = balls[i];
        break;
      }
  }
  //--------------
  void mouseReleased(int mx, int my){
    if(selectedBall != null){
      float px = (selectedBall.x-mx) * pushFactor;
      float py = (selectedBall.y-my) * pushFactor;
      float push = mag(px,py);
      stickColR=0;
      stickColB=0;
      if( push > maxPush ){
        px = maxPush*px/push;
        py = maxPush*py/push;
      }
      selectedBall.push(px,py);
    }
    selectedBall = null;
  }
}
class Ball{
  float x,y,vx,vy,radius,diameter;
  int type;
  Table table;
  color ballColor;
  //--------------
  Ball(float x, float y, int type, Table t){
    this.x = x;
    this.y = y;
    this.type = type;
    diameter = 26;
    radius = diameter/2;
    table = t;
    ballColor = table.ballColors[type];
  }
  //--------------
  void update(){
    vx *= table.drag;
    vy *= table.drag;

    x += vx;
    y += vy;

    wallBounce();
  }
  //--------------
  void wallBounce(){
    if(x<=radius){
      vx = -table.wallBounce*vx;
      x = radius;
      player.rewind();
      player.play();

    }
    if(x>=t1.width-radius){
      vx = -table.wallBounce*vx;
      x = table.width-radius;
      player.rewind();
      player.play();
    }
    if(y<=radius){
      vy = -table.wallBounce*vy;
      y = radius;
      player.rewind();
      player.play();
    }
    if(y>=t1.height-radius){
      vy = -table.wallBounce*vy;
      y = table.height-radius;
      player.rewind();
      player.play();
    }

  }
  //--------------
  void visualize(){
    fill(ballColor);
    stroke(0);
    strokeWeight(2);
    stroke(0);
    ellipse(x,y,diameter,diameter);
  }
  //--------------
  void push(float dx, float dy){
    vx += dx;
    vy += dy;
  }
  //--------------
  void collisionDetect(Ball b){
    float distance = dist(x,y,b.x,b.y);
    if( distance < diameter && (b.x>50 && (b.y>50 || b.y<550) || b.x<950 &&(b.y>50 || b.y<550))){
      float vxSum = 0.5*(vx + b.vx);
      float vySum = 0.5*(vy + b.vy);

      float forceMagnitude = ((b.x-x)*(vx-vxSum) + (b.y-y)*(vy-vySum));
      float xForce = 0.25*(x-b.x)*forceMagnitude/distance;
      float yForce = 0.25*(y-b.y)*forceMagnitude/distance;

      vx   = vx + table.bounce * xForce;
      vy   = vy + table.bounce * yForce; 
      b.vx = b.vx - table.bounce * xForce;
      b.vy = b.vy - table.bounce * yForce;

      b.x = x + (diameter+1)*(b.x-x)/distance;
      b.y = y + (diameter+1)*(b.y-y)/distance;

      player.rewind();
      player.play();
      }
    }
  }

我正在处理游泳池游戏,我差不多完成但是我被困在这里。我想添加一个计数器,当一个球进入角落时计数,然后一旦计数器等于十,球的数量,它将显示获胜的消息。我觉得有些事情是错误的,因为计数器每次都被重置,因为它正在抽奖?但我不确定在哪里初始化它。顺便说一句,现在我只需要&gt; = 3这样我就可以快速查看它是否正常工作。谢谢大家

2 个答案:

答案 0 :(得分:0)

由于声誉不佳,我必须向您展示我的解决方案,即使我认为我没有修复您代码中的所有错误。

我认为问题中陈述的错误与计数器变量几乎没有关系。我运行你的代码,发现你试图通过改变坐标来隐藏“消失的”球。这意味着“消失”的球仍然可以被认证为下面的if语句,因此,计数器的值将继续增加。

//Balls"disappearing" in corners
if(balls[i].x<50 && (balls[i].y<50 || balls[i].y>550) || balls[i].x>950 &&(balls[i].y<50 || balls[i].y>550))

所以你可以在 Ball

中添加一个布尔字段
class Ball{
    float x,y,vx,vy,radius,diameter;
    int type;
    Table table;
    color ballColor;
    // add this variable.
    boolean disappeared = false;
    // your constructor, wallBounce(), push(), collisionDetect()
    void visualize(){
        // only draw the ball when it hasn't disappeared.
        if(!this.disappeared) {
            fill(ballColor);
            stroke(0);
            strokeWeight(2);
            stroke(0);
            ellipse(x,y,diameter,diameter);
        }  
    }
 }

然后用它来避免重复计算。

// other code in visualize()
if(!balls[i].disappeared) {
    counter++;
    balls[i].disappeared = true;
}
// other code

答案 1 :(得分:0)

 Table t1;
import ddf.minim.*;
AudioPlayer player;
Minim minim;
int stickColR=0;
int stickColG=0;
int stickColB=0;
float counter;
boolean isAllIn = false;
//--------------
void setup() {
  counter=0;
  size(1000, 600);
  smooth();
  t1 = new Table(1000, 600);
  t1.startGame();
  //sound player setup
  minim= new Minim(this);
  player=minim.loadFile("ballsound.mp3");
}
//--------------
void draw() {
  strokeWeight(10);
  stroke(255, 0, 0);
  fill(26, 218, 35);
  rect(0, 0, 1000, 600);
  fill(0);
  noStroke();
  ellipse(0, 0, 100, 100);
  ellipse(1000, 0, 100, 100);
  ellipse(0, 600, 100, 100);
  ellipse(1000, 600, 100, 100);
  t1.updatePos();  //calling the function to update the position of the balls
  t1.visualize();  // Function responsible for drawing the balls
}

//--------------
void mousePressed() {
  t1.mousePressed(mouseX-t1.x, mouseY-t1.y);
}
//--------------
void mouseReleased() {
  t1.mouseReleased(mouseX-t1.x, mouseY-t1.y);
}
//=============================
class Table {
  float drag = 0.99;
  float bounce = 0.4;
  float wallBounce = 0.3;
  float pushFactor = 0.4;
  float maxPush = 20;
  color[] ballColors = new color[]{color (255), color (216, 7, 17), color(17, 242, 225), color ( #45B4CE), color ( #6A6347), color (#E80909), color (#CEA9A9)};
  Ball[] balls;
  Ball selectedBall;
  int x, y, width, height;


  //--------------
  Table(int w, int h) {
    width = w;
    height = h;
  }
  //--------------
  void startGame() {
    buildBalls(5);
  }

  void restart() {
    t1 = new Table(1000, 600);
    t1.startGame();
  }

  //--------------
  void buildBalls(int count) {
    balls = new Ball[2*count+1];
    int x_coor_red=600;
    int y_coor_red=300;
    int x_coor_green=626;
    int y_coor_green=313;
    for (int i=0; i<count; i++)
    {
      balls[i] = new Ball(x_coor_red, y_coor_red, i+1, this);
      x_coor_red+=26;
      y_coor_red-=13;
      if (i>=3)
      {
        x_coor_red-=26;
        y_coor_red+=26;
      }
    }

    for (int i=0; i<count; i++)
    {
      balls[count+i] = new Ball( x_coor_green, y_coor_green, i+2, this);
      x_coor_green+=26;
      y_coor_green+=13;
      if (i==1)
      {
        x_coor_green-=26;
        y_coor_green-=20;
      }
      if (i==2)
      {
        y_coor_green-=20;
      }
      if (i==3)
      {
        x_coor_green-=45;
      }
    }
    balls[2*count] = new Ball( 0.5*(width), 0.5*(height), 0, this);
  }
  //--------------
  void updatePos() {
    //simulation
    for (int i=0; i<balls.length; i++)
      balls[i].update();

    //collision detection
    for (int i=0; i<balls.length; i++)
      for (int j=i+1; j<balls.length; j++)
        balls[i].collisionDetect(balls[j]);
  }
  //--------------
  void visualize() {
    translate(x, y);
    noStroke();

    //draw stick

    if (mousePressed && selectedBall!= null && (mouseX<=26+selectedBall.x || mouseX>26-selectedBall.x) && selectedBall.ballColor==color(255)) {
      stickColR+=2;
      stickColB+=2;
      strokeWeight(4);

      stroke(stickColR, stickColG, stickColB);
      line ( mouseX, mouseY, mouseX + cos (atan2 ( mouseY -selectedBall.y, mouseX - selectedBall.x) )*300, mouseY +  sin( atan2 ( mouseY - selectedBall.y, mouseX -selectedBall.x ))*300);
    }
    //drawing
    for (int i=0; i<balls.length; i++) {
      balls[i].visualize();

      //Balls"disappearing" in corners
      if (balls[i].x<50 && (balls[i].y<50 || balls[i].y>550) || balls[i].x>950 &&(balls[i].y<50 || balls[i].y>550)) {

        player.rewind();
        player.play();
        if (balls[i].ballColor==color(255))
        {
          textSize(25);
          text("Cue Ball Sunk. GAME OVER.  Press any key to restart.", 170, 560);
          if (keyPressed == true) {
            t1.restart();
          }
        }
        /*
        fill(0);
         ellipse(0, 0, 100, 100);
         ellipse(1000, 0, 100, 100);
         ellipse(0, 600, 100, 100);
         ellipse(1000, 600, 100, 100);
         balls[i].x=1200;
         balls[i].y=0;
         */

        if (!balls[i].disappeared) {
          counter++;
          balls[i].disappeared=true;
        }


        if ( counter>=3) {
          textSize(25);
          text("YOU WIN.  Press any key to restart.", 300, 560);
          if (keyPressed == true) {
            t1.restart();
          }
        }
      }
    }
  }
  //--------------
  float kineticEnergy() {
    float energy=0;
    for (int i=0; i<balls.length; i++)
      energy += mag( balls[i].vx, balls[i].vy );
    return energy;
  }
  //--------------
  void mousePressed(int mx, int my) {
    for (int i=0; i<balls.length; i++)
      if ( dist(balls[i].x, balls[i].y, mx, my) < balls[i].radius) {
        selectedBall = balls[i];
        break;
      }
  }



  //--------------
  void mouseReleased(int mx, int my) {
    if (selectedBall != null) {
      float px = (selectedBall.x-mx) * pushFactor;
      float py = (selectedBall.y-my) * pushFactor;
      float push = mag(px, py);
      stickColR=0;
      stickColB=0;
      if ( push > maxPush ) {
        px = maxPush*px/push;
        py = maxPush*py/push;
      }
      selectedBall.push(px, py);
    }
    selectedBall = null;
  }
}
class Ball {
  boolean disappeared = false;
  float x, y, vx, vy, radius, diameter;
  int type;
  Table table;
  color ballColor;
  //--------------
  Ball(float x, float y, int type, Table t) {
    this.x = x;
    this.y = y;
    this.type = type;
    diameter = 26;
    radius = diameter/2;
    table = t;
    ballColor = table.ballColors[type];
  }
  //--------------
  void update() {
    vx *= table.drag;
    vy *= table.drag;

    x += vx;
    y += vy;

    wallBounce();
  }
  //--------------
  void wallBounce() {
    if (x<=radius) {
      vx = -table.wallBounce*vx;
      x = radius;
      player.rewind();
      player.play();
    }
    if (x>=t1.width-radius) {
      vx = -table.wallBounce*vx;
      x = table.width-radius;
      player.rewind();
      player.play();
    }
    if (y<=radius) {
      vy = -table.wallBounce*vy;
      y = radius;
      player.rewind();
      player.play();
    }
    if (y>=t1.height-radius) {
      vy = -table.wallBounce*vy;
      y = table.height-radius;
      player.rewind();
      player.play();
    }
  }
  //--------------
  void visualize() {
    if (!this.disappeared) { 
      fill(ballColor);
      stroke(0);
      strokeWeight(2);
      stroke(0);
      ellipse(x, y, diameter, diameter);
    }
  }

  //--------------
  void push(float dx, float dy) {
    vx += dx;
    vy += dy;
  }
  //--------------
  void collisionDetect(Ball b) {
    float distance = dist(x, y, b.x, b.y);
    if ( distance < diameter && (b.x>50 && (b.y>50 || b.y<550) || b.x<950 &&(b.y>50 || b.y<550))) {
      float vxSum = 0.5*(vx + b.vx);
      float vySum = 0.5*(vy + b.vy);

      float forceMagnitude = ((b.x-x)*(vx-vxSum) + (b.y-y)*(vy-vySum));
      float xForce = 0.25*(x-b.x)*forceMagnitude/distance;
      float yForce = 0.25*(y-b.y)*forceMagnitude/distance;

      vx   = vx + table.bounce * xForce;
      vy   = vy + table.bounce * yForce; 
      b.vx = b.vx - table.bounce * xForce;
      b.vy = b.vy - table.bounce * yForce;

      b.x = x + (diameter+1)*(b.x-x)/distance;
      b.y = y + (diameter+1)*(b.y-y)/distance;

      player.rewind();
      player.play();
    }
  }
}