Help on reset draw()

Hello there,
here is my code for a tic tac toe game. How can I reset the game by pressing the reset button? I only want to reset draw(). Is there any way to do this?

int rows = 3;
int cols = 3;

int [] [] matrix = new int [rows] [cols];

boolean pauseDraw = false;



void setup() {
  size(600, 600);
  background(255, 0, 0);
  for (int i = 0; i < cols; i++) {
  for (int j = 0; j < rows; j++) {
    matrix[i][j] = 0;
  }
  }
  strokeWeight(6);
  line(0, 200, 600, 200);
  line(0, 400, 600, 400);
  line(200, 0, 200, 600);
  line(400, 0, 400, 600);
}


int checkRow (int row) {
  if (matrix [0] [row] == 1 && matrix [1] [row] == 1 && matrix [2] [row] == 1) {
    return 1; }
  else if (matrix [0] [row] == 2 && matrix [1] [row] == 2 && matrix [2] [row] == 2) {
    return 2; }
  return 0; 
}


int checkCol (int col) {
  if (matrix [col] [0] == 1 && matrix [col] [1] == 1 && matrix [col] [2] == 1) {
    return 1; }
  else if (matrix [col] [0] == 2 && matrix [col] [1] == 2 && matrix [col] [2] == 2) {
    return 2; }
  return 0;
}

void drawRes (int res) {
  String out = "looser";
  if (res == 1) {
    out = "Kreuz gewinnt"; }
   else if (res == 2) {
    out = "Kreis gewinnt"; }
   fill(0, 255, 0);
   textSize(75);
   text(out, width/14, height/2);
   pauseDraw = true;
   textSize(26);
   rect(220, 380, 160, 40);
   fill(0);
   text("reset", 265, 408);
}

void cross(int cross1X,int cross1Y,int cross2X,int cross2Y,int cross3X,int cross3Y,int cross4X,int cross4y) {
    line(cross1X, cross1Y, cross2X, cross2Y);
    line(cross3X, cross3Y, cross4X, cross4y);
  }
  
  void circle(int middle,int radius) {
    circle(middle, radius);
  }

void draw() {
  
if (pauseDraw) {
   return; }
  
  //Feld
  
  
  if (keyPressed) {
    //Kreuze
   if (mouseX <= 200 && mouseY <= 200) {
    if (key == 'x') {
       cross(20, 180, 180, 20, 20, 20, 180, 180);
       matrix [0][0] = 1; }
    else if (key == 'o') {
       fill(255, 0, 0);
       circle(100, 100, 180);
       matrix [0][0] = 2; }
   }
   if (mouseX >= 200 && mouseY <= 200 && mouseX <= 400) {
     if (key == 'x') {
       cross(220, 180, 380, 20, 220, 20, 380, 180);
       matrix [1][0] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(300, 100, 180);
       matrix [1][0] = 2; }
   }
   if (mouseX >= 400 && mouseY <= 200) {
     if (key == 'x') {
       cross(420, 180, 580, 20, 420, 20, 580, 180);
       matrix [2][0] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(500, 100, 180);
       matrix [2][0] = 2; }
   }
   if (mouseX <= 200 && mouseY <= 400 && mouseY >= 200) {
     if (key == 'x') {
       cross(20, 380, 180, 220, 20, 220, 180, 380);
       matrix [0][1] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(100, 300, 180);
       matrix [0][1] = 2; }
   }
   if (mouseX >= 200 && mouseX <= 400 && mouseY >= 200 && mouseX <= 400 && mouseY <= 400) {
     if (key == 'x') {
       cross(220, 380, 380, 220, 220, 220, 380, 380);
       matrix [1][1] = 1; }
     if (key == 'o') {
       fill(255, 0, 0);
       circle(300, 300, 180);
       matrix [1][1] = 2; }
   }
   if (mouseX >= 400 && mouseY >= 200 && mouseY <= 400) {
     if (key == 'x') {
       cross(420, 380, 580, 220, 420, 220, 580, 380);
       matrix [2][1] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(500, 300, 180);
       matrix [2][1] = 2; }
   }
   if (mouseY >= 400 && mouseX <= 200) {
     if (key == 'x') {
       cross(20, 580, 180, 420, 20, 420, 180, 580);
       matrix [0][2] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(100, 500, 180);
       matrix [0][2] = 2; }
   }
   if (mouseX >= 200 && mouseY >= 400 && mouseX <= 400) {
     if (key == 'x') {
     cross(220, 580, 380, 420, 220, 420, 380, 580);
     matrix [1][2] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(300, 500, 180);
       matrix [1][2] = 2; }
   }
   if (mouseX >= 400 && mouseY >= 400) {
     if (key == 'x') {
       cross(420, 580, 580, 420, 420, 420, 580, 580);
       matrix [2][2] = 1; }
     else if (key == 'o') {
       fill(255, 0, 0);
       circle(500, 500, 180);
       matrix [2][2] = 2; }
   }
  }
  for (int row = 0; row < rows; row++) {
    int res = checkRow (row);
    if (res == 1 || res == 2) {
      drawRes(res); }
  }
  for (int col = 0; col < cols; col++) {
    int res = checkCol (col);
    if (res == 1 || res == 2) {
      drawRes(res); }
  }
}
1 Like

