PowerPoint プレゼンテーション

インタラクティブ・ゲーム制作
<プログラミングコース>
第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のループをスマートに
これが
こうなる
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に直して使うのがおすすめ
foreach(
仕舞っている型 &取り出し変数名,
データが詰まっている配列やリスト) {
取り出し変数名を使った処理
}
– 詰め込んでいるのが配列でもvectorでも
listでも何でもイケちゃうあたりが
闇魔術
合わせると
1. 事前にリストのサイズを得る
– リスト名.size()
2. 0~サイズ-1までの乱数を得る
– boost::random
3. 整数のカウンタを用意し、
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まで
– 組み込みチェックなどが必要なので、
それ以降は受け付けません
TO BE CONTINUED…