.NET MVP によるドキドキ・ライブコーディング! 小島の分

0

No comments posted yet

Comments

Slide 1

.NET MVP による ドキドキ・ライブコーディング! ~ 小島の分 ~ 小島 富治雄 MVP Community Camp 2015 北陸会場 2015-01-31

Slide 2

自己紹介 小島 富治雄 @Fujiwo 福井コンピュータアーキテクト株式会社 Microsoft MVP C#→.NET (2005-2015)

Slide 3

C#と共に歩んだ 15 年 C#と共に歩んだ 15 年 - Powered by C# http://www.microsoft.com/ja-jp/dev/campaign/csharp/story.aspx 3人とも載りました。 3 C丼

Slide 4

今回のお題 七並べの CPU アルゴリズム 前回はオセロゲーム

Slide 5

PlayerKojima の戦略

Slide 6

PlayerKojima の戦略 ゲームランナー リフレクション? アルゴリズム 戦略1 戦略2

Slide 7

1. ゲームランナー

Slide 8

ゲームランナー 対戦を何千回とシミュレートして、 アルゴリズムを改善したい コンソールアプリケーション ベース

Slide 9

ゲームランナー

Slide 10

2. リフレクション?

Slide 11

お題の確認 「石野さんの作った WPF 七並べの 小島担当のプレイヤーの AI プログラムを 書き換えて勝つ」 石野さん: PlayerIshino.cs 鈴木さん: PlayerSuzuki.cs 小島 : KojimaPlayer.cs

Slide 12

お題の確認 私なりの解釈 石野さん のことだから… まさかとは思うけど、 他プレイヤーの GetPutCard メソッドを書き換えて勝てって 意味かも (謎)?

Slide 13

他の人が書いたクラスのメソッドを書き換える? CLR Injection: Runtime Method Replacer - CODE Project http://www.codeproject.com/Articles/37549/CLR-Injection-Runtime-Method-Replacer public static void 取り替え(this MethodInfo メソッド1, MethodInfo メソッド2) { unsafe { var メソッドへのポインター1 = メソッド1.MethodHandle.Value.ToPointer(); var メソッドへのポインター2 = メソッド2.MethodHandle.Value.ToPointer(); *((int*)new IntPtr(((int*)メソッドへのポインター1 + 1)).ToPointer()) = *((int*)new IntPtr(((int*)メソッドへのポインター2 + 1)).ToPointer()); } } unsafe! だめじゃん!!

Slide 14

メソッドが取り替えられないなら インスタンスを取り替えてしまえば 良いじゃない

Slide 15

メソッドが取り替えられないなら インスタンスを取り替えちゃえばいいじゃん

Slide 16

メソッドが取り替えられないなら インスタンスを取り替えちゃえばいいじゃん こうして… こうだ!! 異物混入!!!

Slide 17

早速ゲームランナーでテスト (1000回勝負) 全勝!

Slide 18

ソースコードを見られるとばれるか?

Slide 19

実行時に怪しまれるかも? class 偽鈴木 : 偽プレイヤー { public override string GetPalyerName() { return "どうみても本物の鈴木"; } public override string GetPalyerImageName() { return "suzuki.png"; } } class 偽石野 : 偽プレイヤー { public override string GetPalyerName() { return "疑いようのない真の石野"; } public override string GetPalyerImageName() { return "ishino.png"; } }

Slide 20

石野さんや鈴木さんだって、何か仕掛けるかも? public 裏工作をするプレイヤー() { 偽装工作.開始(ゲーム); 自分のことは棚に上げてイカサマされたときに訴える(); } void 自分のことは棚に上げてイカサマされたときに訴える() { const int 最大のパスの回数 = 3; Application.Current.MainWindow.Closing += (sender, e) => { if (GetPutCardが呼ばれた回数 < 最大のパスの回数) MessageBox.Show("イカサマだ!!", "或るプレイヤーからの訴え", MessageBoxButton.OK, MessageBoxImage.Warning); }; }

Slide 21

もしかしてだけど… 怒られるかも知れないので、 まじめな戦略も少しだけやっておこう。

Slide 22

3. アルゴリズム

Slide 23

7並べの戦略1 基本戦略 「相手に有利になる可能性がある札は、 パスできるときはけして出さない」 最後の札、はしっこの札 (AかK)、次も自分が持ってる: 出す 次が自分じゃない札: とにかく止められるとき (パスできるとき) は止めてパス パス3回だったら 「その札より後ろにある自分の札の枚数 - その札より後ろにある自分以外の札の枚数」がなるべく多くなるやつを出す それぞれの出せる札で この基準で評価点をつけ、 評価点が最高の札を出す

Slide 24

7並べの戦略2 戦略1を少し変更 「相手に有利になる可能性がある札でも、 相手を有利にする度合いと自分を有利にする度合いによっては、パスせずに出す」 7から遠い札ほど高評価 (出しても相手に有利になりにくい) その札より後ろに自分の札があった場合 「後ろに自分の札までの距離」が近いほど高評価とする 評価が或る程度以上高ければ、パスできてもパスせずに出す

Slide 26

早速ゲームランナーでテストしたものの… 珍現象発生!!

Slide 27

早速ゲームランナーでテストしたものの… 「小島: 戦略1、石野さん: 戦略2、鈴木さん: ランダム」 で10万回 石野さんの勝ち!

Slide 28

早速ゲームランナーでテストしたものの… 小島と石野さんの戦略を逆にして 10万回 石野さんの勝ち!

Slide 29

ちょっと納得いかないが (謎) さて本番での勝負の行方は…

Summary: 2015-01-31 MVP Community Camp 北陸会場 https://mvp.microsoft.com/ja-jp/mvp/comcamp-in-person-seminar.aspx http://toyama-eng.connpass.com/event/9372/ 「.NET MVP による、C# ドキドキ・ライブコーディング!!」 北信越の .NET MVP 3名が C# の魅力について語ります。LT や コーディング ライブ。 の小島の分のスライド。 slideshare 版はこちら: http://www.slideshare.net/Fujiwo/net-mvp

Tags: c#

URL: