Score doesn't work

Hi, everyone!

I’ve been working a pong game lately (my first game actually) and I’m kind of struggling with a very big problem: the scores don’t work and I genuinely don’t know why! It shows “0” the whole time and it simply doesn’t change when it should!

I informed myself a little and I found out that it should actually work, because it seems to be right. Since this is a school project, I’ve asked my teacher for help and even if there were some minutes left for the lesson to come to an end he had time to check it quickly and he told me that he didn’t notice any mistake in my code and that he also agreed with the fact that it should be working… but somehow it doesn’t.

Here’s how I did it(I’ll only share the parts that include the score, not the whole game):

First of all, I wrote this in the beginning of my code(There are two scores, one for each player):

int leftscore = 0;
int rightscore = 0;

A few lines under I wrote this here:

fill(255); 
textSize(32); 
text(leftscore,32,40);  
text(rightscore,width-64,40); 

After, I wrote this in the class of my Puck(the object that bounces on the screen during the game):

void edges() {
    if ( y < 0 || y > height) { 
       yspeed *= -1;  
    }
     if ( x - r < 0 ) {
       rightscore++ ; 
       reset(); 
     }
     if ( x + r > width ) {
       leftscore++ ;
       reset();
     }
   }

Then again, I’m pretty convinced that what I wrote is right but maby I’m wrong(there has to be a reason why it doesn’t work, after all, so I’m for sure wrong somehow) so please, if you found the mistake, help me solve this problem.
Thank you!

1 Like

the code you show is not complete,
so best guess is that inside

reset(){
// you have like

  leftscore = 0;
  rightscore = 0;

}

if you ever come to that lines

leftscore++ ;
rightscore++ ;

for this to check pls. include like a
println("rightscore++ ");

1 Like

Oh, I’m sorry, I forgot to mention that the function reset() doesn’t have anything to do with the score. (my teacher thought the same lol) It was something that I created for the position of the puck to change randomly when it hits one of the paddles.

I don’t know what the “println” thing means but I added it to my code like you said and it didn’t work :slightly_frowning_face:

also can not see where

edges();
is called, and where x is changing…

pls show complete code and use the

</> code formatter

Pong:

// Objekten
Puck puck; //Der Puck

Paddle left; //Der linke Schläger
Paddle right; //Der rechte Schläger 

int leftscore = 0; //Linken Score beträgt 0 Punkte am Anfang des Spieles
int rightscore = 0;//Rechten Score beträgt 0 Punkte am Anfang des Spieles


//"void" definiert eine Methode ohne Rückgabewert
void setup() { //Befehle, die zu Anfangs ×1 ausgeführt werden
size(600,400); //Größe(in Pixel)
puck = new Puck(); //neues Objekt(in disem Fall der Puck)wird gemacht
left = new Paddle(true);  
right = new Paddle(false);
// so könnte das Programm wissen, dass es 2 verschiedene Schläger gibt 
} 

