手番の表示と石数の表示ができた

スポンサーリンク
スポンサーリンク

簡単そうなやつから作ってこーと思い、手番と石数の表示を作ってみた。

スポンサーリンク

手番と石数の表示

手番の表示

サブクラスに親Viewを渡す

今までonClickの時に子Viewを渡して、先の関数内で親Viewを取得してたけど、それ以外でも使えると便利そうだなーと考え調べてみたら、onCreateでサブクラスをnewする前にfindViewByIdで取得しといて、それを渡せばいいみたい。

ので、onCreateで

GridLayout glv = findViewById(R.id.gridLayout1);
board = new Board(context, glv);

と変更し、Boardクラスのコンストラクタを

public Board(Context context, View v){

    this.con = context;
    parentView = v;

と変更したら、parentViewがどっからでも使えるようになった。やったね。

setTurn()

<TextView
    android:id="@+id/textViewTurn"
    android:layout_height="10dp"
    android:layout_row="8"
    android:layout_rowWeight="1"
    android:layout_column="0"
    android:layout_columnSpan="8"
    android:layout_columnWeight="1"
    android:layout_gravity="fill"
    android:layout_marginTop="10dp"
    android:background="@drawable/tv_border"
    android:gravity="center"
    android:tag="turn"
    android:text="黒番です"
    app:autoSizeTextType="uniform" />
public void setTurn(){
    TextView tv = parentView.findViewWithTag("turn");

    switch(PlayerTurn){
        case(BLACK):
            tv.setText("黒番です");
            break;
        case(WHITE):
            tv.setText("白番です");
            break;
    }
}

GridLayoutの行数を変更してから、xmlにTextViewを追加。

あとはtagから引っ張ってきてあげて、PlayerTurnの値ごとにSwitchする。やっぱ簡単だった。

石数の表示

石数を表示するためには、全部のマスを調べて黒白の数を数えてけばいい。そんで合計を表示すればいい。はず。新たに石数表示用のTextViewを作っておいてる。

マス目を配列にぶっこむ

最初一つの関数で完結させようと思ったけど、TextViewの配列を持っとけば後々便利そうと思ったので、ちょっと分けてみた。

メンバ変数

TextView[][] CellArray;

コンストラクタ

CellArray = new TextView[8][8];
scanBoard();

scanBoard()

private void scanBoard () {
    for(int r = 0 ; r <= 7  ; r++){
        for(int c = 0 ; c <= 7 ;  c++){
            CellArray[r][c] = getTextViewFromTag(r, c);
        }
    }
}

前作ったgetTextViewFromTag()が役に立った。

配列で勘違いしてた。配列の要素数は1始まりだけど、インデックスは0始まりなのね。最初に要素数7で初期化してて、IndexOutOfBoundsExceptionつって強制終了してた。

ていうか、すっごい回りくどい気がする。なんだろうこれは、合ってるんだろうか。

石を数える

public void StoneCountOnBoard(){
    BlackStoneCount = 0;
    WhiteStoneCount = 0;
    int color;
    TextView btv = parentView.findViewById(R.id.textViewBlackStone);
    TextView wtv = parentView.findViewById(R.id.textViewWhiteStone);

    for(TextView[] cc : CellArray){
        for(TextView c : cc){
            color = getStoneColor(c);
            switch(color) {
                case (BLACK):
                    BlackStoneCount++;
                    break;
                case(WHITE):
                    WhiteStoneCount++;
                    break;
            }
        }
    }

    btv.setText(String.valueOf(BlackStoneCount)+"個");
    wtv.setText(String.valueOf(WhiteStoneCount)+"個");
}

拡張for文というものを初めて使った。最初、2次元配列の際、入れ子にするのを知らなくて、cc.getText()ってやってもできなくて悩んだ。入れ子にするのと、前作ったgetStoneColor()使えばいんじゃんって気づいたのでこんな感じになった。

うーん

コードがごちゃごちゃして見辛い。8方向まとめるほうが先かなぁ。

参考

多次元配列を拡張for文で展開 | JavaLab / ジャバラボ
多次元配列を拡張for文(foreach文)で展開する方法。

コメント

タイトルとURLをコピーしました