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