teriyaki note

好きなものはラーメンと将棋

Kotlin でAndroid 向け将棋アプリを作る Part 2 - 将棋盤の完成編

前回

Kotlin を用いたAndroid アプリ開発です。

前回は将棋盤を描画するところまでやってみましたが、今回は必要最低限の機能を全て実装してみます。

どちらかといえば備忘録的な意味合いが強いです。すみません。

成果物

少し見辛いかもしれませんが、一局の将棋を指すための最低限の機能を実装しました。

f:id:teriyaki398:20190314212422g:plain

ちなみに、成る/成らない ユーザーへの選択はAlertDialog と呼ばれるクラスを用いて実装しています。

機能の分解

将棋盤として成立されるための機能を考えてみます。

  • 駒はルール通りの場所にしか動けない/打てない
  • ユーザーが駒を成る/成らない を選択できる
  • 相手の駒を取ることができる
  • 持ち駒を使用できる

といった所でしょうか。

ここで、本記事で「選択状態」と呼ばれる状態を定義したいと思います。

選択状態とは、何かしらの駒が選択されている状態とします。

現実世界の将棋でいうプレイヤーが駒を手に持っている状態と考えればいいかもしれません。

この選択状態を軸に、私のアプリは次のような、なんちゃってフローチャートのように動作します。

f:id:teriyaki398:20190314221812p:plain:w450

また、前回から進めて、ユーザが操作を行うメインの画面には次のように3つのGridView を配置してあります。

f:id:teriyaki398:20190314215215p:plain:w450

駒はルール通りの場所にしか動かせない

これは非常に面倒ですが、実装はそこまで難しくないでしょう。

簡単な流れは以下の通りです。

  • 盤面上の駒の配置、選択状態にある駒とその場所から、その駒が行ける場所のindex リストを作成
  • 盤面の画像を更新し、行ける場所だけ明るく、それ以外は暗くする
  • クリックされたマスのindex がそのリストに入っているなら動かす

index リストの作成ですが、将棋の駒の動きはどれも単純なので、面倒ではありますが難しくは無いでしょう。

長いのでコードは省略します。

ユーザーが駒を成る/成らない を選択できる

駒が成れる可能性があるときはユーザに成る/成らない を選んでもらうことになります。

今回はAlertDialog を用いて選択を促してみました。

developer.android.com

joyplot.com

メンバ変数などで定義されているものと、ダイアログを呼び出すコードは以下の通りです。

変数名 役割
context MainActivity から受け取ったContext
pieceMatrix 盤面上の駒の配置を表す二次元配列
narigomaMap 駒をなった時の名称を検索するための辞書
refreshBoard() 将棋盤のView を更新する

narigomaMap は、例えばnarigomaMap["s_fu"] // "s_to" といった感じで使います。

先手の駒には "s"、後手の駒には"g" と付けてあります。

fun selectNari(pos: Int){
    AlertDialog.Builder(context!!).apply {
        setTitle("成りますか?")
        setPositiveButton("成る", DialogInterface.OnClickListener{ _, _ ->
            val pieceName = pieceMatrix[pos/9][pos%9]
            pieceMatrix[pos/9][pos%9] = narigomaMap[pieceName]
            refreshBoard()
        })
        setNegativeButton("成らない", null)
        show()
    }
}

相手の駒を取ることができる

これは駒を動かす。という部分と密接に関係しています。

動かす先に相手の駒がある場合はそれを取得します。それだけです。

より具体的には、持ち駒の数を保存するリストを作成して、対応する駒の値を+1 します。

気をつけなくてはいけないのは成駒を取った場合です。

例えば、と金を取った場合は持ち駒の歩が増えることになります。

持ち駒を使用できる

上記の機能を応用することで実現できます。

駒を動きと同様に、駒を打てる場所にも制限があることに注意しましょう。

所感

今回は、コードというよりは備忘録的な感じで記録しておきたいと思います。