Ja, nimm dir den Inhalt aus setup (außer size()) und pack sie in eine neue Funktion und rufe diese auf

2 Likes

Danke für die Antwort. Es hat funktioniert ;). Kann ich auch im Endscreen verhindern, dass man weiter Kreuze und Kreise zeichnen kann? Ich mein so, dass der reset in draw() auch noch funktioniert.

1 Like

Ja, du kannst die Maus/Key-Abfragen mit einer if-Abfrage umgeben.

Diese kann dann eine Variable gameOver abfragen.

If (gameOver == false) { 

     if (keyPressed) {
    //Kreuze
    ......

gameOver musst du dann true setzen, wenn einer gewonnen hat

1 Like

Bezüglich der Architektur deines Programms:

Es wäre natürlich schön, wenn du speichern kannst, wer am Zug ist, X oder O (boolean spielerSIstAmZug=true;).
Wenn du dann die Maus in ein Feld klickst, erscheint X oder O. Dann musst du nicht den key abfragen, der Mausklick reicht.

Dann würde der Code Block in die Funktion mousePressed() wandern.

Darüberhinaus hat das Programm verschiedene Zustände:

  • Begrüßungsbildschirmm,
  • Spiel,
  • X hat gewonnen,
  • O hat gewonnen.

Dies bildest du nun implizit durch die Var pauseDraw und if (res == 1 || res == 2) { ab.

Diese Zustände kannst du in einer expliziten Variable int state speichern; wenn sie 0 ist, bedeutet das Begrüßungsbildschirm, 1 bedeutet Game und 2 bedeutet X hat gewonnen, 3 bedeutet O hat gewonnen.
Dann kommst du zu einer klareren Struktur von draw():

switch(state) {
case 0: 
// Begrüßungsbildschirmm;
break; 

case 1:
//Game
break;

case 2: 
// X hat gewonnen
break;

case 3:
// bedeutet O hat gewonnen. 
break; 

}// switch

Chrisir

2 Likes

Vielen Dank für deine Tipps! Waren sehr hilfreich :slight_smile:

1 Like

Ich hätte noch eine Frage:
Ich habe jetzt das Problem, wenn ich auf den Resetknopf drücke, dass es direkt das erste X oder O auf dem Feld unter dem Resetknopf zeichnet. Gibt es dafür eine einfache Lösung? Irgendwie ein Cooldown, dass es nicht sofort wieder zeichnet oder so…
Vielen Dank für deine Mühe :wink:

Hier noch mein momentaner Code:

int rows = 3;
int cols = 3;

int [] [] matrix = new int [rows] [cols];

boolean pauseDraw = false;

boolean gameOver = false;

boolean spielerXIstAmZug = true;

boolean spielerOIstAmZug = false;

//setup/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void setup() {
  size(600, 700);
  background(255, 0, 0);
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
    matrix[i][j] = 0;
    }
  }
  strokeWeight(6);
  line(0, 200, 600, 200);
  line(0, 400, 600, 400);
  line(200, 0, 200, 600);
  line(400, 0, 400, 600);
  line(0, 600, 600, 600);
  fill(0, 191, 255);
  textSize(40);
  text("Kreuz ist am Zug", 140, 650);
  noLoop();
}

