リバーシの条件判定をlinqで
TRANSCRIPT
リバーシの条件判定をLINQ(りんきゅー)で
momo_*(@tututen)
自己紹介
北見から来ました
自己紹介
北見から来ました
最近CodeIQにてショートコーディングが熱い
自己紹介北見から来ました
最近CodeIQにてショートコーディングが熱い
分身
Twitter: @tututen
facebook: きっとどこかにいる
本題
リバーシの条件判定?
リバーシの条件判定=石が裏返せるか
でも、(5分じゃ)逐次説明できないので
_人人人人人人人_> Demo見てね <‾Y^Y^Y^Y^Y^Y‾
Demo(後で資料付きで)
対戦しましょ?
対戦しましょ?ご静聴ありがとうございました
Presented By momo_*(@tututen)
資料
資料目次TestAll & TestHalf
選択した自分の周りのマス
自分の周りに相手の石が存在するか?
各相対位置方向に延長する
自分の石の手前まで取得
各相対位置方向に自分の石があるか
自分の石で挟んだマスがすべて相手の石である
ReversiできるWindow
LINQが動作するWindow
LINQが動く条件戻り値が盤面上のIEnumerable<System.Drawing.Point>であること
盤面上の変数は「x」「y」「board」
該当するPointはオレンジになります
TestAll(例)
全部のマスをオレンジにする
TestAll(例)
全部のマスをオレンジにする
TestHalf(例)
網目状にマスをオレンジにする
TestHalf(例)
網目状にマスをオレンジにする偶数 奇数
選択した自分の周りのマス
自分との相対位置を考えてみる
(-1,1) (0, 1) (1, 1)
(-1,0) (1, 0)
(-1,-1) (0, -1) (1, -1)
選択した自分の周りのマス
自分の位置を(x, y)、相対位置を(Vx, Vy)と置けばLINQで書けますよね!
選択した自分の周りのマス
最後のWhereはBoardの範囲設定
選択した自分の周りのマス
角・辺の判定もばっちし
自分の周りに相手の石が存在するか?
前提:上のような状況
自分の周りに相手の石が存在するか?
自分と反転した条件を加えるだけでよい
自分の周りに相手の石が存在するか?
自分と反転した条件を加えるだけでよい
各相対位置方向に延長する
やたらと追加されてます
各相対位置方向に延長する
(x, y)の相対位置に戻す
各相対位置方向に延長する
各相対位置方向に定数倍(1−7倍)
各相対位置方向に延長する
定数倍した位置がBoard上か確認
各相対位置方向に延長する
各相対位置方向のIEnumerable<Point>
をを作る
各相対位置方向に延長する
平滑化する
各相対位置方向に延長する
こうなります
自分の石の手前まで取得
ついにエディタの表示倍率が下がりました
自分の石の手前まで取得
TakeWhileを追加
自分の石の手前まで取得
完成っぽい?
自分の石の手前まで取得
まだまだバグはあるさー
各相対位置方向に自分の石があるか
追加部分はここ
各相対位置方向に自分の石があるか
この部分は全く一緒なので省略
各相対位置方向に自分の石があるか
各相対方向に自分の石があるかチェック無ければ、ひっくり返せないと判断
各相対位置方向に自分の石があるか
もうちょい頑張りましょう(上方向)
自分の石で挟んだマスがすべて相手の石である
追加部分はここ
自分の石で挟んだマスがすべて相手の石である
下のSelectの中身と一緒なので省略
自分の石で挟んだマスがすべて相手の石である
挟んだマス目の石がすべて相手の石である
自分の石で挟んだマスがすべて相手の石である
Misson Complete
全文(倍率100%)