3

为了让我的头脑围绕对象和数组/数组列表,我决定制作一个井字游戏应用程序。

这是想做的事情:

该板由一个 char 数组[3][3] 组成,它看起来像/对应于:

codeindent         - - -  0,0 1,0 2,0
c                  - - -  0,1 1,1 2,1
c                  - - -  0,2 1,2 2,2

我让玩家通过输入数字 1-9 来输入他们的移动选择

1 2 3 
4 5 6
7 8 9

现在我想要一个数组,如果我调用索引 4,它会以这样的方式返回 [0,1],我可以将它直接指向 char[][] 数组,这样我就可以按照 (I知道这不是它的实现方式,但我将 var 类型用于我自己的头脑清晰)

char[][] boardArray[??? refArray[int playerMove]] = char currentPlayer

但是,我似乎无法完全理解我需要做的事情。我不知道它应该是什么类型的数组或为什么。

在输入这个/看起来的东西时,我刚刚意识到数组是对象,并且只能在 java 中存储原语。所以我不能使用数组来调用数组...这是我要使用 Arraylists 的地方吗?

感谢所有的答案!这个小练习的目的是以一种过于复杂和荒谬的方式使用数组,其唯一目的是让我练习它们,但似乎 java 作为一种语言并不能满足我想要在时尚中做的事情我要做。肯定会经历并尝试这些其他答案

4

5 回答 5

1

这里的许多答案都很优雅,更适合作为最终解决方案。但我写这篇文章是为了让你理解发生了什么,因为我认为你需要以更好的方式理解多维数组。

当您声明一个 char array[3][3] 时,您正在声明一个二维数组。

字符[][] myArray=新字符[3][3];

对象 myArray 是一个 char 数组,长度为 3。myArray[0] 是第一个单元格,myArray[1] 是第二个单元格,myArray[2] 是第三个单元格。每个单元格包含什么?它包含一个完整的字符数组,长度也为 3。(如第二维状态)。

因此,当您在程序中编写 myArray[0] 时,您会得到第一个单元格中的数组。通过编写 myArray [0][1],您可以在 myArray 第一个单元格中找到数组中的第二个单元格。

这说明了什么?

您可以通过指向其位置来指向整个数组。(正如我在 myArray[0] , myArray[1], .... 中展示的那样)。

现在你为什么有问题?因为您的声明中没有这样的两个元素数组,所以您不能指向它。您构建数组的方式意味着任何这样的组合都将是两个单元格,要么都在同一个数组中,要么每个都在不同的数组中。

如果你想拥有你想要的,你可以试试:myArray = new char[9][2]

现在你有 9 个数组,每个数组的长度为 2。现在,每个单元格(如 myArray[0]、myArray[1]、...)都指向一个两个元素数组。只需填写适合您需要的内容,然后使用用户提供的索引进行访问(并且您知道数组从 0 开始,因此如果用户单击 4,您将访问 myArray[3])。

于 2013-06-12T20:32:49.173 回答
1

实现多数组是解决这个问题的一种完全有效的方法。访问数组并将对象存储在数组中似乎是您的问题所在。

首先,数组可以存储任何东西!您可以在其中存储原语和对象(或对对象的引用),您只需更改数组的定义。

例如,这将存储一个原始字符数组:

char boardArray[][] = new char[3][3];

这将存储一个对象数组:

Object boardArray[][] = new Object[3][3];

考虑到这一点,让我们来解决您的问题:

我们从多数组boardArray开始,如果我们想使用字符作为参考('X' 和 'O'),我们可以将其设为字符数组,如果未使用,则将其设为空字符串。

//by default this will implement 3x3 matrix with empty strings
char boardArray[3][3] = new char[3][3];

现在我们要继续并接受一些用户输入:

// get the value
int value = Integer.parseInt(br.readLine().toString());

然后您可以从该字段计算行和列并修改:

// find the row
int row = (value - 1) / 3;

// get the column value (minus one as we want it from 1->9 instead of 0-8)
int column = (value - 1) % 3;

然后您可以更改数组中的值!

if (round % 2 == 0)
    boardArray[row][column] = playerA;
else
    boardArray[row][column] = playerB;

完整的代码可以在这里看到。它不是优雅的,有点hacky。有很多方法可以解决这个问题。我建议创建自己的 Board 类,将代码从主类中抽象出来。我会把这个留给你!

我还建议您查看 Java 文档并研究有关对象和数组的教程。

这似乎令人困惑和令人生畏,但请记住,数组只是一块内存,为您留出空间来存储您想要放入其中的对象类型。

享受我的朋友!

于 2013-06-13T18:18:38.123 回答
0

如果您的目标是了解对象和不同类型的集合是如何工作的,我可以试试这个:

首先,制作一个Coordinate对象,例如

Class Coordinate {
  int x;
  int y;
  Coordinate(x, y){
    this.x = x;
    this.y = y;
  }
}

然后一个Map整数到Coordinate

HashMap<Integer, Coordinate> hm = new HashMap<Integer, Coordinate>();
{
hm.put(1, new Coordinate(0, 0));
hm.put(2, new Coordinate(0, 1));
hm.put(3, new Coordinate(0, 2));
//etc...
}

您也可以循环填充地图,但我觉得有点懒得编码

然后,当您有一个数字 a 需要一个坐标时,您可以说,例如,hm.get(2)(应该评估为 a Coordinatewith xand yvalues of 0and 2

于 2013-06-12T20:00:02.367 回答
0

试试这段代码:

// assuming refArray[playerMove] returns a value between 1-9
int position = refArray[playerMove];
// store the current player in the given position
boardArray[(position-1)/3][(position-1)%3] = currentPlayer;

使用数组的索引是一件简单的事情,仅此而已。以上将适用于 和 之间的位置19将当前玩家存储在给定位置。这里不需要写复杂的解决方案,涉及类、方法等!

于 2013-06-12T20:00:41.280 回答
0

许多其他可能的建议之一,

有一个用于板的一维数组

int[] board = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0};

使用此方法将 x,y 坐标转换为索引板

int xy2idx(int x, int y) {
    return 3 * y + x;
}

对于反向操作,即从索引到 x 和 y 坐标,您可以使用

x = idx % 3;
y = idx / 3;

正如我所说,这只是众多可能的方法之一 :) 玩得开心 :)

注意:索引、x 和 y 都是基于零的。

于 2013-06-12T20:01:03.767 回答