簡単そうなやつから作ってこーと思い、手番と石数の表示を作ってみた。
手番と石数の表示
手番の表示
サブクラスに親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方向まとめるほうが先かなぁ。
コメント