Maison > Java > tic tac toe dans le traitement java

tic tac toe dans le traitement java

PHPz
Libérer: 2024-02-22 12:52:06
avant
831 Les gens l'ont consulté

PHP Editor Strawberry vous présente la dernière chronique de questions et réponses Java. Ce numéro explorera les problèmes liés à la gestion du jeu tic tac toe (tic-tac-toe) en Java. Que vous soyez débutant ou développeur expérimenté, vous trouverez ici des conseils pratiques et des solutions pour gérer le jeu Tic-Tac-Toe en Java. Apprenons-en davantage sur ce sujet intéressant et améliorons vos compétences dans le domaine de la programmation Java !

Contenu de la question

Je travaille actuellement sur un simple jeu de tic-tac-toe, mais je rencontre des problèmes dans deux domaines :

Problèmes de placement : Les symboles x et o ne sont pas placés correctement sur la grille. L'emplacement semble être aléatoire et je ne sais pas pourquoi. Chaque fois que je clique sur une case, elle ne semble pas être placée dans cette case coordonnée

Problème de clic de souris : J'ai configuré le clic gauche pour placer le x et le clic droit pour placer le o, mais cela ne semble pas fonctionner comme prévu.

Voici mon code actuel :

// Declare a 3x3 grid of TicTacToeBox objects
TicTacToeBox[][] grid = new TicTacToeBox[3][3];

// gameStatus:
// 0 - Display Home screen
// 1 - Display Tic Tac Toe grid
// 2 - Display Game over screen
int gameStatus = 0;

// Determine which player's turn it is 
int currentPlayer = 1;

void setup() {
  size(600, 600);
  displayHomeScreen();
}

void draw() {
  // Draw the appropriate screen based on gameStatus
  if (gameStatus == 1) {
    background(255);
    displayGrid();
  } else if (gameStatus == 2) {
    background(0);
    displayGameOver();
  }
}

void mousePressed() {
  // Check the gameStatus and respond to mouse clicks accordingly
  if (gameStatus == 1) {
    float boxSize = width / 3.0;
    int col = floor(mouseX / boxSize);
    int row = floor(mouseY / boxSize);

    // Check if the box is valid and empty
    if (isValidBox(row, col) && grid[row][col].symbol == ' ') {
      // Place X or O based on the mouse button and currentPlayer
      if (mouseButton == LEFT && currentPlayer == 1) {
        grid[row][col].symbol = 'X';
        currentPlayer = 2;
      } else if (mouseButton == RIGHT && currentPlayer == 2) {
        grid[row][col].symbol = 'O';
        currentPlayer = 1;
      }
    }
  } else if (gameStatus == 0 && mouseX > 250 && mouseX < 350 && mouseY > 250 && mouseY < 300) {
    // Transition to the game screen when PLAY is clicked
    gameStatus = 1;
  }
}

void displayGrid() {
  float boxSize = width / 3.0;

  // Loop through the grid and draw each TicTacToeBox
  for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
      if (grid[row][col] == null) {
        grid[row][col] = new TicTacToeBox(row, col, boxSize, ' ');
      }
      grid[row][col].draw();
    }
  }
}

// Check if the row and column are clear to place
boolean isValidBox(int row, int col) {
  return row >= 0 && row < 3 && col >= 0 && col < 3;
}

void displayHomeScreen() {
  // Display the home screen with instructions
  background(255);
  fill(0);
  textAlign(CENTER, TOP);
  textSize(50);
  text("Tic-Tac-Toe", width/2, 100);
  textSize(25);
  fill(0);
  text("Click PLAY to start", width/2, 200);
  noFill();
  rect(250, 250, 100, 50);
  textSize(20);
  fill(0);
  text("PLAY", width/2, 265);
}

void displayGameOver() {
  // Display the game over screen with a prompt to play again
  fill(255, 0, 0);
  textAlign(CENTER, TOP);
  textSize(50);
  text("GAME OVER!", width/2, 100);
  textSize(25);
  fill(0, 0, 255);
  text("CLICK TO PLAY AGAIN", width/2, 200);
}

class TicTacToeBox {
  float x;
  float y;
  float boxSize;
  char symbol = ' ';

  TicTacToeBox(float x, float y, float boxSize, char symbol) {
    this.x = x;
    this.y = y;
    this.boxSize = boxSize;
    this.symbol = symbol;
  }

  void draw() {
    stroke(0);
    noFill();
    rect(x * boxSize, y * boxSize, boxSize, boxSize);
    textAlign(CENTER, CENTER);
    textSize(32);
    fill(0);
    float symbolX = x * boxSize + boxSize/2;
    float symbolY = y * boxSize + boxSize/2;
    text(symbol, symbolX, symbolY);
  }
}
Copier après la connexion

Solution

Le code source suivant montre l'utilisation d'un tableau de classe rect pour créer une grille 3x3 pour suivre les pressions de la souris. Peut-être qu'une technique similaire pourrait être utilisée dans votre jeu.

rect[] r;

final int _numcols = 3;
final int _numrows = 3;

final int _wndw = 400;
final int _wndh = 400;

class rect {
  int x, y, w, h;
  boolean leftpressed = false;
  boolean rightpressed = false;

  // constructor
  rect(int xpos, int ypos, int wide, int ht) {
    x = xpos;
    y = ypos;
    w = wide;
    h = ht;
  }

  void display(int id) {
    fill(255); // background color
    rect(x, y, w, h);
    fill(0); // text color
    textsize(18);
    text(str(id), x + w - 18, y + 18);
  }
}

