burikaigi2017 in toyama「c# 大好き mvp による、c#...

22
C# 大大大 MVP 大大大 C# 大大大大 大大大大大大大大大 !! 大大大大 大大 大大大 BuriKaigi2017 in Toyama 2017-01-28

Upload: fujio-kojima

Post on 12-Apr-2017

38 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

C# 大好き MVP によるC# ドキドキ・ライブコーディング !!

~ 小島の分 ~小島 富治雄

BuriKaigi2017 in Toyama2017-01-28

Page 2: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

自己紹介

• 小島 富治雄• @Fujiwo• 福井コンピュータアーキテクト株式会社

• Microsoft MVP (2005-2017) C# 関連

Page 3: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

C# との出会い• Anders Hejlsberg• 1983 年 Turbo Pascal• (1995 年 Delphi)• 2000 年 C#

Page 4: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

ANDERS HEJLSBERG との出会い

• Anders Hejlsberg• 1983 年 Turbo Pascal• (1995 年 Delphi)• 2000 年 C#

• 2006 年 2 月 2 日 横浜• MVP Global Summit

4

Page 5: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

C# の好きなところ• マルチ パラダイム言語• 様々なパラダイムを徐々に学べる

delegate

C# 1.X C# 2.0 C# 3.0 C# 4.0 C# 5.0

class

手続き型 関数型ラムダ式

LINQ

型推論

ジェネリック

拡張メソッド

動的型付け

dynamic

非同期

async/await

オブジェクト指向

Parallel

Page 6: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

C#• マルチパラダイム言語• ちょうど良い

• シンプルな記述• ちょうど良い

• 多用途• 各種デバイス、サーバーサイド

• ツールのサポート• Visual Studio

Page 7: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

今回のお題

• オセロの CPU アルゴリズム• 2014 年のお題が 4 人打ちに

• オセロが下手、という時点で既に難問• どこに打てば勝てるか、良く分からない

Page 8: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

前回の PlayerFujiwo のアルゴリズムを四人用に

Page 9: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

0. 置ける位置の中からランダムに選ぶ

Page 10: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

1. 置いた後に、味方の石が最も多くなる位置に置く

Page 11: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

2. そこに置くことで、味方の盤面の価値が最も上がる位置に置く

Page 12: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

3. 置いて、次に他の 3 人の分も置いてみることで、味方にとって盤面の価値が最も上がる位置に置く

Page 13: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

他に思い付いたアルゴリズム

• 「ライフライン」• テレフォン• 例えば、 twilio ( 電話 API) でオセロ名人に電話をかけて正

着を訊いてはどうか

• オーディエンス• 会場アンケート API ( 謎 )

• 50:50• ちょっとよくわからない

Page 14: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

役割自分の役割は何か ?

Page 15: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

私の役割• 「ちゃんとやる」こと。• ちゃんとやらないと石野さんにおこられる。

ちゃんとやれよ。何ちゃんとやってんだ !

Page 16: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

私の役割

•ちゃんと「工夫」しないと。

Page 17: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

2015 年のお題「七ならべ」のときに思いついた「工夫」• リフレクション ?• 他の人が書いたクラスのメソッドを書き換え

る ?• Unsafe?

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

Page 18: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

今回の「工夫」

• そもそもオセロが弱い。• 2 人打ちでも石をどこに置けばよいのかわからない。• オセロが強いひとがやればよいのに。

Page 19: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

誰が強い ?• 最初に 4 人分戦わせて、一番強いひとが私の代わりに打て

ばよいのに。• 5 回対戦して強いひとを選ぶ。class PlayerTable

: IEnumerable<KeyValuePair<Board.Piece, IPlayer>> {    Dictionary<Board.Piece, IPlayer> playerDictionary

= new Dictionary<Board.Piece, IPlayer>(); ……}class GameRunner { ……}

Page 20: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

PlayerChecker: 一番強いひとをチェックclass PlayerChecker{     readonly Board.Piece theStrongestPiece;     readonly PlayerTable playerTable = new PlayerTable(         players: new IPlayer[] {             new PlayerRyotaMurohoshi(),             new PlayerAILight       (),             new PlayerXin9le        (),             new PlayerFujiwo3       ()         }     );

    public static Board.Piece TheStrongestPiece => theStrongestPiece; ……}

Page 21: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

ほぼ全てのアルゴリズムが対戦前

Page 22: BuriKaigi2017 in Toyama「C# 大好き MVP による、C# ドキドキ・ライブコーディング!! ~小島の分~」

対戦中 :自分のチームのためだと勘違いしてくれればよいのに。class PieceChanger : IDisposable{     readonly Board.Piece[,] boardDataOriginal;     readonly Board.Piece[,] boardData;

    public PieceChanger(Board.Piece[,] boardData, Board.Piece privatePiece) {         if (privatePiece.IsOldMansPiece()) {             this.boardData    = null;             boardDataOriginal = null;         } else {             this.boardData    = boardData;             boardDataOriginal = (Board.Piece[,])boardData.Clone();             Change(privatePiece);         }     }

    void Change(Board.Piece privatePiece) { …… } ……}