インタラクティブ・ゲーム制作 <プログラミングコース> 第12回 Boostと数学
今日の内容 Boostの導入 今時C++を使うならやはり外せない 乱数やアルゴリズム周りなど、 AI構築に有用な機能も盛りだくさん
闇の魔術の粋を味わうがいい Boost入門
Boostとは 闇の魔術師達が築いた叡智の結晶 ある程度の機能はC++11として、 正式に採用されている 標準ライブラリのみでは不便な機能を補強 「俺の知ってるC++と違う」としか思えない言語の拡張 ある程度の機能はC++11として、 正式に採用されている Visual C++ 2010でも一部の仕様は搭載済み 不足も多いので、Boostを併用
導入方法 「Let’s Boost」を参照のこと 授業時間内のインストールは厳しいので、授業資料ページからもダウンロード可能 http://www.kmonos.net/alang/boost/ ここを見ておけば大抵なんとかなる 授業時間内のインストールは厳しいので、授業資料ページからもダウンロード可能 1.47のパッケージ(300MB) パスの設定は別添えの資料を参考に
すぐに使えそうな機能(1) boost::random srand()&rand()よりも手軽に精度の良い 乱数が使える オセロのAIにもオススメなのは、 「メルセンヌツイスター」で 「小さな整数の一様乱数」のパターン
すぐに使えそうな機能(2) BOOST_FOREACH 配列やリスト(コンテナ全般)に対して、 最初から最後まで1つずつ処理するような ループが、絶望的に綺麗に書ける 配列の場合だとこういうやつ for(int i = 0; i < arraySize; ++i) { array[i] = ほげ~; }
Listのループをスマートに これが こうなる for(ListIte ite = puttingList.begin(); ite != puttingList.end(); ++ite) { if((*ite).x > maxX) { choicePos = (*ite); maxX = (*ite).x; } foreach(CellPosition &pos, puttingList) { if(pos.x > maxX) { choicePos = pos; maxX = pos.x; }
是非使いましょう BOOST_FOREACHという名前だが、 foreachに直して使うのがおすすめ 詰め込んでいるのが配列でもvectorでもlistでも何でもイケちゃうあたりが 闇魔術
合わせると 事前にリストのサイズを得る 0~サイズ-1までの乱数を得る リスト名.size() 0~サイズ-1までの乱数を得る boost::random 整数のカウンタを用意し、 foreachでループしつつ、 乱数が指した順番の時点での値を 選んだ手として使う なんてやればモンテカルロの仕込みに
他にも使えそうなもの boost::thread boost::progress_timer モンテカルロの計算は並列化しやすい 一気に複数手のシミュレーションを進める 私は使う予定です boost::progress_timer あるスコープ内での所要時間計測に便利 コンストラクタとデストラクタを利用 そんな難しい実装ではない
オセロに使えるか分からんけど オススメ boost::bind,function,signals2 boost::lambda 「関数を自由に持ち運ぶ」ことができる signals2はイベントと関数呼び出しを 結び付けるのに非常に有用 boost::lambda 関数の中で関数を即席で作れちゃう やりすぎると別言語になるが、わざわざ 関数に分けたくないような時に便利
最終回にむけて ルール再確認
ルール(1) 対決用プロジェクト内のAIBaseクラスを 継承し、自分のアルゴリズムを実装 それ以外のファイルには手を加えてはいけない 外部ライブラリは原則利用可能 ただし「オセロAIライブラリ」みたいなルーチンを他者に 丸投げするようなものは不可 getHand()から参照できる情報以外は利用禁止 自分で作ったクラスの利用は可 1手の計算に使える時間は30秒まで
ルール(2) 難易度は4段階用意 提出期限は7/23(火)23:59まで 自分に合った難易度で挑戦してね! Sチャレンジができるのは最高難易度 漏れなくライブで実況します 提出期限は7/23(火)23:59まで 組み込みチェックなどが必要なので、 それ以降は受け付けません
To be continued…