//Funktionen///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int checkRow (int row) {
  if (matrix [0] [row] == 1 && matrix [1] [row] == 1 && matrix [2] [row] == 1) {
    return 1; }
  else if (matrix [0] [row] == 2 && matrix [1] [row] == 2 && matrix [2] [row] == 2) {
    return 2; }
  return 0; 
}
    
int checkDia (int dia) {
if (matrix [0] [0] == 1 && matrix [1] [1] == 1 && matrix [2] [2] == 1 || matrix [2] [0] == 1 && matrix [1] [1] == 1 && matrix [0] [2] == 1) {
    return 1; }
  else if (matrix [2] [0] == 2 && matrix [1] [1] == 2 && matrix [0] [2] == 2 || matrix [0] [0] == 2 && matrix [1] [1] == 2 && matrix [2] [2] == 2) {
    return 2; }
  return 0; 
}
    
int checkCol (int col) {
  if (matrix [col] [0] == 1 && matrix [col] [1] == 1 && matrix [col] [2] == 1) {
    return 1; }
  else if (matrix [col] [0] == 2 && matrix [col] [1] == 2 && matrix [col] [2] == 2) {
    return 2; }
  return 0;
}

void playerO () {
  stroke(255,0,0);
  fill(255, 0, 0);
  rect(0, 605, 600, 100);
  fill(0, 191, 255);
  textSize(40);
  text("Kreuz ist am Zug", 140, 650);
  stroke(0);
}

void playerX () {
  stroke(255,0,0);
  fill(255, 0, 0);
  rect(0, 605, 600, 100);
  fill(0, 191, 255);
  textSize(40);
  text("Kreis ist am Zug", 140, 650);
  stroke(0);
}

void reset() {
  background(255, 0, 0);
  for (int i = 0; i < cols; i++) {
  for (int j = 0; j < rows; j++) {
    matrix[i][j] = 0;
  }
  }
  strokeWeight(6);
  line(0, 200, 600, 200);
  line(0, 400, 600, 400);
  line(200, 0, 200, 600);
  line(400, 0, 400, 600);
  line(0, 600, 600, 600);
  noLoop();
}

void drawRes (int res) {
  String out = "looser";
  if (res == 1) {
    gameOver = true;
    out = "Kreuz gewinnt"; }
   else if (res == 2) {
    gameOver = true;
    out = "Kreis gewinnt"; }
   fill(0, 255, 0);
   textSize(75);
   text(out, width/14, height/2);
   pauseDraw = true;
   textSize(26);
   rect(220, 380, 160, 40);
   fill(0);
   text("reset", 265, 408);
}

void cross(int cross1X,int cross1Y,int cross2X,int cross2Y,int cross3X,int cross3Y,int cross4X,int cross4y) {
    line(cross1X, cross1Y, cross2X, cross2Y);
    line(cross3X, cross3Y, cross4X, cross4y);
  }
  
  void circle(int middle,int radius) {
    circle(middle, radius);
  }
  
   
void mousePressed() {
    redraw();
}

