Java tic-tac-toe的获胜者搜索算法
在以矩阵表示棋盘的3x3井字游戏中,找出赢家的最佳方法是什么?建议请这些功能应该可以。我在做tic-tac-toe时使用了一个字符数组Java tic-tac-toe的获胜者搜索算法,java,algorithm,data-structures,Java,Algorithm,Data Structures,在以矩阵表示棋盘的3x3井字游戏中,找出赢家的最佳方法是什么?建议请这些功能应该可以。我在做tic-tac-toe时使用了一个字符数组 int rowcheck(char ch[3][3]) { int i; char ans; for(i=0;i<3;i++) { if(ch[i][0]==ch[i][1] && ch[i][1]==ch[i][2]) { ans=ch[i][0];
int rowcheck(char ch[3][3])
{
int i;
char ans;
for(i=0;i<3;i++)
{
if(ch[i][0]==ch[i][1] && ch[i][1]==ch[i][2])
{
ans=ch[i][0];
break;
}
}
if(ans=='O')
return 1;
else if(ans=='X')
return 2;
else
return 0;
}
int colcheck(char ch[3][3])
{
int i;
char ans;
for(i=0;i<3;i++)
{
if(ch[0][i]==ch[1][i] && ch[1][i]==ch[2][i])
{
ans=ch[0][i];
break;
}
}
if(ans=='O')
return 1;
else if(ans=='X')
return 2;
else
return 0;
}
int diagcheck(char ch[3][3])
{
char ans;
if(ch[0][0]==ch[1][1] && ch[1][1]==ch[2][2])
ans=ch[0][0];
if(ch[0][2]==ch[1][1] && ch[1][1]==ch[2][0])
ans=ch[0][2];
if(ans=='O')
return 1;
else if(ans=='X')
return 2;
else
return 0;
}
int行检查(char ch[3][3])
{
int i;
查尔安斯;
对于(i=0;i我假设您使用的是一个由Booleans
组成的二维数组。因为布尔值可以有三个值(null、true和false)。因为在任何给定时间只有两个玩家可以玩,那么您只需要三个值。未定义,玩家1和玩家2
这里有一个方法,只要大小大于1
就可以处理任何Boolean
数组。如果true
赢了,它将返回true
,如果false
赢了,它将返回false
,如果还没有赢家,它将返回null
public static Boolean getWinner(Boolean[][] grid) {
if (grid == null)
return null;
int size = grid.length;
if (size == 0)
return null;
if (size == 1 && (grid[0][0] != null)) {
return grid[0][0];
}
boolean flag = true;
// checks horizontal
for (int index = 0; index <= size - 1; index++) {
flag = true;
for (int i = 1; i <= size - 1; i++) {
if (grid[index][i] != grid[index][i - 1]) {
flag = false;
break;
}
}
if (flag)
return grid[index][0];
}
// checks vertical
for (int index = 0; index <= size - 1; index++) {
flag = true;
for (int i = 1; i <= size - 1; i++) {
if (grid[i][index] != grid[i - 1][index]) {
flag = false;
break;
}
}
if (flag)
return grid[0][index];
}
// checks diagonal
flag = true;
for (int index = 1; index <= size - 1; index++) {
if (grid[index][index] != grid[index - 1][index - 1]) {
flag = false;
break;
}
}
if (flag)
return grid[0][0];
flag = true;
for (int index = 1; index <= size - 1; index++) {
if (grid[size - index - 1][index] != grid[size - index][index - 1]) {
flag = false;
break;
}
}
if (flag)
return grid[size - 1][0];
return null;
}
公共静态布尔getWinner(布尔[][]网格){
if(grid==null)
返回null;
int size=grid.length;
如果(大小==0)
返回null;
如果(大小==1&&(网格[0][0]!=null)){
返回网格[0][0];
}
布尔标志=真;
//水平检查
对于(int index=0;index是的,我理解逻辑,谢谢!!!但是有没有更好的方法,比如时间复杂度更低的方法呢?如果你需要检查等式,我看没有比这更好的方法了。另外,考虑到你在玩井字游戏,我看不出有理由降低时间复杂度。但是如果你必须这样做,最简单的方法是至少在已经做了6步。考虑到只能做9步,这将减少超过三分之二的时间。如果你喜欢我的答案,请投票。@AkshayBhat Umm也许你应该检查我的答案,寻找一种更有效的算法,可以让你在任何给定大小的数组中获胜。@nickzoum是的,有点泛化是很好的。这是一个在我刚粘贴代码的第一个游戏中,当时我刚刚开始编程。在后来的游戏中,我开始概括和适当的评论。谢谢你的提示,请随时查看我的博客,了解其他游戏,如Snake或Sudoku解算器。可能重复的感谢我成功地实现了把它涂上薄荷!!