void draw() { //nachdem setup() werden die Befehle bei draw() ohne Ende ausgeführt
background(#D9A8D1); //Hintergrundfarbe

//Funktionenserstellungen
puck.checkPaddleLeft(left); //,damit der Puck "wissen" kann, wann er den linken Schläger berührt
puck.checkPaddleRight(right);//,damit der Puck "wissen" kann, wann er den rechten Schläger berührt

left.show(); //,damit der linke Schläger "sich zeigt"
right.show();//,damit der rechte Schläger "sich zeigt"
left.update();//,um z.B.die Werten die beim linken Schläger geschrieben wurden zu  "aktualisieren"(z.B. neue informationen über bestimmte Variablen und ihre Werte geben)
right.update();//es werden Informationen "aktualisiert" wie z.B. in diesem Fall die Werte den Variablen des rechten Schlägers 

puck.edges();//,damit der Puck nicht weiter von der Kante geht
puck.update();//es werden Informationen über den Puck "aktualisiert" wie z.B. die Werte den Variablen 
puck.show();//,damit der Puck "sich zeigt"


fill(255); //Farbe des Textes(des Scores)
textSize(32); //Größe des Textes
text(leftscore,32,40); //Position des linken Textes 
text(rightscore,width-64,40); //Position des rechten Rextes

} 

void keyReleased() { // Funktion, die bei jedem Loslassen einer Taste aufgerufen wird
  left.move(0); // der linke Schläger bewegt sich gar nicht mehr
  right.move(0); // der rechte Schläger bewegt sich gar nicht mehr
}


void keyPressed() { //Funktion für das Drucken von Tasten(muss in draw() stehen, damit es sich nicht nur einmal wiederholt)
  if (key == 'a') {
    left.move(-10); //Falls die Taste 'a' gedruckt wird, dann geht der linke Schläger 10 Schritte nach unten
  } else if ( key == 'd') {
    left.move(10); //Falls die Taste 'd' gedruckt wird, dann geht der linke Schläger 10 Schrite nach oben
  }
  if (key == 'j') { 
    right.move(-10); //Falls die Taste 'j' gedruckt wird, dann bewegt sich der rechte Schläger 10 Schritte nach unten
  } else if (key == 'l') {
    right.move(10); //Falls die Taste 'l' gedruckt wird, dann bewegt sich der rechte Schläger 10 Schritte nach oben
  }
}

Paddle:

class Paddle { //Funktionen und Attribute des Schlägers werden definiert
  float x; //Variable 'x'(x-Position) definieren
  float y = height/2; //Variable 'y'(y-Position) definieren und es als Wert die Hälfte des Bildhöhenwerts zuordnen
  float w = 20; //Variable 'w'(width=Breite des Schlägers)definieren und es den Wert 20 (20 Pixel) zuordnen 
  float h = 100; //Variable 'h'(height=Höhe des Schlägers)definieren und es den Wert 100 (100 Pixel) zuordnen 
  float ychange = 0; //Variable, die die Menge an Pixeln bei Änderungen der y-Position (oder bei der vertikalen Bewegung des Pucks) jedes Mal durch draw() speichert(sie wird definiert und den Wert 0 am Anfang des Spieles bekommen) 
  
  Paddle (boolean left) { //Ist es der linke oder der rechte Schläger?('boolean' wird für eine Variable, die nur zwei Werte haben kann, benutzt('true' oder 'false'))
    if (left) { 
      x = w/2 + 10; //Falls es der linke ist, dann beträgt 'x'(seine x-Position) die Hälfte seiner Breite (d.h. 20:2=10) plus 10
    }
    else {
      x = width - w/2 - 10; //Ansonsten(also falls es der rechte Schläger ist), dann beträgt 'x'(seine x-Position) die Breite des Bildes minus die Hälfte der Breite des Schlägers(20:2=10) minus 10
    }
  }
 
  
  void update() { //Attribute der Schlägern werden "aktualisiert"
    y += ychange; // '+=' kombiniert Addition und Gleichheit. Also y(die y-Position der Schlägern) ist gleich y+ychange
    y = constrain(y, h/2, height - h/2); //beschränkt "y" auf einen maximalen und einen minimalen Wert
  }
  
  void move(float steps){ //die Variable "steps"(=Schritte) wird definiert und bei der Bewegung benutzt
    ychange = steps; //die Variable "ychange" bedeutet die Variable "steps"(=Schritte)
  }
  
  void show() { //, damit die Schläger sich zeigen
    fill(#961C82); //die Farbe der Schlägern
    rectMode(CENTER); //die Position der Rechtecken(in den Klammern wird geschrieben, wo die stehen sollen. In disem Fall ist es die Mitte) 
    rect(x,y,w,h); //Form der Schlägern(Rechtecken)
  }
 }
 ``
1 Like

Forgot about the puck so here it is

class Puck { //Eigenschaften und Methoden des Pucks werden definiert
  float x = width/2; //Variable 'x'(x-Position des Pucks)dekfinieren und ihm als Wert die Hälfte der maximalen Wert der Bildbreite zuordnen
  float y = height/2;//Variable 'y'(y-Position des Pucks)definieren und ihm als Wert die Hälfte der maximalen Bildhöhenwert zuordnen
  float xspeed; //Variable 'xspeed'(=die Geschwindigkeit der Bewegung der x-Position des Pucks) definieren 
  float yspeed; //Variable 'yspeed'(=die Geschwindigkeit der Bewegung der y-Position des Pucks) definieren 
  float r = 12; //Variable 'r'(Radius des Pucks) definieren und ihm den Wert 12(Pixel) zuordnen
  
  Puck() { 
    reset();
  } //die Funktion "reset()" wird dür den Puck erstellt
  
  
  
  void checkPaddleLeft(Paddle p) { //Der Puck prüft, ob er am linken Schläger vorbeigegangen ist(in den Klammern steht, dass "Paddle" "p" abgekürzt wird)
    if ( y < p.y + p.h/2 && y > p.y - p.h/2 && x - r < p.x + p.w/2) {
      xspeed *= -1; 
      //Falls die y-Position des Pucks kleiner als die y-Position des linken Schlägers plus die Hälfte der Höhe des linken Schlägers ist
      //und die y-Position des Pucks größer als die y-Position des linken Schlägers minus die Hälfte der Höhe des linken Schlägers  ist
      //und die x-Position des Pucks minus sein Radius kleiner als die x-Position des linken Schlägers plus die Hälfte der Breite des linken Schlägers ist, dann xspeed = xspeed*(-1) 
    }
      if(x > p.x) {
        xspeed *= -1;
        //Falls die x-Position des Pucks größer als die x-Position des linken Schlägers ist("p.x"="paddle's x"= x-Position des linken Schlägers), dann xspeed = xspeed*(-1)
    }
  }
    
  void checkPaddleRight(Paddle p) { // Der Puck prüft, ob er am rechten Schläger vorbeigegangen ist (in den Klammern steht, dass "Paddle" "p" abgekürzt wird)
    if (y < p.y + p.h/2 && y > p.y - p.h/2 && x + r > p.x - p.w/2) {
      xspeed *= -1;
      //Falls die y-Position des Pucks kleiner als die y-Position des rechten Schlägers plus die Hälfte der Höhe des rechten Schlägers ist
      //und die y-Position des Pucks größer als die y-Position des rechten Schlägers minus die Hälfte der Höhe des rechten Schlägers ist
      //und die x-Position des Pucks plus seinem Radius größer als die x-Position des rechten Schlägers minus die Hälfte der Breite des rechten Schlägers ist, dann xspeed=xspeed*(-1) (d.h. der Puck geht 1 Mal langsamer als er ging) 
      }
        if ( x < p.x) {
        xspeed *= -1;
        //Falls die x-Position des Pucks kleiner als die x-Position des rechten Schlägers ist, dann xspeed = xspeed*(-1) 
      }
    }
  
 
  void update() { //Variablen des Pucks werden "aktualisiert" 
    x = x + xspeed;//die x-Position des Pucks ist gleich seine x-Position vom Anfang des Spieles plus dem "xspeed"
    y = y + yspeed;//die y-Position des Pucks ist gleich seine y-Position vom Anfang des Spieles plus dem "yspeed"
    
  }
  
  void reset() { //der Puck wird resetiert(er geht an andere Positionen, nachdem er einer der Schlägern berührt hatte)
    x = width/2; //seine x-Position ist die Hälfte der Bildschirmbreite
    y = height/2; //seine y-Position ist die Hälfte der Bildschirmhöhe
    float angle = random(-PI/4, PI/4); //die Variable "angle"(=Winkel) wird definiert und sie ist gleich mit den Zufallspositionen von dem Viertel des PIs des Pucks im Minus-Bereich und dem Viertel des PIs des Pucks im Plus-Bereich(+PI/4 nicht einschließlich)
    xspeed = 5 * cos(angle); //"xspeed" ist gleich mit dem Cosinus von der Variable "angle" mal 5(die Funktion cos() berechnet den Cosinus eines Winkels(in den Klammern steht, dass es die Variable "angle"(=Winkel) berechnen muss, die immer neue Zufallswerte vom -PI/4 bis zum +PI/4, nicht einschließlich, hat))
    yspeed = 5 * sin(angle); //"yspeed" ist gleich mit dem Sinus von der Variable "angle" mal 5(die Funktion sin() berechnet den Sinus eines Winkels(in den Klammern steht, dass es die Variable "angle"(=Winkel) berechnen muss, die immer neue Zufallswerte vom -PI/4 bis zum +PI/4, nicht einschließlich, hat)) 
    if(random(1) < 0.5) {
      xspeed *= -1; //Falls die Zufallsposition des Pucks(vom 0 bis zum 1, aber 1 nicht einschließlich) kleiner als 0.5 ist, dann xspeed=xspeed*(-1) (also es wird 1 Mal langsamer als es war) 
    }
  }
  void edges() { //,damit der Puck nicht weiter von den Kanten/Randen geht
    if ( y < 0 || y > height) { 
       yspeed *= -1; // Falls die y-Position des Pucks kleiner als 0 ist(also ganz links) oder die y-Position größer als den maximalen Höhenwert des Bildschirms, dann yspeed = yspeed * (-1) 
    }
     if ( x - r < 0 ) {
       rightscore++; 
       reset(); //Falls die x-Position des Pucks kleiner als 0 ist(also ganz links), dann wird das Geräusch gespielt, der rechte Score wird sich erhöhen(um +1 ändern) und die Funktion reset() wird aufgerufen
     }
     if ( x + r > width ) {
       leftscore++ ;
       reset(); 
       //Falls die x-Position des Pucks größer als den maximalen Bildbreitenwert ist(d.h. ganz rechts), dann wird das Geräusch gespielt, der linke Score wird sich erhöhen(um +1 ändern) und die Funktion reset() wird aufgerufen
     }
   }
 
  void show() { //Puck zeigt sich
    fill(#961C82); //Farbe des Pucks
    ellipse(x,y,r*2,r*2); //Form des Pucks(ein Kreis)
  }
 }
1 Like

ok meanwhile a short check
just run it to compare the logic

// https://discourse.processing.org/t/score-doesnt-work/9418/
// score doesn,t work
int leftscore = 0;
int rightscore = 0;
int x=20, y=x, yspeed = 2, xspeed = 1, r=x;

void edges() {
  if ( y < r || y > height-r) { 
    yspeed *= -1;
    println("yspeed "+yspeed);
  }
  if ( x < r ) {
    rightscore++ ;
    xspeed *= -1;
    println("rightscore++"+rightscore);
    //    reset();
  }
  if ( x > width-r ) {
    leftscore++ ;
    xspeed *= -1;
    println("leftscore++"+leftscore);
    //    reset();
  }
}

void setup() {
  size(500, 500);
}

void draw() {
  background(200, 200, 0);
  stroke(200, 0, 0);
  circle(x, y, 2*r);
  x +=    xspeed;
  y +=    yspeed;
  edges();
}

1 Like

Uhm… The circle() isn’t defined

lol from processing 3.5.3 there is a circle ( my code runs here )

anyhow i think i see your problem.

the edges() function does the y change,
but the x change has no chance to run,
as the:
checkPaddleLeft(Paddle p)
if (x > p.x) xspeed *= -1;
checkPaddleRight(Paddle p)
if ( x < p.x) xspeed *= -1;

change the x speed some pix earlier…

just disable that part.

the version i play with:

// https://discourse.processing.org/t/score-doesnt-work/9418/
// score doesn,t work


// Objekten
Puck puck; //Der Puck

Paddle left; //Der linke Schläger
Paddle right; //Der rechte Schläger 

int leftscore = 0; //Linken Score beträgt 0 Punkte am Anfang des Spieles
int rightscore = 0;//Rechten Score beträgt 0 Punkte am Anfang des Spieles


//"void" definiert eine Methode ohne Rückgabewert
void setup() { //Befehle, die zu Anfangs ×1 ausgeführt werden
  size(600, 400); //Größe(in Pixel)
  puck = new Puck(); //neues Objekt(in disem Fall der Puck)wird gemacht
  left = new Paddle(true);  
  right = new Paddle(false);
  // so könnte das Programm wissen, dass es 2 verschiedene Schläger gibt
} 

void draw() { //nachdem setup() werden die Befehle bei draw() ohne Ende ausgeführt
  background(#D9A8D1); //Hintergrundfarbe

  //Funktionenserstellungen
  puck.checkPaddleLeft(left); //,damit der Puck "wissen" kann, wann er den linken Schläger berührt
  puck.checkPaddleRight(right);//,damit der Puck "wissen" kann, wann er den rechten Schläger berührt

  left.show(); //,damit der linke Schläger "sich zeigt"
  right.show();//,damit der rechte Schläger "sich zeigt"
  left.update();//,um z.B.die Werten die beim linken Schläger geschrieben wurden zu  "aktualisieren"(z.B. neue informationen über bestimmte Variablen und ihre Werte geben)
  right.update();//es werden Informationen "aktualisiert" wie z.B. in diesem Fall die Werte den Variablen des rechten Schlägers 

  puck.edges();//,damit der Puck nicht weiter von der Kante geht
  puck.update();//es werden Informationen über den Puck "aktualisiert" wie z.B. die Werte den Variablen 
  puck.show();//,damit der Puck "sich zeigt"


  fill(255); //Farbe des Textes(des Scores)
  textSize(32); //Größe des Textes
  text(leftscore, 32, 40); //Position des linken Textes 
  text(rightscore, width-64, 40); //Position des rechten Rextes
} 

void keyReleased() { // Funktion, die bei jedem Loslassen einer Taste aufgerufen wird
  left.move(0); // der linke Schläger bewegt sich gar nicht mehr
  right.move(0); // der rechte Schläger bewegt sich gar nicht mehr
}


void keyPressed() { //Funktion für das Drucken von Tasten(muss in draw() stehen, damit es sich nicht nur einmal wiederholt)
  if (key == 'a') {
    left.move(-10); //Falls die Taste 'a' gedruckt wird, dann geht der linke Schläger 10 Schritte nach unten
  } else if ( key == 'd') {
    left.move(10); //Falls die Taste 'd' gedruckt wird, dann geht der linke Schläger 10 Schrite nach oben
  }
  if (key == 'j') { 
    right.move(-10); //Falls die Taste 'j' gedruckt wird, dann bewegt sich der rechte Schläger 10 Schritte nach unten
  } else if (key == 'l') {
    right.move(10); //Falls die Taste 'l' gedruckt wird, dann bewegt sich der rechte Schläger 10 Schritte nach oben
  }
}

class Paddle { //Funktionen und Attribute des Schlägers werden definiert
  float x; //Variable 'x'(x-Position) definieren
  float y = height/2; //Variable 'y'(y-Position) definieren und es als Wert die Hälfte des Bildhöhenwerts zuordnen
  float w = 20; //Variable 'w'(width=Breite des Schlägers)definieren und es den Wert 20 (20 Pixel) zuordnen 
  float h = 100; //Variable 'h'(height=Höhe des Schlägers)definieren und es den Wert 100 (100 Pixel) zuordnen 
  float ychange = 0; //Variable, die die Menge an Pixeln bei Änderungen der y-Position (oder bei der vertikalen Bewegung des Pucks) jedes Mal durch draw() speichert(sie wird definiert und den Wert 0 am Anfang des Spieles bekommen) 

  Paddle (boolean left) { //Ist es der linke oder der rechte Schläger?('boolean' wird für eine Variable, die nur zwei Werte haben kann, benutzt('true' oder 'false'))
    if (left) { 
      x = w/2 + 10; //Falls es der linke ist, dann beträgt 'x'(seine x-Position) die Hälfte seiner Breite (d.h. 20:2=10) plus 10
    } else {
      x = width - w/2 - 10; //Ansonsten(also falls es der rechte Schläger ist), dann beträgt 'x'(seine x-Position) die Breite des Bildes minus die Hälfte der Breite des Schlägers(20:2=10) minus 10
    }
  }


  void update() { //Attribute der Schlägern werden "aktualisiert"
    y += ychange; // '+=' kombiniert Addition und Gleichheit. Also y(die y-Position der Schlägern) ist gleich y+ychange
    y = constrain(y, h/2, height - h/2); //beschränkt "y" auf einen maximalen und einen minimalen Wert
  }

  void move(float steps) { //die Variable "steps"(=Schritte) wird definiert und bei der Bewegung benutzt
    ychange = steps; //die Variable "ychange" bedeutet die Variable "steps"(=Schritte)
  }

  void show() { //, damit die Schläger sich zeigen
    fill(#961C82); //die Farbe der Schlägern
    rectMode(CENTER); //die Position der Rechtecken(in den Klammern wird geschrieben, wo die stehen sollen. In disem Fall ist es die Mitte) 
    rect(x, y, w, h); //Form der Schlägern(Rechtecken)
  }
}

class Puck { //Eigenschaften und Methoden des Pucks werden definiert
  float x = width/2; //Variable 'x'(x-Position des Pucks)dekfinieren und ihm als Wert die Hälfte der maximalen Wert der Bildbreite zuordnen
  float y = height/2;//Variable 'y'(y-Position des Pucks)definieren und ihm als Wert die Hälfte der maximalen Bildhöhenwert zuordnen
  float xspeed; //Variable 'xspeed'(=die Geschwindigkeit der Bewegung der x-Position des Pucks) definieren 
  float yspeed; //Variable 'yspeed'(=die Geschwindigkeit der Bewegung der y-Position des Pucks) definieren 
  float r = 12; //Variable 'r'(Radius des Pucks) definieren und ihm den Wert 12(Pixel) zuordnen

  Puck() { 
    reset();
  } //die Funktion "reset()" wird dür den Puck erstellt



  void checkPaddleLeft(Paddle p) { //Der Puck prüft, ob er am linken Schläger vorbeigegangen ist(in den Klammern steht, dass "Paddle" "p" abgekürzt wird)
    if ( y < p.y + p.h/2 && y > p.y - p.h/2 && x - r < p.x + p.w/2)  xspeed *= -1; 
      //Falls die y-Position des Pucks kleiner als die y-Position des linken Schlägers plus die Hälfte der Höhe des linken Schlägers ist
      //und die y-Position des Pucks größer als die y-Position des linken Schlägers minus die Hälfte der Höhe des linken Schlägers  ist
      //und die x-Position des Pucks minus sein Radius kleiner als die x-Position des linken Schlägers plus die Hälfte der Breite des linken Schlägers ist, dann xspeed = xspeed*(-1)

//kll    if (x > p.x)   xspeed *= -1; //Falls die x-Position des Pucks größer als die x-Position des linken Schlägers ist("p.x"="paddle's x"= x-Position des linken Schlägers), dann xspeed = xspeed*(-1)
  }

  void checkPaddleRight(Paddle p) { // Der Puck prüft, ob er am rechten Schläger vorbeigegangen ist (in den Klammern steht, dass "Paddle" "p" abgekürzt wird)
    if (y < p.y + p.h/2 && y > p.y - p.h/2 && x + r > p.x - p.w/2)   xspeed *= -1;
      //Falls die y-Position des Pucks kleiner als die y-Position des rechten Schlägers plus die Hälfte der Höhe des rechten Schlägers ist
      //und die y-Position des Pucks größer als die y-Position des rechten Schlägers minus die Hälfte der Höhe des rechten Schlägers ist
      //und die x-Position des Pucks plus seinem Radius größer als die x-Position des rechten Schlägers minus die Hälfte der Breite des rechten Schlägers ist, dann xspeed=xspeed*(-1) (d.h. der Puck geht 1 Mal langsamer als er ging)

//kll    if ( x < p.x)  xspeed *= -1; //Falls die x-Position des Pucks kleiner als die x-Position des rechten Schlägers ist, dann xspeed = xspeed*(-1)
  }


  void update() { //Variablen des Pucks werden "aktualisiert" 
    x = x + xspeed;//die x-Position des Pucks ist gleich seine x-Position vom Anfang des Spieles plus dem "xspeed"
    y = y + yspeed;//die y-Position des Pucks ist gleich seine y-Position vom Anfang des Spieles plus dem "yspeed"
  }

  void reset() { //der Puck wird resetiert(er geht an andere Positionen, nachdem er einer der Schlägern berührt hatte)
    x = width/2; //seine x-Position ist die Hälfte der Bildschirmbreite
    y = height/2; //seine y-Position ist die Hälfte der Bildschirmhöhe
    float angle = random(-PI/4, PI/4); //die Variable "angle"(=Winkel) wird definiert und sie ist gleich mit den Zufallspositionen von dem Viertel des PIs des Pucks im Minus-Bereich und dem Viertel des PIs des Pucks im Plus-Bereich(+PI/4 nicht einschließlich)
    xspeed = 5 * cos(angle); //"xspeed" ist gleich mit dem Cosinus von der Variable "angle" mal 5(die Funktion cos() berechnet den Cosinus eines Winkels(in den Klammern steht, dass es die Variable "angle"(=Winkel) berechnen muss, die immer neue Zufallswerte vom -PI/4 bis zum +PI/4, nicht einschließlich, hat))
    yspeed = 5 * sin(angle); //"yspeed" ist gleich mit dem Sinus von der Variable "angle" mal 5(die Funktion sin() berechnet den Sinus eines Winkels(in den Klammern steht, dass es die Variable "angle"(=Winkel) berechnen muss, die immer neue Zufallswerte vom -PI/4 bis zum +PI/4, nicht einschließlich, hat)) 
    if (random(1) < 0.5) {
      xspeed *= -1; //Falls die Zufallsposition des Pucks(vom 0 bis zum 1, aber 1 nicht einschließlich) kleiner als 0.5 ist, dann xspeed=xspeed*(-1) (also es wird 1 Mal langsamer als es war)
    }
  }

  void edges() { //,damit der Puck nicht weiter von den Kanten/Randen geht
    if ( y < 0 || y > height) { 
      yspeed *= -1; // Falls die y-Position des Pucks kleiner als 0 ist(also ganz links) oder die y-Position größer als den maximalen Höhenwert des Bildschirms, dann yspeed = yspeed * (-1)
      println("yspeed "+yspeed);
  }
    if ( x - r < 0 ) {
      rightscore++;
      println("rightscore++"+rightscore); // kll
      reset(); //Falls die x-Position des Pucks kleiner als 0 ist(also ganz links), dann wird das Geräusch gespielt, der rechte Score wird sich erhöhen(um +1 ändern) und die Funktion reset() wird aufgerufen
    }
    if ( x + r > width ) {
      leftscore++ ;
      println("leftscore++"+leftscore);  // kll
      reset(); 
      //Falls die x-Position des Pucks größer als den maximalen Bildbreitenwert ist(d.h. ganz rechts), dann wird das Geräusch gespielt, der linke Score wird sich erhöhen(um +1 ändern) und die Funktion reset() wird aufgerufen
    }
  }
  
  void show() { //Puck zeigt sich
    fill(#961C82); //Farbe des Pucks
    ellipse(x, y, r*2, r*2); //Form des Pucks(ein Kreis)
  }
}








/*
int leftscore = 0;
 int rightscore = 0;
 int x=20, y=x, yspeed = 2, xspeed = 1, r=x;
 
 void edges() {
 if ( y < r || y > height-r) { 
 yspeed *= -1;
 println("yspeed "+yspeed);
 }
 if ( x < r ) {
 rightscore++ ;
 xspeed *= -1;
 println("rightscore++"+rightscore);
 //    reset();
 }
 if ( x > width-r ) {
 leftscore++ ;
 xspeed *= -1;
 println("leftscore++"+leftscore);
 //    reset();
 }
 }
 
 void setup() {
 size(500, 500);
 }
 
 void draw() {
 background(200, 200, 0);
 stroke(200, 0, 0);
 circle(x, y, 2*r);
 x +=    xspeed;
 y +=    yspeed;
 edges();
 }
  
 */

2 Likes

Wow. OMG it works!
Wait a minute, wait a minute.
Then why did it work for the person who made the tutorial anyway? Like he didn’t disable that part but it still worked for him lol. The score simply hates me, it always gives me a headache every time I do a game XD
THANK YOU SO MUCH!!!
Could you please explain me why I had to disable that part of the code though? I didn’t really get the reason, sorry.

after i inserted the
println("");
i learned that this lines of logic ( change speed at left or right border )
actually never active,
but the ball ( puck ) moved left and right anyway
so i searched for a other part of code what changed the xspeed.
the paddle does it too ( and earlier ) ( and if the paddle is missed by the puck )

why it worked earlier?
it looks like there are 2 parameter involved:

  • the paddle position p.x
  • the ball radius r

so when you changed one, the dysfunctional logic got activated.

if you work with the PDE editor
( and i hope you upgraded to processing 3.5.3 )
you can use:
/ Edit / Find / “xspeed” ( or [ctrl][f] )
to find all occurrences of a text fast.
and so it is possible to find and repair small things,
without reading or even understanding the whole thing.

2 Likes

Thank you!! This is really helpful😊

the simples way is to make this work efficiently is to make the program add one to itself every time you need it.
eg:

int leftscore=0;
int rightscore=0;
if(//do your collision here){
leftscore=leftscore+1;}

this way is much simple, less complex and does not give way to bugs.
catch me on my facebook page for free tutorial
david wrld