gpt4 book ai didi

java - 查找 3x3 数组中的元素

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:27 27 4
gpt4 key购买 nike

我是编程新手,我创建了一个井字棋游戏。游戏完全可以运行,但我想为计算机添加一些“智能”。

传统的 3 x 3 井字棋盘(看起来像“#”)由一个数组表示,其中所有元素(所有值)最初都设置为零。当玩家选择自己的位置时,该值变为1。例如,如果玩家在右上角放置X,则array[0][2]变为1。如果玩家在左下角放置X,则array[2][0]变为1。

我正在尝试创建两种方法,一种返回行(由 r() 表示),另一种返回玩家必须放置最终 X 的坐标的列(由 c() 表示),以便他们获胜 ()。基本上我正在尝试创建返回玩家需要放置最后一个 X 才能获胜的位置的方法,以便计算机可以阻止它。

我尝试使用循环搜索数组来查找总和为 2,但我完全迷失了。任何帮助表示赞赏。此外,任何有关进攻“情报”的建议都会有所帮助。

import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
public class TicTacToe {

//-------------------------------------------------------------------------
private static int[][] grid;
private static final int XPOS = 1;
private static final int OPOS = -1;
private static final int EMPTY = 0;


//-------------------------------------------------------------------------
public static void main(String[] args) {

//game


do {
initBoard();

do {
moveX();

if (isTicTacToe()) {
JOptionPane.showMessageDialog(null, "X wins");
} else if (isCatsGame()) {
JOptionPane.showMessageDialog(null, "Cats Game");
} else {
moveO();
if (isTicTacToe()) {
JOptionPane.showMessageDialog(null, "O wins");
}
}

} while (!isCatsGame() && !isTicTacToe());
} while (JOptionPane.showConfirmDialog(null, "Playagain?") == JOptionPane.YES_OPTION);
}

//-------------------------------------------------------------------------

//Methods

public static void moveX() {
// PRECONDITION: The grid is initialized and not full
// POSTCONDITION: XPOS is assigned to the location in grid chosen by the user

// Algorithm: Ask the user for a location from 1-9, convert it to (r,c),
// make sure it is valid and empty, assign XPOS to that locaion

int move;
do {
move = Integer.parseInt(JOptionPane.showInputDialog(displayBoard()
+ "\n\n Enter your move for X"));
} while ((move < 1) || (move > 9)
|| grid[getRow(move)][getCol(move)] != EMPTY);
grid[getRow(move)][getCol(move)] = XPOS;

}
//-------------------------------------------------------------------------

public static void moveO() {
// PRECONDITION: The grid is initialized and not full
// POSTCONDITION: a random available location has been assigned OPOS

int move = (int) (Math.random() * 9 + 1);

if (check(move, move) == true) {
grid[getRow(move)][getCol(move)] = OPOS;
}
}

//-------------------------------------------------------------------------
public static boolean isTicTacToe() {
// PRECONDITION: grid is initialized
// POSTCONDITION: Returns TRUE if there is a winner, FALSE otherwise

for (int i = 0; i <= 2; i++) {
if (Math.abs(grid[i][0] + grid[i][1] + grid[i][2]) == 3) {
return true;
} else if (Math.abs(grid[0][i] + grid[1][i] + grid[2][i]) == 3) {
return true;
} else if (Math.abs(grid[0][0] + grid[1][1] + grid[2][2]) == 3) {
return true;
} else if (Math.abs(grid[0][2] + grid[1][1] + grid[2][0]) == 3) {
return true;
}
}
return false;
}

//-------------------------------------------------------------------------
public static void initBoard() {
// PRECONDITION:
// POSTCONDITION: The grid has been initialize and all values set to EMPTY//initilize the board by creating a 3 by 3 array of integers

grid = new int[3][3];
// Make all the vakues empty
for (int i = 0; i > grid.length; i++) {
for (int j = 0; j > grid.length; j++) {
grid[i][j] = EMPTY;
}
}
}

//-------------------------------------------------------------------------
public static boolean isCatsGame() {
// PRECONDITION: The grid is initialized
// POSTCONDITION: returns TRUE if there are no EMPTY spots, FALSE otherwise

for (int r = 0; r >= 2; r++) {
for (int c = 0; c >= 2; c++) {
if (grid[r][c] == EMPTY) {
return true;
}
}

}

return false;
}

//-------------------------------------------------------------------------
private static int getRow(int n) {
// PRECONDITION: 1 <= n <= 9
// POSTCONDITION: returns the correct row - 0, 1, or 2
return ((n - 1) / 3);
}

private static int getCol(int n) {
// PRECONDITION: 1 <= n <= 9
// POSTCONDITION: returns the correct col - 0, 1, or 2
return ((n - 1) % 3);
}

//-------------------------------------------------------------------------
public static String displayBoard() {
// PRECONDITION: The grid is initialized
// POSTCONDITION: returns a string representatin of the grid to be used
// in a JOPTIONPANE (\n's but no \t's).
// XPOS is replaced with X, OPOS with O,
// EMPTY with the correct number 1 - 9

String s = "";
for (int i = 1; i <= 9; i++) {
int r = getRow(i);
int c = getCol(i);
if (grid[r][c] == EMPTY) {
s += " " + i;
} else if (grid[r][c] == XPOS) {
s += " X";
} else {
s += " O";
}
if (i % 3 == 0) {
s += "\n";
}
}
return s;
}

private static boolean check(int x, int y) {
//PRECONDITION: CHECKS IF A COORDINATE ON THE TABLE IS OCCUPIED
//POSTCONDITION: RETURNS TRUE IF ITS NOT BEING USED
if (grid[getRow(x)][getCol(y)] != EMPTY) {
return false;
}
return true;
}

//need a method to see if there is two in a row, and one to find where the
// winning x,y coordinate is
private static boolean matchPoint() {
for (int i = 0; i <= 2; i++) {
if (Math.abs(grid[i][0] + grid[i][1] + grid[i][2]) == 2) {
return true;
} else if (Math.abs(grid[0][i] + grid[1][i] + grid[2][i]) == 2) {
return true;
} else if (Math.abs(grid[0][0] + grid[1][1] + grid[2][2]) == 2) {
return true;
} else if (Math.abs(grid[0][2] + grid[1][1] + grid[2][0]) == 2) {
return true;
}
}
return false;
}

private static int r() {

}

private static int c() {

}

最佳答案

对于具有完美信息和交替 Action 的更复杂的游戏,存在大量的博弈论。国际象棋、围棋、井字游戏、Mills 和 Tak 等游戏都遵循相同的基本规则集。然而,TicTacToe 被简化了,因为选项非常有限,您基本上可以“解决”复杂的解决方法,并且可以通过做出非常直接的放置决策来实现直接的方法。

通常此类游戏是通过创建层树来解决的。这是一个搜索树,其中遍历了所有可能的位置。然而(大多数)这些游戏无法通过这种方式解决,因为树木太大(它们随着你尝试向前看的每一层而呈指数增长)。但对于如此小而简单的井字游戏,您实际上可以解决这棵树,而不会耗尽时间或内存。

在这样的树中搜索时,通常不会将 x 和 y 的函数分开,而是将两者一起处理(例如使用 PointCooperative 类)。使用递归算法仔细研究所有选项,然后根据 AI 玩家可用的最佳选项放置您的棋子。

(也就是说,我个人建议您摆脱迭代的编码方式,更多地采用面向对象编程。这样代码就会变得更具可读性,并且可以更好地隔离问题)

提示:由于棋盘是方形的,并且棋子是“平坦”的,因此您可以通过“合并”棋盘位置来简化树。例如,以下两个场景(实际上)是相同的:

X|  |
------
|O |
------
| |

 |  |X
------
|O |
------
| |

因此,当您“搜索”正确的移动时,您可以以相同的方式进行操作,只要您以后仍然可以弄清楚您转向和/或翻转棋盘的方式,以找出正确的位置。但即使没有这种简化,你也应该能够相当容易地解决这棵树的问题。

完成 TicTacToe 的实现后,看看棋盘游戏“Tak”。已经编写了多个开源AI,从长远来看,这个游戏比TicTacToe更有趣;) https://www.playtak.com/ (在“帮助”下查找规则。那里有多个有趣的链接)。

关于java - 查找 3x3 数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54435180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com