•
•
•
•
•
• http://www.microsoft.com/ja-jp/dev/campaign/csharp/story.aspx
•
3
C丼
•
•
1.
2.
3.
1.
2.
•
•
•
•
•
•
•
石野さん のことだから…
まさかとは思うけど、
他プレイヤーの GetPutCard
メソッドを書き換えて勝てって
意味かも (謎)?
•
• 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! だめじゃん!!
メソッドが取り替えられないなら
インスタンスを取り替えてしまえば
良いじゃない
こうして…
こうだ!!
異物混入!!!
全勝!
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"; }
}
public 裏工作をするプレイヤー()
{
偽装工作.開始(ゲーム);
自分のことは棚に上げてイカサマされたときに訴える();
}
void 自分のことは棚に上げてイカサマされたときに訴える()
{
const int 最大のパスの回数 = 3;
Application.Current.MainWindow.Closing += (sender, e) => {
if (GetPutCardが呼ばれた回数 < 最大のパスの回数)
MessageBox.Show("イカサマだ!!", "或るプレイヤーからの訴え",
MessageBoxButton.OK, MessageBoxImage.Warning);
};
}
•
•
•
•
• 最後の札、はしっこの札 (AかK)、次も自分が持ってる: 出す
• 次が自分じゃない札:
• とにかく止められるとき (パスできるとき) は止めてパス
• パス3回だったら
「その札より後ろにある自分の札の枚数 - その札より後ろにある自分以外の
札の枚数」がなるべく多くなるやつを出す
それぞれの出せる札で
この基準で評価点をつけ、
評価点が最高の札を出す
•
•
1. 7から遠い札ほど高評価 (出しても相手に有利になりにくい)
2. その札より後ろに自分の札があった場合
• 「後ろに自分の札までの距離」が近いほど高評価とする
評価が或る程度以上高け
れば、パスできてもパス
せずに出す
珍現象発生!!
•
石野さんの勝ち!
•
石野さんの勝ち!
•

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