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

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

ただいまの
回答率

90.47%

  • Java

    16160questions

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

他クラスのメソッドを使う方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,893

omikuji

score 50

当方プログラミング初心者で修行中です。継承の勉強を生かしてオセロプログラムを作ってみようと思い、書いてみましたがイマイチどうかけばいいかわからなくなってしまった部分があるので質問させて頂きます。(継承なんか使わなくても楽にかけるかもしれませんが、練習なのでそこはご容赦下さい)

public class BoardData {

    final static int out = -1;
    final static int noPiece = 0;
    final static int black = 1;
    final static int white = 2;

    static int turn = black;
    private int pieceData[][] = new int[10][10];

    BoardData(){
        InitialPieceDataSetting();
    }

    public void InitialPieceDataSetting(){        
        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 10; j++){
                if(i == 0 || i == 9 || j == 0 || j == 9){
                    this.pieceData[i][j] = out;
                }else{
                    this.pieceData[i][j] = noPiece;
                }
            }
        }

        this.pieceData[4][5] = black;
        this.pieceData[5][4] = black;
        this.pieceData[4][4] = white;
        this.pieceData[5][5] = white;        
    }

    public int searchPieceData(int x, int y){
        return this.pieceData[x][y];
    }

    public void changePieceData(int x, int y, int color){
        this.pieceData[x][y] = color;
    }

}

public class Board extends BoardData{

    public void outputBoardByChar(){

        for(int i = 0; i < 10; i++){
            for(int j = 0; j < 10; j++){
                if(searchPieceData(i, j) == out){
                    if(j == 9){
                        System.out.println("■");
                    }else{
                        System.out.print("■");
                    }
                }else if(searchPieceData(i, j) == noPiece){
                    System.out.print("□");
                }else if(searchPieceData(i, j) == black){
                    System.out.print("●");
                }else if(searchPieceData(i, j) == white){
                    System.out.print("○");
                }
            }
        }

    }

}

/*
public class CPU {

    Board b = new Board();

    public void CPUPutPiece(int x, int y){
        b.changePieceData(x, y, BoardData.turn);
    }

}
*/

public class Main {

    public static void main(String[] args) {

        Board b = new Board();
        b.outputBoardByChar();

    }

}

このコードのCPUクラスからBoardDataクラスのpieceData[][]の値をいじれるようになりたいのですが、どのようなコードにすればいいでしょうか?
自分の考えとしてはchangePieceDataのメソッドを利用すればいいのでは?と考えたのですが・・・。このメソッドを継承していない他のクラスから使うことは可能ですか?
何かコードをわかりやすくする上でアドバイス等あれば、加えてお願いします。

【追記】
すいません、質問がわかりづらかったと思います。
このコード内で、最初自分が書いたCPUクラスをコメントで残していますが、こうすればちゃんとプログラムが動作することはわかりました。
ただ、ほかのクラスのインスタンスをここで宣言して使うような感じで使っていいのかな?と疑問に思った次第です。

当然

public class CPU {

    public void CPUPutPiece(int x, int y){
        changePieceData(x, y, BoardData.turn);
    }

}


ではコンパイルエラー出ると思うので・・・

プログラミング初心者すぎて何いってるのかわからないかもしれませんがよろしくおねがいします><

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

changePieceDataはpublicなので使えると思いますが、試して何か問題がありましたか?

気になったのは、BoardData.turn の部分ですね。

  • せっかくCPUはBoardのインスタンスを使っているのに、BoardDataクラスの存在まで知らないといけない。
  • turnはstaticだが、最初からやり直したい場合に、turnを初期状態に戻す方法をBoardDataやBoardは提供していない。

というところでしょうか。
turnをstaticにしない方法も考えられますが、一つずつ改善していけばよいかと思います。


質問の追記に気づいてませんでした。すいません。

つまり、changePieceDataを使えばいいことはなんとなくわかるけど、BoardData.turnを使う事に抵抗があるということですね。

まず、継承している(=BoardはBoardDataでもある)ので、BoardもBoardData.turnを使う事が出来ます。
( Board.turn も使え、それはBoardData.turnと同じものを参照しています。 )

もう一つは、turnはBoardやBoardDataは知っているので、現在のturnを渡すくらいなら受け取らなくても自分で見ればいいという事です。

この2つから、turnを受け取らないオーバーロード(引数の違う同じ名前のメソッド)か別メソッドを作って、3つ目の引数はBoard自身が処理するという手も考えられます。

Board.java

public void changePieceData(int x, int y){
        changePieceData(x,y,Board.turn);  // 続きの処理は引数3つの方にやらせる
        // changePieceData(x,y,BoardData.turn);   // 同じこと
    }

CPU.java

// b.changePieceData(x, y, BoardData.turn);
        b.changePieceData(x, y);

他には、Boardが今のturnを教えてくれるメソッドを作るという手もあると思います。
やりかたはいろいろあるので考えてみてください。

あとは、turnはstaticじゃなくてもいいんじゃない?という気もしてますが、それも自分でためしてみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

BoardData#changePieceDatapublicで宣言されていますので、別クラスからもアクセス可能です。

Javaでは、アクセス制御が4通りあります。

  • public…どこからでもアクセス可能
  • package private(無指定)…同じパッケージ内のクラスからアクセス可能
  • protected…自分自身と継承したクラスからアクセス可能
  • private…同じクラスからのみアクセス可能

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Java

    16160questions

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