やってみよう。書いたのもったいないけど。
紆余曲折
クラス作り
リバーシ作った人のやつ見ると
- 盤
- プレーヤー(人間対人間、人間対機械)
- 石
- マス
- ルール
あたりが必要みたい。
自分の場合、機械のプレーヤーなんてそもそも作れんし、石は○●だし、マスは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が肥大化していくような気がしてならない。まぁせっかく作ったんだしこれを使っていこう、そうしよう。
参考
http://rui-phone.hatenablog.com/entry/2014/09/23/213642
http://kmaebashi.com/programmer/object/othello.html
http://d.hatena.ne.jp/prime503/20100106/1262767141