burikaigi2017 in toyama「c# 大好き mvp による、c#...
TRANSCRIPT
C# 大好き MVP によるC# ドキドキ・ライブコーディング !!
~ 小島の分 ~小島 富治雄
BuriKaigi2017 in Toyama2017-01-28
自己紹介
• 小島 富治雄• @Fujiwo• 福井コンピュータアーキテクト株式会社
• Microsoft MVP (2005-2017) C# 関連
C# との出会い• Anders Hejlsberg• 1983 年 Turbo Pascal• (1995 年 Delphi)• 2000 年 C#
ANDERS HEJLSBERG との出会い
• Anders Hejlsberg• 1983 年 Turbo Pascal• (1995 年 Delphi)• 2000 年 C#
• 2006 年 2 月 2 日 横浜• MVP Global Summit
4
C# の好きなところ• マルチ パラダイム言語• 様々なパラダイムを徐々に学べる
delegate
C# 1.X C# 2.0 C# 3.0 C# 4.0 C# 5.0
class
手続き型 関数型ラムダ式
LINQ
型推論
ジェネリック
拡張メソッド
動的型付け
dynamic
非同期
async/await
オブジェクト指向
Parallel
…
C#• マルチパラダイム言語• ちょうど良い
• シンプルな記述• ちょうど良い
• 多用途• 各種デバイス、サーバーサイド
• ツールのサポート• Visual Studio
今回のお題
• オセロの CPU アルゴリズム• 2014 年のお題が 4 人打ちに
• オセロが下手、という時点で既に難問• どこに打てば勝てるか、良く分からない
前回の PlayerFujiwo のアルゴリズムを四人用に
0. 置ける位置の中からランダムに選ぶ
1. 置いた後に、味方の石が最も多くなる位置に置く
2. そこに置くことで、味方の盤面の価値が最も上がる位置に置く
3. 置いて、次に他の 3 人の分も置いてみることで、味方にとって盤面の価値が最も上がる位置に置く
他に思い付いたアルゴリズム
• 「ライフライン」• テレフォン• 例えば、 twilio ( 電話 API) でオセロ名人に電話をかけて正
着を訊いてはどうか
• オーディエンス• 会場アンケート API ( 謎 )
• 50:50• ちょっとよくわからない
役割自分の役割は何か ?
私の役割• 「ちゃんとやる」こと。• ちゃんとやらないと石野さんにおこられる。
ちゃんとやれよ。何ちゃんとやってんだ !
私の役割
•ちゃんと「工夫」しないと。
2015 年のお題「七ならべ」のときに思いついた「工夫」• リフレクション ?• 他の人が書いたクラスのメソッドを書き換え
る ?• Unsafe?
メソッドが取り替えられないならインスタンスを取り替えてしまえば良いじゃない
今回の「工夫」
• そもそもオセロが弱い。• 2 人打ちでも石をどこに置けばよいのかわからない。• オセロが強いひとがやればよいのに。
誰が強い ?• 最初に 4 人分戦わせて、一番強いひとが私の代わりに打て
ばよいのに。• 5 回対戦して強いひとを選ぶ。class PlayerTable
: IEnumerable<KeyValuePair<Board.Piece, IPlayer>> { Dictionary<Board.Piece, IPlayer> playerDictionary
= new Dictionary<Board.Piece, IPlayer>(); ……}class GameRunner { ……}
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; ……}
ほぼ全てのアルゴリズムが対戦前
対戦中 :自分のチームのためだと勘違いしてくれればよいのに。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) { …… } ……}