インタラクティブ・ゲーム制作 <プログラミングコース>

Slides:



Advertisements
Similar presentations
Generic programming と STL
Advertisements

連続系アルゴリズム演習 第2回 OpenMPによる課題.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
オブジェクト指向プログラミング(4) 静的分析(2)
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム 第10回 mallocとfree
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
インタラクティブ・ゲーム制作 <プログラミングコース>
第8回 プログラミングⅡ 第8回
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
構造体.
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
インタラクティブ・ゲーム制作 <プログラミングコース>
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
プログラミング演習3 第2回 GUIの復習.
補足説明.
C 言語について 補足資料 資料および授業の情報は :
インタラクティブ・ゲーム制作 <プログラミングコース>
ローカル変数とグローバル変数 ローカル変数  定義された関数内だけで使用できる変数 グローバル変数 プログラム全体で使用できる変数.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
第10章 これはかなり大変な事項!! ~ポインタ~
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プログラミング演習3 第2回 GUIの復習.
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
コンパイラ 2012年11月15日
インタラクティブ・ゲーム制作 <プログラミングコース>
第7回 プログラミングⅡ 第7回
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
オブジェクト指向言語論 第八回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
インタラクティブ・ゲーム制作 プログラミングコース 補足資料
一時的な型 長谷川啓
プロジェクト演習Ⅱ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
アルゴリズムとプログラミング (Algorithms and Programming)
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
11: 動的メモリ確保 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
オブジェクト指向プログラミング クラス 継承
Boostのスマートなポインタを使ってみる
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
精密工学科プログラミング基礎 第7回資料 (11/27実施)
11: 動的メモリ確保 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
11: 動的メモリ確保 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
プログラミング演習I 2003年6月11日(第9回) 木村巌.
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
CGと形状モデリング 授業資料 1,2限: 大竹豊(東京大学) 3,4限: 俵 丈展(理化学研究所)
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
TList リスト構造とは? 複数のデータを扱うために、 データの内容と、次のデータへのポインタを持つ構造体を使う。
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

インタラクティブ・ゲーム制作 <プログラミングコース> 第5回 オセロの叩き台プログラム STL(vector)入門

今日の内容 オセロの土台になるプログラムを作る その上で必要になる技術を学ぶ 無駄に3Dで作ります newとdeleteの必要性(スタックとヒープ) STL(vector) (本当は必要ないけど寄り道して) ファイル入出力

newやdeleteが必要になってくると理解が必須です スタックとヒープのはなし

2つのメモリ領域 プログラムから扱えるメモリは、 2種類の領域が存在する スタック ヒープ 今まで作って扱ってきた変数、オブジェクトが 利用していた領域 ここに作った変数のことを自動変数と呼ぶ ヒープ new(C言語だとmalloc())で確保した配列、 オブジェクトが利用する領域 メモリリークのリスクがある

自動変数の挙動 スコープインで生成、アウトで消滅 arg_num num 10 10 コピー 20 // 渡されてきた値を2倍しようとする関数 void cantChangeValue(int arg_num) { arg_num *= 2; return; } // main()の中だとして int num = 10; cout << “before:” << num << endl; cantChangeValue(num); cout << “after:” << num << endl; 10 arg_num 10 コピー num 20

ヒープとは 関数スコープとは別の場所にある領域 ヒープ領域 Monster Monster Monster Monster Monster Point! // main()の中だとして Monster *pMonsters = NULL; // Monsterを生成する pMonsters = new Monster[6]; // 諸々使い終わったら delete [] pMonsters; pMonsters = NULL; pMonsters

やってしまうとまずいこと 確保したアドレスを忘れるとリーク確定 ヒープ領域 Monster Monster Monster Monster Point! // 指定個数分Monsterをnewする関数 Monster* createMonster(int argNum) { Monster *pMonsters = new Monster[argNum]; return pMonsters; } // main()の中だとして // Monsterを生成する関数を呼び出す createMonster(6); // 本当はポインタを返値で受けないとまずい// それを怠ると…… pMonsters 6 argNum

すんません、ほんとすんません さっき確保したアドレス どこへやった!? 君のようなずさんな プログラマは嫌いだよ

