3

オブジェクトと配列/配列リストに頭を悩ませるために、Tic-Tac-Toe アプリを作成することにしました。

やりたいことは次のとおりです。

ボードは、次のように見える/対応する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[][] 配列を直接指すことができるような配列が欲しいので、次の行に沿って何かを行うことができます (それは実装方法ではないことを知っていますが、私は自分の精神的な明快さのために var 型を入れています)

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

しかし、私は自分が何をする必要があるのか​​ について頭を包むことができないようです. どのタイプの配列であるべきか、またはその理由がわかりません。

これ/探しているものを入力しているときに、配列はオブジェクトであり、プリミティブのみをJavaに格納できることに気付きました。そのため、配列を使用して配列を呼び出すことができませんでした...これは、Arraylists を使用する場所ですか?

すべての答えをありがとう!このちょっとした演習の目的は、私配列を使って練習できるようにするためだけに、非常に複雑でばかげた方法で配列を使用することでしたが、言語としての Java は、私がこの方法でやりたいことを実行できないようです。私はそれをやってみたいです。間違いなくこれらの他の回答も試してみるつもりです

4

5 に答える 5

1

マルチアレイを実装することは、この問題に対処するための完全に有効な方法です。配列にアクセスして配列にオブジェクトを格納することは、問題があるようです。

まず、配列には何でも格納できます。配列の定義を変更するだけで、プリミティブとオブジェクト (またはオブジェクトへの参照) の両方をそれらの中に格納できます。

たとえば、これはプリミティブ文字の配列を格納します。

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

そして、これはオブジェクトの配列を格納します:

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

これを念頭に置いて、問題に取り組みましょう。

参照用に文字 ('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;

完全なコードはここで見ることができます。それはエレガントではなく、ハックのようなものです。この問題を解決する方法はたくさんあります。メイン クラスからコードを抽象化する独自の Board クラスを作成することをお勧めします。お任せします!

また、Java ドキュメントを参照し、オブジェクトと配列に関するチュートリアルを調査することをお勧めします。

混乱して困難に思えるかもしれませんが、配列はメモリのブロックに過ぎず、配列に入れたいオブジェクトのタイプを格納するためのスペースを確保していることを忘れないでください。

私の友人をお楽しみください!

于 2013-06-13T18:18:38.123 に答える
1

ここでの回答の多くはエレガントで、最終的な解決策としてより適切です。しかし、多次元配列をよりよく理解する必要があると思うので、何が起こっているのかを理解できるようにこれを書いています。

char array[3][3] を宣言すると、2 次元配列が宣言されます。

char[][] myArray= 新しい char[3][3];

オブジェクト myArray は、長さ 3 の char の配列です。myArray[0] は最初のセル、myArray[1] は 2 番目、myArray[2] は 3 番目のセルです。各セルには何が含まれていますか? これには、長さが 3 の char の配列全体が含まれています。(二次元が述べているように)。

したがって、プログラムで myArray[0] を記述すると、最初のセルにある配列が取得されます。myArray [0][1] と書くと、myArray の最初のセルにある配列の 2 番目のセルに到達します。

これは何を示していますか?

その場所を指すことで、配列全体を指すことができます。( myArray[0] 、 myArray[1] などで示したように)。

なぜあなたは問題を抱えているのですか?宣言に2つの要素のそのような配列がないため、それを指すことができません。配列を構築した方法は、そのような組み合わせが 2 つのセルになることを意味し、両方が同じ配列内にあるか、それぞれが異なる配列内にあります。

必要なものが必要な場合は、myArray = new char[9][2] を試すことができます。

これで 9 つの配列ができ、それぞれの長さが 2 になりました。これで、各セル (myArray[0]、myArray[1] など) は 2 つの要素の配列を指します。ニーズに合ったものを入力し、ユーザーが指定したインデックスでアクセスするだけです (配列は 0 から始まることがわかっているので、ユーザーが 4 をクリックすると、myArray[3] にアクセスします)。

于 2013-06-12T20:32:49.173 に答える
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...
}

ループでマップを作成することもできますが、それをコーディングするのが少し面倒だと感じました

次に、数値が必要な場合は、座標が必要な場合は、次のように言うことがhm.get(2)できます。Coordinatexy02

于 2013-06-12T20:00:02.367 に答える