160 likes | 368 Views
インタラクティブ・ゲーム制作 < プログラミングコース>. 第 12 回 Boost と数学. 今日の内容. Boost の導入 今時 C++ を使うならやはり外せない 乱数 やアルゴリズム周りなど、 AI 構築に有用な機能も盛りだくさん. 闇の魔術の粋を味わうがいい. Boost 入門. Boost とは. 闇の魔術師達が築いた叡智の結晶 標準ライブラリ のみで は不便な機能を補強 「俺の知ってる C++ と違う」としか思えない言語の拡張 ある程度の機能は C++11 として、 正式に採用されている Visual C++ 2010 でも一部の仕様は搭載済み
E N D
インタラクティブ・ゲーム制作<プログラミングコース>インタラクティブ・ゲーム制作<プログラミングコース> 第12回 Boostと数学
今日の内容 • Boostの導入 • 今時C++を使うならやはり外せない • 乱数やアルゴリズム周りなど、AI構築に有用な機能も盛りだくさん
闇の魔術の粋を味わうがいい Boost入門
Boostとは • 闇の魔術師達が築いた叡智の結晶 • 標準ライブラリのみでは不便な機能を補強 • 「俺の知ってる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のループをスマートに これが こうなる foreach(CellPosition &pos, puttingList) { if(pos.x > maxX) { choicePos = pos; maxX = pos.x; } } for(ListIte ite = puttingList.begin(); ite != puttingList.end(); ++ite) { if((*ite).x > maxX) { choicePos = (*ite); maxX = (*ite).x; } }
是非使いましょう • BOOST_FOREACHという名前だが、foreachに直して使うのがおすすめ foreach(仕舞っている型 &取り出し変数名,データが詰まっている配列やリスト) { 取り出し変数名を使った処理} • 詰め込んでいるのが配列でもvectorでもlistでも何でもイケちゃうあたりが闇魔術
合わせると • 事前にリストのサイズを得る • リスト名.size() • 0~サイズ-1までの乱数を得る • boost::random • 整数のカウンタを用意し、foreachでループしつつ、乱数が指した順番の時点での値を選んだ手として使う • なんてやればモンテカルロの仕込みに
他にも使えそうなもの • boost::thread • モンテカルロの計算は並列化しやすい • 一気に複数手のシミュレーションを進める • 私は使う予定です • boost::progress_timer • あるスコープ内での所要時間計測に便利 • コンストラクタとデストラクタを利用 • そんな難しい実装ではない
オセロに使えるか分からんけどオススメ • boost::bind,function,signals2 • 「関数を自由に持ち運ぶ」ことができる • signals2はイベントと関数呼び出しを結び付けるのに非常に有用 • boost::lambda • 関数の中で関数を即席で作れちゃう • やりすぎると別言語になるが、わざわざ関数に分けたくないような時に便利
最終回にむけて ルール再確認
ルール(1) • 対決用プロジェクト内のAIBaseクラスを継承し、自分のアルゴリズムを実装 • それ以外のファイルには手を加えてはいけない • 自分のAIで使うソースやヘッダの追加は可 • 外部ライブラリは原則利用可能 • ただし「オセロAIライブラリ」みたいなルーチンを他者に丸投げするようなものは不可 • getHand()から参照できる情報以外は利用禁止 • 自分で作ったクラスの利用は可 • 1手の計算に使える時間は30秒まで
ルール(2) • 難易度は4段階用意 • 自分に合った難易度で挑戦してね! • Sチャレンジができるのは最高難易度 • 漏れなくライブで実況します • 提出期限は7/23(火)23:59まで • 組み込みチェックなどが必要なので、それ以降は受け付けません