blog.hekt.org

CPU追加

なんか普通にできてしまいました。ソース(v0.4)

指定された座標に置くことができるかを調べる関数で、置ける場合に取れる石の座標も返すようにしたのですが、前回までは取れる石の座標を計算するパーツだけを返して、実際に座標を計算するのはそれを受け取った関数だったのですが、んなことをせずに最初から計算した座標を返すようにしました。(これが前回の「遠回り」。まあ辞書の使い方がわかったからいいけど)

今回のバージョンでは、置けない場合はその理由(既に埋まっている/石を一つも取れない)に対応する一桁のエラーナンバーを返し、置ける場合にはそれによって取れる石の座標をリストにして返します。(現時点ではy座標、x座標と順番に追加していて、この場合(0から始まるので)偶数がy座標、奇数がx座標になりますが、この二つを一つのリストにしてやったほうがスマートな気がします。S.append(x), S.append(y)ではなく、S.append([x, y])という感じで。)

で、誰も動かさないのに勝手に設定した今回の目玉であるCPUの動作ですが、まず隅を取れるかどうか確認します。具体的に言うと、0,0と0,7と7,0と7,7をさっき説明した関数に渡し、エラーナンバーが帰ってこなかった場合、そこに置きます。滅多にないとは思いますが、これらが同時に取れるようになった場合、0,0 > 0,7 > 7,0 > 7,7の順に優先されます。書いた順番。

隅が取れない場合、総当りで全てのマス目を調べて、もっとも多くの石を取れる場所のなかからランダムで一箇所選択し、そこに置きます。一箇所も置けない場合にはパスします。(置けるマスを一つずつ調べ、よりも多くの石を取れる座標が見つかった場合に次々と候補を更新していくのですが、同じ数の石を取れる場合はランダムで更新するかしないかを決定します。でもこの方法だと最初に見つかった座標ほど選択されにくくなりますね。4つ見つかった場合、選ばれる確率は後に見つけた方から順番に50%, 25%, 12.5% 12.5%です。同じ数字が見つかった場合リストに追加して、後からランダムで選択したほうがよさそうですね。)

ここまで頑張って書いても誰も読まないだろうとは思いますが、こうやって処理を文章にして説明すると自分が何を書いたのかを改めて理解できて、勉強になるんです。