やってみよう。書いたのもったいないけど。
紆余曲折
クラス作り
リバーシ作った人のやつ見ると
- 盤
- プレーヤー(人間対人間、人間対機械)
- 石
- マス
- ルール
あたりが必要みたい。
自分の場合、機械のプレーヤーなんてそもそも作れんし、石は○●だし、マスはTextViewだし、作るの盤ぐらいでいっかなーって。ルールは盤に含めるとかできんじゃないかな、どうなのかな。
Board.javaを作った
public class Board { final int BLACK = 1; final int WHITE = -1; int PlayerTurn = 1; private Context con; public Board(Context context){ this.con = context; } public void putStone(TextView tv){ String stone = tv.getText().toString(); if(!stone.equals("")){ Toast.makeText(this.con,"そこに石は置けません", Toast.LENGTH_SHORT).show(); }else{ switch (PlayerTurn){ case(BLACK): tv.setText("●"); PlayerTurn = WHITE; break; case(WHITE): tv.setText("○"); PlayerTurn = BLACK; break; } } } }
いちおこれで動いた。あっさりできたわけではなくかなり手間取った。
Toast表示するのに引数Contextが必要で、前と同じようにthisってやるとBoardの方と認識される。メインの方でgetApplicationContext()しておき、インスタンス化する時に引数で渡してあげると。ほいでBoardのコンストラクタで受け取ってあげる。なるほどなぁ。調べなきゃ分かんないよ。
Reversi.javaを変更
メインの方でNewする位置もよく分かってなかった。最初BoardのコンストラクタにTextViewの引数を設定していたし、メインのocClick内でNewしていた。でもそれだとClickされるたびにNewされて、NewされるたびにPlayerTurnが初期化され、黒石連打になっていた。だもんでじゃあonCreate内でNewすりゃいいのかとやってみたら、今度はonClick内でBoardが使えない。オブジェクト変数の宣言とNewをいっぺんにやってたのが原因だった。ので、変数の宣言を頭でやって、onCreate内でNewすると、onClick内でも使えるようになり、解決した。試行錯誤の連続です。
ということで、メインのReversi.javaは
最初
public class Reversi extends AppCompatActivity { Board board;
onCreate内
Context context = getApplicationContext(); board = new Board(context);
onClick内
TextView tv = findViewById(id); board.putStone(tv);
と書けた。
なんだろな、やっぱりスコープがちゃんと分かってないからこんな手間取るのかな。それだけじゃないんだろうけども。うーむ。
PlayerTurnってここでいいんだろうか、Playerって付いてるし、Playerクラスを作ったほうがいいのかなぁ。でも手番管理って盤面の仕事な気もするし。
あとクラスを作ったからといって、そこまで楽になったのかというとそうでもないような気がする。メインは見晴らしが良くなったけど、Boardの方はこっからちょっとづつ足してくわけだもんね、やることは一緒なんじゃないだろうか。このままいくとputStoneが肥大化していくような気がしてならない。まぁせっかく作ったんだしこれを使っていこう、そうしよう。
コメント