void rectgrid(int left, int top, int w, int h, int vg, int hg) {
  int id = 0;
  // build by row
  for (int k = 0; k < _numrows; k++) {
    for (int j = 0; j < _numcols; j++) {
      int x = left + j*(w+vg);
      int y = top + k*(h+hg);
      r[id] = new rect(x, y, w, h);
      id++;
    }
  }
}

void setup() {
  size(_wndw, _wndh);
  background(0, 0, 245);
  r = new rect[_numrows*_numcols];
  rectgrid(0, 0, _wndw/_numcols, _wndh/_numrows, 0, 0);
}

void draw() {
  for (int i = 0; i < r.length; i++) {
    r[i].display(i); // display each object
    if (r[i].leftpressed == true) {
      text("x", r[i].x + r[i].w/2, r[i].y + r[i].h/2);
    }
    if (r[i].rightpressed == true) {
      text("o", r[i].x + r[i].w/2, r[i].y + r[i].h/2);
    }
  }
}

void mousepressed() {
  for (int i = 0; i < r.length; i++) {
    if ((mousex >= r[i].x) && (mousex <= r[i].x +r[i].w) && (mousey >= r[i].y) && (mousey <= r[i].y + r[i].h)) {
      println("id =", i);
      if (mousebutton == left) {
        r[i].leftpressed = true;
      }
      if (mousebutton == right) {
        r[i].rightpressed = true;
      }
    }
  }
}
Copier après la connexion

Recommandation : Votre grille n'a pas besoin d'un tableau 2D ; un tableau 1D fonctionne bien et n'est pas trop complexe. J'ajouterai deux booléens (leftpressed et rightpressed) à la classe grid et supprimerai le paramètre symbolique. La méthode "draw()" de la classe grid devrait probablement être renommée en quelque chose comme "display()" puisque "draw" est un mot-clé dans le traitement pour éviter toute confusion. Les méthodes displaygrid() et isvalidbox() peuvent être supprimées en toute sécurité à l'aide de la technique présentée ci-dessous. Le principal changement de code devrait être dans mousepressed() car il ne fonctionne pas correctement. Une boucle dans chaque case de la grille capturera correctement les clics sur les boutons de la souris, vous pourrez alors vérifier si le bouton droit ou gauche de la souris a été cliqué, et vous pourrez définir le booléen correspondant sur "true". Le "draw()" principal utilisera ensuite ces informations pour dessiner le "x" ou le "o". Je sais que cela semble beaucoup, mais ces changements sont un moyen de résoudre votre problème. Votre code source modifié ressemble à ceci :

// Declare a 3x3 grid of TicTacToeBox objects
Grid[] g = new Grid[9];

// gameStatus:
// 0 - Display Home screen
// 1 - Display Tic Tac Toe grid
// 2 - Display Game over screen
int gameStatus = 0;

// Determine which player's turn it is
int currentPlayer = 1;

class Grid {
  float x;
  float y;
  float boxSize;
  boolean leftPressed = false;
  boolean rightPressed = false;

  Grid(float x, float y, float boxSize) {
    this.x = x;
    this.y = y;
    this.boxSize = boxSize;
  }

  void display() {
    stroke(0);
    noFill();
    rect(x, y, boxSize, boxSize);
  }
}

void setup() {
  size(600, 600);
  displayHomeScreen();
  // initialize array
  float boxSize = width / 3.0;
  int id = 0;
  for (int k = 0; k < 3; k++) {
    for (int j = 0; j < 3; j++) {
      float x = j*boxSize;
      float y = k*boxSize;
      g[id] = new Grid(x, y, boxSize);
      id++;
    }
  }
}

void draw() {
  // Draw the appropriate screen based on gameStatus
  if (gameStatus == 1) {
    background(255);
    for (int i = 0; i < g.length; i++) {
      g[i].display(); // Display each object
      if (g[i].leftPressed == true) {
        text("X", g[i].x + g[i].boxSize/2, g[i].y + g[i].boxSize/2);
      }
      if (g[i].rightPressed == true) {
        text("O", g[i].x + g[i].boxSize/2, g[i].y + g[i].boxSize/2);
      }
    }
  } else if (gameStatus == 2) {
    background(0);
    displayGameOver();
  }
}

void mousePressed() {
  // Check the gameStatus and respond to mouse clicks accordingly
  if (gameStatus == 1) {
    for (int i = 0; i < g.length; i++) {
      if ((mouseX >= g[i].x) && (mouseX <= g[i].x +g[i].boxSize) && (mouseY >= g[i].y) && (mouseY <= g[i].y + g[i].boxSize)) {
        println("id =", i);
        if (mouseButton == LEFT) {
          g[i].leftPressed = true;
        }
        if (mouseButton == RIGHT) {
          g[i].rightPressed = true;
        }
      }
    }
  } else if (gameStatus == 0 && mouseX > 250 && mouseX < 350 && mouseY > 250 && mouseY < 300) {
    // Transition to the game screen when PLAY is clicked
    gameStatus = 1;
  }
}

void displayHomeScreen() {
  // Display the home screen with instructions
  background(255);
  fill(0);
  textAlign(CENTER, TOP);
  textSize(50);
  text("Tic-Tac-Toe", width/2, 100);
  textSize(25);
  fill(0);
  text("Click PLAY to start", width/2, 200);
  noFill();
  rect(250, 250, 100, 50);
  textSize(20);
  fill(0);
  text("PLAY", width/2, 265);
}

void displayGameOver() {
  // Display the game over screen with a prompt to play again
  fill(255, 0, 0);
  textAlign(CENTER, TOP);
  textSize(50);
  text("GAME OVER!", width/2, 100);
  textSize(25);
  fill(0, 0, 255);
  text("CLICK TO PLAY AGAIN", width/2, 200);
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal