Rumah > Java > tic tac toe dalam pemprosesan java

tic tac toe dalam pemprosesan java

PHPz
Lepaskan: 2024-02-22 12:52:06
ke hadapan
830 orang telah melayarinya

php editor Strawberry membawakan anda ruangan soalan dan jawapan java terbaru Isu ini akan meneroka isu berkaitan dalam memproses permainan tic tac toe (tic-tac-toe) di java. Sama ada anda seorang pemula atau pembangun yang berpengalaman, anda akan temui di sini petua dan penyelesaian praktikal untuk mengendalikan permainan Tic-Tac-Toe di Java. Mari ketahui lebih lanjut tentang topik menarik ini dan tingkatkan kemahiran anda dalam bidang pengaturcaraan Java!

Kandungan soalan

Saya sedang mengusahakan permainan tic-tac-toe yang mudah, tetapi saya menghadapi masalah dalam dua bidang:

Masalah penempatan: Simbol x dan o tidak diletakkan dengan betul pada grid. Lokasi nampaknya rawak dan saya tidak pasti mengapa. Setiap kali saya klik pada kotak, ia seolah-olah tidak diletakkan dalam kotak yang diselaraskan itu

Masalah klik tetikus: Saya telah menyediakan klik kiri untuk meletakkan x dan klik kanan untuk meletakkan o, tetapi ia nampaknya tidak berfungsi seperti yang diharapkan.

Ini kod semasa saya:

// 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);
  }
}
Salin selepas log masuk

Penyelesaian

Kod sumber berikut menunjukkan penggunaan tatasusunan kelas tepat untuk mencipta grid 3x3 untuk mengesan tekanan tetikus. Mungkin teknik yang sama boleh digunakan dalam permainan anda.

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;
      }
    }
  }
}
Salin selepas log masuk

Cadangan: Grid anda tidak memerlukan tatasusunan 2D; susunan 1D berfungsi dengan baik dan tidak terlalu rumit. Saya akan menambah dua boolean (tekanan kiri dan tekan kanan) pada kelas grid dan mengalih keluar parameter simbolik. Kaedah "draw()" kelas grid mungkin harus dinamakan semula kepada sesuatu seperti "display()" kerana "draw" ialah kata kunci dalam pemprosesan untuk mengelakkan kekeliruan. Kaedah displaygrid() dan isvalidbox() boleh dialih keluar dengan selamat menggunakan teknik yang ditunjukkan di bawah. Perubahan kod utama hendaklah dalam mousepressed() kerana ia tidak berfungsi dengan betul. Menggulung setiap kotak dalam grid akan menangkap klik butang tetikus dengan betul, pada ketika itu anda boleh menyemak sama ada butang tetikus kanan atau kiri telah diklik dan anda boleh menetapkan boolean yang sepadan kepada "benar". "draw()" utama kemudiannya akan menggunakan maklumat ini untuk melukis "x" atau "o". Saya tahu ini kedengaran seperti banyak, tetapi perubahan ini adalah satu cara untuk menyelesaikan masalah anda. Kod sumber anda yang diubah suai kelihatan seperti ini:

// 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);
}
Salin selepas log masuk

Atas ialah kandungan terperinci tic tac toe dalam pemprosesan java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan