クラス使ってみたい

やってみよう。書いたのもったいないけど。

紆余曲折

クラス作り

リバーシ作った人のやつ見ると

  • プレーヤー(人間対人間、人間対機械)
  • マス
  • ルール

あたりが必要みたい。

自分の場合、機械のプレーヤーなんてそもそも作れんし、石は○●だし、マスは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

http://www.aerith.net/design/othello-j.html

https://akira-watson.com/android/class-method.html

カテゴリー: したい タグ: , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です