php-Editor Strawberry präsentiert Ihnen die neueste Java-Frage- und Antwortspalte. In dieser Ausgabe werden verwandte Probleme bei der Verarbeitung des Tic-Tac-Toe-Spiels (Tic-Tac-Toe) in Java untersucht. Ob Anfänger oder erfahrener Entwickler, hier finden Sie praktische Tipps und Lösungen für den Umgang mit dem Tic-Tac-Toe-Spiel in Java. Lassen Sie uns mehr über dieses interessante Thema erfahren und Ihre Fähigkeiten im Bereich der Java-Programmierung verbessern!
Ich arbeite gerade an einem einfachen Tic-Tac-Toe-Spiel, habe aber in zwei Bereichen Probleme:
Platzierungsprobleme: Die x- und o-Symbole sind nicht richtig im Raster platziert. Der Ort scheint zufällig zu sein und ich bin mir nicht sicher, warum. Immer wenn ich auf ein Kästchen klicke, scheint es nicht in diesem koordinierten Kästchen platziert zu sein
Mausklickproblem: Ich habe einen Linksklick zum Platzieren des x und einen Rechtsklick zum Platzieren des o eingerichtet, aber es scheint nicht wie erwartet zu funktionieren.
Das ist mein aktueller Code:
// 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); } }
Der folgende Quellcode demonstriert die Verwendung eines Arrays der Klasse „rect“, um ein 3x3-Raster zu erstellen, um Mausdrücke zu verfolgen. Vielleicht könnte eine ähnliche Technik in Ihrem Spiel verwendet werden.
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; } } } }
Empfehlung: Ihr Raster benötigt kein 2D-Array; ein 1D-Array funktioniert einwandfrei und ist nicht zu komplex. Ich füge der Grid-Klasse zwei boolesche Werte (linksgedrückt und rechtsgedrückt) hinzu und entferne den symbolischen Parameter. Die Methode „draw()“ der Grid-Klasse sollte wahrscheinlich in etwas wie „display()“ umbenannt werden, da „draw“ ein Schlüsselwort bei der Verarbeitung ist, um Verwirrung zu vermeiden. Die Methoden displaygrid() und isvalidbox() können mit der unten gezeigten Technik sicher entfernt werden. Die Hauptcodeänderung sollte in „mousepressed()“ erfolgen, da diese nicht richtig funktioniert. Beim Durchlaufen jedes Kästchens im Raster werden Maustastenklicks korrekt erfasst. An diesem Punkt können Sie überprüfen, ob mit der rechten oder linken Maustaste geklickt wurde, und Sie können den entsprechenden booleschen Wert auf „true“ setzen. Das Hauptprogramm „draw()“ verwendet diese Informationen dann, um das „x“ oder „o“ zu zeichnen. Ich weiß, das klingt nach viel, aber diese Änderungen sind eine Möglichkeit, Ihr Problem zu lösen. Ihr geänderter Quellcode sieht so aus:
// 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); }
Das obige ist der detaillierte Inhalt vonTic Tac Toe in der Java-Verarbeitung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!