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!
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); } }
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; } } } }
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); }
Atas ialah kandungan terperinci tic tac toe dalam pemprosesan java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!