質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5977閲覧

配列を他のクラスで使用する

sobue

総合スコア329

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/03/26 14:02

編集2016/03/26 14:21

java

1package othello; 2 3import java.awt.Color; 4 5public class CommonConstants { 6 7 // 一つのマスの大きさ 8 public static final int SIZE = 100; 9 // マスの数 10 public static final int MASS = 8; 11 // 縦の幅 12 public static final int HEGHT = SIZE * MASS; 13 // 横の幅 14 public static final int WIDETH = SIZE * MASS; 15 // 駒の色 16 public static final Color PEICE_COLOR1 = Color.BLACK; 17 // 駒の色 18 public static final Color PEICE_COLOR2 = Color.WHITE; 19 // 黒色 20 public static final int BLACK = 1; 21 // 白色 22 public static final int WHITE = 2; 23 // 駒無し 24 public static final int EMPTY = 0; 25 // ボードの色 26 public static final Color BOARDCOLOR = Color.GREEN; 27 // ボードの線の色 28 public static final Color LINECOLOR = Color.BLACK; 29 // 自分のターン 30 public static final int PLAYER1 = 1; 31 // 相手のターン 32 public static final int PLAYER2 = -1; 33 // ボード配列 34 public int[][] BOARD_ARRAY = new int[MASS][MASS]; 35 36}

定数クラスで上記の配列を作ったのですが、他のクラスで使用することができません。
newをしてしまうとデータが消えてしまうので出来ないのですが
どのように宣言+使用したらいいのでしょうか?

java

1package othello; 2 3import java.awt.event.MouseEvent; 4import javax.swing.event.MouseInputListener; 5import static othello.CommonConstants.*; 6 7public class Reverse implements MouseInputListener { 8 Decision decision = new Decision(); 9 public Reverse() { 10 int turn = -1; 11 12 } 13 14 @Override 15 public void mouseClicked(MouseEvent e) { 16 // TODO 自動生成されたメソッド・スタブ 17 18 } 19 20 @Override 21 public void mousePressed(MouseEvent e) { 22 // TODO 自動生成されたメソッド・スタブ 23 24 Decision decision = new Decision(); 25 int x = e.getX(); 26 int y = e.getY(); 27 // 1マスのSIZEを割った数の整数だけ取得すると2次元配列が取得できる 28 x = x / SIZE; 29 y = y / SIZE; 30 31 if(decision.canReverse(x, y,BOARD_ARRAY)==false){ 32 System.out.println("ここには置くことができません"); 33 } 34 System.out.println(x + "," + y); 35 36 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Odacchi

2016/03/26 14:16

その宣言はどんなクラスですか? そのコードはクラスのフィールドなのでしょうか?
Odacchi

2016/03/26 14:18 編集

周辺コードや、呼び出す側のコードがないと「設計による」としか言いようがない気がします。
guest

回答2

0

ベストアンサー

設計の問題になりますが、
CommonConstantsというクラスは、値の変わらない定数やEnumを共用で用いるために利用するクラスの使い型が設計的に理にかなっていると思います。

ところが配列は、配列の各要素の値が変わることを前提に利用するので、CommonConstantsには書かないと思います。

一言でいうと、Boardクラスとして、シングルトンパターンでクラス化し、Boardクラスのフィールドに持たせたら良さそうに思いますが、いかがでしょう?
下記のような感じです。

Java

1 2public class Board { 3 4 private static Board board = new Board(); 5 private int[][] boardArray; 6 7 // privateのコンストラクタ。newできなくし、外部からインスタンスが作られないようにする 8 private Board() { 9 boardArray = new int [CommonConstants.MASS][CommonConstants.MASS]; 10 } 11 12 // Boardクラスのインスタンスを呼ぶ。 13 public static Board getInstance() { 14 // 普通は下記のようにBoard型のインスタンスを返しますが。 15 // return board; 16 } 17 18 // boardにコマを置くメソッドなど書ける 19 public void setKoma(int x, int y, int player) { 20 boardArray[x][y] = player; 21 } 22 23    public int[][] getArray() { 24 return boardArray; 25 } 26 27 28}

投稿2016/03/26 14:36

編集2016/03/26 14:58
Odacchi

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sobue

2016/03/26 14:41

すみません、シングルトンパターンがよくわかりません。
Odacchi

2016/03/26 15:01 編集

インスタンスが1つしか無いことが保証されたクラスのことです。 コードを読み込んで見てください。 canReverse(x, y, Board.getInstance().getArray()) などというように書けます。 しかも、コンストラクタがprivateなので、newすることもできません。
sobue

2016/03/26 14:59

このまま入れるとオセロの最初の駒の配置ができないですよね?
sobue

2016/03/26 15:07 編集

すみません、理解力の無さでした。できました
Odacchi

2016/03/26 15:06 編集

自分なら、最初のコマの配置をするメソッドをこのクラスに持たせます。(例えばinitBoard()メソッドなどとつける) また、本当はcanReverseメソッドや最初のコマの配置は、Boardクラスに書くのが自然だと思います。 そのようにすれば、getArrayなんてメソッドもいらなくなり、Boardクラスを使う側は、 配列を意識しなくて良くなります。 ただ、今回の質問の答えからはどんどん脱線してしまいました。。。w
Odacchi

2016/03/26 15:11 編集

せっかくの開発なので、デザインパターンなども身につけたら、いいと思います。
sobue

2016/03/26 15:15

デザインパターンですか?
sobue

2016/03/26 15:35

package othello; import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; import static othello.CommonConstants.*; public class Board extends JPanel { private static Board board = new Board(); private int[][] boardarray; public Board() { boardarray = new int[MASS][MASS]; // setPreferredSize(new Dimension(WIDETH, HEGHT)); // addMouseListener(new Reverse()); } public void paintComponent(Graphics graphi) { // 背景 graphi.setColor(BOARDCOLOR); graphi.fillRect(0, 0, WIDETH, HEGHT); // 線 graphi.setColor(LINECOLOR); for (int i = 0; i < 8; i++) { graphi.drawLine(0, i * SIZE, WIDETH, i * SIZE); graphi.drawLine(i * SIZE, 0, i * SIZE, HEGHT); } // 駒 // graphi.setColor(Color.DARK_GRAY); // for(int y=0; y<8; y++){ // for(int x=0; x<8; x++){ // // } // } } public Board getInstance(){ return board; } public int [][]getArray(){ return boardarray; } } クラスの記述が悪いと思うのですが、 setPreferredSize(new Dimension(WIDETH, HEGHT)); addMouseListener(new Reverse()); の部分が入っているとエラーになってしまい、実行できません。 Exception in thread "main" java.lang.StackOverflowError at java.util.Hashtable.get(Hashtable.java:363) at javax.swing.UIDefaults.getFromHashtable(UIDefaults.java:173) at javax.swing.UIDefaults.get(UIDefaults.java:161) at javax.swing.MultiUIDefaults.get(MultiUIDefaults.java:58) at javax.swing.UIDefaults.getColor(UIDefaults.java:417) at javax.swing.UIManager.getColor(UIManager.java:701) at javax.swing.LookAndFeel.installColors(LookAndFeel.java:175) at javax.swing.LookAndFeel.installColorsAndFont(LookAndFeel.java:211) at javax.swing.plaf.basic.BasicPanelUI.installDefaults(BasicPanelUI.java:66) at javax.swing.plaf.basic.BasicPanelUI.installUI(BasicPanelUI.java:56) at javax.swing.JComponent.setUI(JComponent.java:666) at javax.swing.JPanel.setUI(JPanel.java:153) at javax.swing.JPanel.updateUI(JPanel.java:126) at javax.swing.JPanel.<init>(JPanel.java:86) at javax.swing.JPanel.<init>(JPanel.java:109) at javax.swing.JPanel.<init>(JPanel.java:117) at othello.Board.<init>(Board.java:14) 以下略 と出ます。
guest

0

BOARD_ARRAYの宣言にstaticが足りません。

投稿2016/03/26 14:25

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sobue

2016/03/26 14:29

お恥ずかしい限りです。ありがとうございます。
sobue

2016/03/26 14:39

staticを入れてもdecision.canReverse(x, y, BOARD_ARRAY) == falseが解決できません。 public class Decision { public boolean canReverse(int x, int y,int[][]BOARD_ARRAY) { なのですがどのように入れ込んだらいいでしょう?
swordone

2016/03/26 15:00 編集

エラーメッセージはどうなっていますか?気になるのはメソッド宣言で[][]とBOARD_ARRAYの間にスペースがないことですが
sobue

2016/03/26 15:12

いつも、回答ありがとうございます。今回はOdacchiさんの回答を採用させていただきました。エラーの件はなぜか解決してました。また出るようでしたら再度質問させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問