php小编草莓为您带来最新的java问答专栏,本期将探讨java中处理tic tac toe(井字棋)游戏的相关问题。无论您是初学者还是有经验的开发者,都可以在这里找到有关java中处理井字棋游戏的实用技巧和解决方案。让我们一起深入了解这个有趣的话题,提升自己在java编程领域的技能!
我目前正在处理中开发一个简单的 tic-tac-toe 游戏,但我在两个方面遇到了问题:
展示位置问题: x 和 o 符号未正确放置在网格上。位置似乎是随机的,我不确定为什么。每当我点击一个框时,它似乎没有放置在那个协调的框中
鼠标点击问题: 我已经设置了左键单击放置 x,右键单击放置 o,但它似乎没有按预期工作。
这是我当前的代码:
正好p2p网贷系统是一个以Java进行开发的免费网贷系统,软件包含了运行环境和相关源码。高速缓存+异步处理。高效,稳定。杜绝操作中断引起的各种问题,无需漫长的操作等待,能承受超大并发。测底解决网贷抢标卡现状。
653
// 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);
}
}以下源代码演示了使用 rect 类数组创建 3x3 网格来跟踪鼠标按下情况。也许类似的技术可以用在您的游戏中。
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;
}
}
}
}建议: 您的网格不需要二维数组;一维数组工作得很好并且不太复杂。我将向网格类添加两个布尔值(leftpressed 和 rightpressed)并删除符号参数。网格类的“draw()”方法可能应该重命名为“display()”之类的方法,因为“draw”是处理中的关键字,可以避免混淆。可以使用下面所示的技术安全地删除方法 displaygrid() 和 isvalidbox()。主要代码更改应该在 mousepressed() 中,因为它无法正常工作。循环遍历网格中的每个框将正确捕获鼠标按钮单击,此时您可以检查单击的是鼠标右键还是左鼠标按钮,并且可以将相应的布尔值设置为“true”。然后,主“draw()”将使用此信息绘制“x”或“o”。我知道这听起来很多,但这些更改是解决您的问题的一种方法。您修改后的源代码如下所示:
// 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);
}以上就是java 处理中的 tic tac toe的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号