リバーシの条件判定をlinqで

50
リバーシの条件判定を LINQ(りんきゅー)で momo_*(@tututen)

Upload: fumihito-yokoyama

Post on 13-Jul-2015

210 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: リバーシの条件判定をlinqで

リバーシの条件判定をLINQ(りんきゅー)で

momo_*(@tututen)

Page 2: リバーシの条件判定をlinqで

自己紹介

北見から来ました

Page 3: リバーシの条件判定をlinqで
Page 4: リバーシの条件判定をlinqで
Page 5: リバーシの条件判定をlinqで

自己紹介

北見から来ました

最近CodeIQにてショートコーディングが熱い

Page 6: リバーシの条件判定をlinqで
Page 7: リバーシの条件判定をlinqで

自己紹介北見から来ました

最近CodeIQにてショートコーディングが熱い

分身

Twitter: @tututen

facebook: きっとどこかにいる

Page 8: リバーシの条件判定をlinqで

本題

Page 9: リバーシの条件判定をlinqで

リバーシの条件判定?

Page 10: リバーシの条件判定をlinqで

リバーシの条件判定=石が裏返せるか

Page 11: リバーシの条件判定をlinqで

でも、(5分じゃ)逐次説明できないので

Page 12: リバーシの条件判定をlinqで

_人人人人人人人_> Demo見てね <‾Y^Y^Y^Y^Y^Y‾

Page 13: リバーシの条件判定をlinqで

Demo(後で資料付きで)

Page 14: リバーシの条件判定をlinqで

対戦しましょ?

Page 15: リバーシの条件判定をlinqで

対戦しましょ?ご静聴ありがとうございました

Presented By momo_*(@tututen)

Page 16: リバーシの条件判定をlinqで

資料

Page 17: リバーシの条件判定をlinqで

資料目次TestAll & TestHalf

選択した自分の周りのマス

自分の周りに相手の石が存在するか?

各相対位置方向に延長する

自分の石の手前まで取得

各相対位置方向に自分の石があるか

自分の石で挟んだマスがすべて相手の石である

Page 18: リバーシの条件判定をlinqで

ReversiできるWindow

LINQが動作するWindow

Page 19: リバーシの条件判定をlinqで

LINQが動く条件戻り値が盤面上のIEnumerable<System.Drawing.Point>であること

盤面上の変数は「x」「y」「board」

該当するPointはオレンジになります

Page 20: リバーシの条件判定をlinqで

TestAll(例)

全部のマスをオレンジにする

Page 21: リバーシの条件判定をlinqで

TestAll(例)

全部のマスをオレンジにする

Page 22: リバーシの条件判定をlinqで

TestHalf(例)

網目状にマスをオレンジにする

Page 23: リバーシの条件判定をlinqで

TestHalf(例)

網目状にマスをオレンジにする偶数 奇数

Page 24: リバーシの条件判定をlinqで

選択した自分の周りのマス

自分との相対位置を考えてみる

(-1,1) (0, 1) (1, 1)

(-1,0) (1, 0)

(-1,-1) (0, -1) (1, -1)

Page 25: リバーシの条件判定をlinqで

選択した自分の周りのマス

自分の位置を(x, y)、相対位置を(Vx, Vy)と置けばLINQで書けますよね!

Page 26: リバーシの条件判定をlinqで

選択した自分の周りのマス

最後のWhereはBoardの範囲設定

Page 27: リバーシの条件判定をlinqで

選択した自分の周りのマス

角・辺の判定もばっちし

Page 28: リバーシの条件判定をlinqで

自分の周りに相手の石が存在するか?

前提:上のような状況

Page 29: リバーシの条件判定をlinqで

自分の周りに相手の石が存在するか?

自分と反転した条件を加えるだけでよい

Page 30: リバーシの条件判定をlinqで

自分の周りに相手の石が存在するか?

自分と反転した条件を加えるだけでよい

Page 31: リバーシの条件判定をlinqで

各相対位置方向に延長する

やたらと追加されてます

Page 32: リバーシの条件判定をlinqで

各相対位置方向に延長する

(x, y)の相対位置に戻す

Page 33: リバーシの条件判定をlinqで

各相対位置方向に延長する

各相対位置方向に定数倍(1−7倍)

Page 34: リバーシの条件判定をlinqで

各相対位置方向に延長する

定数倍した位置がBoard上か確認

Page 35: リバーシの条件判定をlinqで

各相対位置方向に延長する

各相対位置方向のIEnumerable<Point>

をを作る

Page 36: リバーシの条件判定をlinqで

各相対位置方向に延長する

平滑化する

Page 37: リバーシの条件判定をlinqで

各相対位置方向に延長する

こうなります

Page 38: リバーシの条件判定をlinqで

自分の石の手前まで取得

ついにエディタの表示倍率が下がりました

Page 39: リバーシの条件判定をlinqで

自分の石の手前まで取得

TakeWhileを追加

Page 40: リバーシの条件判定をlinqで

自分の石の手前まで取得

完成っぽい?

Page 41: リバーシの条件判定をlinqで

自分の石の手前まで取得

まだまだバグはあるさー

Page 42: リバーシの条件判定をlinqで

各相対位置方向に自分の石があるか

追加部分はここ

Page 43: リバーシの条件判定をlinqで

各相対位置方向に自分の石があるか

この部分は全く一緒なので省略

Page 44: リバーシの条件判定をlinqで

各相対位置方向に自分の石があるか

各相対方向に自分の石があるかチェック無ければ、ひっくり返せないと判断

Page 45: リバーシの条件判定をlinqで

各相対位置方向に自分の石があるか

もうちょい頑張りましょう(上方向)

Page 46: リバーシの条件判定をlinqで

自分の石で挟んだマスがすべて相手の石である

追加部分はここ

Page 47: リバーシの条件判定をlinqで

自分の石で挟んだマスがすべて相手の石である

下のSelectの中身と一緒なので省略

Page 48: リバーシの条件判定をlinqで

自分の石で挟んだマスがすべて相手の石である

挟んだマス目の石がすべて相手の石である

Page 49: リバーシの条件判定をlinqで

自分の石で挟んだマスがすべて相手の石である

Misson Complete

Page 50: リバーシの条件判定をlinqで

全文(倍率100%)