new&delete扱いの心得 可能な限り自動変数(スタック)を使う new&deleteが必要な場面は次の通り 個数が大きい、あるいは変動する配列を 作りたい これもできればSTLのvectorを使うべき ポリモフィズムを使いたい newしたら必ずポインタで受ける 好き勝手にnewしても大丈夫なクラスの作り方もあるが、それは上級編 すぐdeleteするコードを書く

どう見ても碁石です、本当にありがとうございました。 今日のサンプル

今できること オセロ盤が表示されます 無駄に3Dでカメラもまわせます 石が置けます キー操作でテキストファイルを入出力 碁石ですいません 白黒交互に置けます 盤面無視して置けます 置きすぎると……? キー操作でテキストファイルを入出力

現在の設計 以前のレビューでも話に上がった、 継承型のフレームワークを使用 本来ならもっとクラス分けしたいが、 それは今後追々変更していく おかげでmain()は超スッキリ FKUTは補助的に使っているが、 基本的にはプレーンのFKベース 本来ならもっとクラス分けしたいが、 それは今後追々変更していく まずはフレームワークの構造になれよう

とりあえずやりたいこと (今日の課題) オセロにもっていくために オセロとは直接関係ないけれど 盤面に綺麗に置けるようにしたい 石を無制限に置けるようにしたい 盤面の状態を保存できるようにしたい

座標系 8x8=64マス マスの1辺の長さは10 石の半径は4(直径8) Y座標0のXZ平面

綺麗に置くためには 盤面は8x8で1マスの1辺が10.0 現状のやり方で得た座標を、 下一桁が5になるように補正する 中心は(0.0, 0.0, 0.0)でXZ平面に広がっている 現状のやり方で得た座標を、 下一桁が5になるように補正する 19.99 (15.0, 15.0) 10.0 10.0 19.99

無制限に置けるようにするには 個数決め打ちの配列では無理 動的確保(new)による配列で、 オーバーしそうになったら大きい配列を作り直す 膨大な個数を決め打ちにしておくのは無駄 動的確保(new)による配列で、 オーバーしそうになったら大きい配列を作り直す 不可能ではないが、データの移し替えが 面倒だったり、メモリリークの危険が STLのvector配列を使う←せいかい

vector配列とは 個数を最初に決めず、後から変更したり、どんどん付け足したりできるすごい配列 どんな型でも仕舞えるが、オブジェクトの場合はポインタで仕舞った方が無難 fk_Vectorみたいに値として扱えるように 作られているクラスなら仕舞える 詳しい使い方は渡辺先生の資料を参照 http://www2.teu.ac.jp/aqua/GS/text/PDF/Container.pdf

ポインタを扱う際の定番処理 // [ヘッダでの宣言] fk_Modelポインタをvector配列で扱う vector<fk_Model *> modelArray; // [cppでの実装] // fk_Modelを1つ作り、配列に加える fk_Model *pModel = new fk_Model(); modelArray.push_back(pModel); // n番目のfk_Modelに対してメンバ関数を呼び出す modelArray[n]->getPosition(); // n番目のfk_Modelをシーンに登録する scene.entryModel(modelArray[n]);

最重要処理:お片付け // 配列の個数を取得 int arraySize = modelArray.size(); for(int i = 0; i < arraySize; ++i) { // シーンから必ずモデルを消去する scene.removeModel(modelArray[i]); // メモリから削除 delete modelArray[i]; } // vector配列自体をクリア modelArray.clear();

よく使うvector配列のメンバ関数 resize() size() push_back() back() at() clear() 配列のサイズ変更 size() 今のサイズを得る push_back() 配列のお尻に1部屋足す back() 配列のお尻を参照する at() [i]のかわりに.at(i)とする vector配列をポインタ経由でアクセスする際に使用 clear() 配列をクリアしてサイズを0にする

今日の課題 既に石を置いた場所に置けないように するにはどうすればいいだろうか? 今日の課題をできるところまで 考えてみるだけでもOKだが、極力具体的に 実際にやってみれたならなおよし 今日の課題をできるところまで 来週以降実装例と共に解説するので、 どこまで自力で頑張ったか、のアピール用

To be continued…