void draw() {

  //Reset////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (mousePressed) {
    
    if (mouseX >= 220 && mouseX <= 380 && mouseY >= 380 && mouseY <= 420) {
    gameOver = false;
    reset(); }
    
    //
    if (gameOver == false) {
    //Kreuze & Kreise/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     if (mouseX <= 200 && mouseY <= 200) {
      if (spielerXIstAmZug == true) {
        playerX (); 
        cross(20, 180, 180, 20, 20, 20, 180, 180);
         matrix [0][0] = 1; }
      else if (spielerOIstAmZug == true) {
         playerO (); 
         fill(255, 0, 0);
         circle(100, 100, 180);
         matrix [0][0] = 2; }
     }
     if (mouseX >= 200 && mouseY <= 200 && mouseX <= 400) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(220, 180, 380, 20, 220, 20, 380, 180);
         matrix [1][0] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(300, 100, 180);
         matrix [1][0] = 2; }
     }
     if (mouseX >= 400 && mouseY <= 200) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(420, 180, 580, 20, 420, 20, 580, 180);
         matrix [2][0] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(500, 100, 180);
         matrix [2][0] = 2; }
     }
     if (mouseX <= 200 && mouseY <= 400 && mouseY >= 200) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(20, 380, 180, 220, 20, 220, 180, 380);
         matrix [0][1] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(100, 300, 180);
         matrix [0][1] = 2; }
     }
     if (mouseX >= 200 && mouseX <= 400 && mouseY >= 200 && mouseX <= 400 && mouseY <= 400) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(220, 380, 380, 220, 220, 220, 380, 380);
         matrix [1][1] = 1; }
       if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(300, 300, 180);
         matrix [1][1] = 2; }
     }
     if (mouseX >= 400 && mouseY >= 200 && mouseY <= 400) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(420, 380, 580, 220, 420, 220, 580, 380);
         matrix [2][1] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(500, 300, 180);
         matrix [2][1] = 2; }
     }
     if (mouseY >= 400 && mouseX <= 200 && mouseY <= 600) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(20, 580, 180, 420, 20, 420, 180, 580);
         matrix [0][2] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(100, 500, 180);
         matrix [0][2] = 2; }
     }
     if (mouseX >= 200 && mouseY >= 400 && mouseX <= 400 && mouseY <= 600) {
       if (spielerXIstAmZug == true) {
       playerX ();
       cross(220, 580, 380, 420, 220, 420, 380, 580);
       matrix [1][2] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(300, 500, 180);
         matrix [1][2] = 2; }
     }
     if (mouseX >= 400 && mouseY >= 400 && mouseY <= 600) {
       if (spielerXIstAmZug == true) {
         playerX ();
         cross(420, 580, 580, 420, 420, 420, 580, 580);
         matrix [2][2] = 1; }
       else if (spielerOIstAmZug == true) {
         playerO ();
         fill(255, 0, 0);
         circle(500, 500, 180);
         matrix [2][2] = 2; }
     }
    }
    spielerOIstAmZug =  spielerXIstAmZug;
    spielerXIstAmZug = !spielerOIstAmZug;
  }
    //Abruf Ergebnis//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  for (int row = 0; row < rows; row++) {
    int res = checkRow (row);
    if (res == 1 || res == 2) {
      drawRes(res); }
  }
  for (int col = 0; col < cols; col++) {
    int res = checkCol (col);
    if (res == 1 || res == 2) {
      drawRes(res); }
  }
  
  for (int dia = 0; dia < cols; dia++) {
    int res = checkDia (dia);
    if (res == 1 || res == 2) {
      drawRes(res); }
  }
}
1 Like

Vielleicht ein großer Schritt:

du hast in draw() dieses hier:

//Reset////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  if (mousePressed) {

Den ganzen Abschnitt könntest du in eine neue Funktion

void mousePressed() {

}

verschieben.

Dies wird aufgrund ihres Namens von processing automatisch aufgerufen.

Sie heißt genauso wie die Variable, die du nun nutzt, ist aber etwas anderes.

Da die Funktion mousePressed() mit Klammern!!! nur 1x pro Klick aufgerufen wird, dürfte dies dein Problem beheben.

Chrisir

1 Like