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