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

Slides:



Advertisements
Similar presentations
プログラミング Ⅱ 第2回 第1回(プログラミングⅠの復 習) の解説. プログラムの作り方 いきなり完全版を作るのではなく,だんだ んふくらませていきます. TicTa cToe1.
Advertisements

初年次セミナー 第8回 データの入力.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報処理演習C2 ファイル操作について (2).
IO - 入出力 小西 亨.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
ファーストイヤー・セミナーⅡ 第8回 データの入力.
とても使いやすい Boost の serialization
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
とても使いやすい Boost の serialization
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
2004年度JAVAゼミコンテスト作品 「Othello」
第13回 プログラミングⅡ 第13回
アルゴリズムとデータ構造 2011年6月13日
第6章 2重ループ&配列 2重ループと配列をやります.
条件式 (Conditional Expressions)
システム開発実験No.7        解 説       “論理式の簡略化方法”.
インタラクティブ・ゲーム制作 <プログラミングコース>
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミング 平成24年10月30日 森田 彦.
プロジェクト演習Ⅱ インタラクティブゲーム制作 イントロダクション2
第2回 Microsoft Visual Studio C++ を使ってみよう
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング 平成25年11月5日 森田 彦.
Cプログラミング演習 第6回 ファイル処理と配列.
プログラミング 2 ファイル処理.
情報工学演習I 第12回 C++の演習4(インライン展開).
図書館職員のための アプリケーション開発講習会
プログラミング応用 printfと変数.
第10回関数 Ⅱ (ローカル変数とスコープ).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第2回 ファイル処理 情報・知能工学系 山本一公
プログラミング 4 記憶の割り付け.
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
インタラクティブ・ゲーム制作 <プログラミングコース>
プログラミング入門2 第11回 情報工学科 篠埜 功.
2016年度 植物バイオサイエンス情報処理演習 第6回 情報処理(4) データを加工する・2
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
プロジェクト演習Ⅱ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
情報処理Ⅱ 第2回:2003年10月14日(火).
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
プログラミングⅠ 平成30年10月22日 森田 彦.
システムプログラミング 第7回、8回 ファイルシステム関連の システムコール
情報基礎演習I(プログラミング) 第11回 7月12日 水曜5限 江草由佳
Cプログラミング演習資料.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
統計ソフトウエアRの基礎.
プログラミング演習I 2003年7月2日(第11回) 木村巌.
アルゴリズムとデータ構造 2012年6月11日
ファイルの読み込み, ファイルからのデータの取り出し, ファイルの書き出し
プロジェクト演習III,V <インタラクティブ・ゲーム制作> プログラミングコース
第5回 プログラミングⅡ 第5回
精密工学科プログラミング基礎 第7回資料 (11/27実施)
標準入出力、変数、演算子、エスケープシーケンス
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
コンパイラ 2012年10月11日
プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作
プログラミング 4 文字列.
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
情報処理Ⅱ 第2回 2004年10月12日(火).
プログラミング 平成28年10月25日 森田 彦.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
知能情報工学演習I 第9回(後半第3回) 課題の回答
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
プログラミング 2 静的変数.
Presentation transcript:

インタラクティブ・ゲーム制作 <プログラミングコース> 第8回 ファイル入出力と アルゴリズム

今日の内容 やるやる言いつつできなかった 本質ではないけど見た目もこだわる アルゴリズムをガチで考える ファイル入出力 石のアニメーション 置ける場所とひっくり返し判定

こ、今度こそ! ファイル入出力

ファイル入出力の重要性 セーブ/ロードをしたいなら必須処理 ソース中にパラメータを直書きするのは 「ハードコーディング」と言われて、 現場では忌み嫌われる行為 ちょっとマップを手直しするのにもビルドが必要=Visual Studioが必要=マップも自分で作らなくてはいけなくなる=あばばばばばb

読み書きのターゲットは とりあえずテキストファイル マップデータ、キャラクタパラメータ、 シナリオデータ、セーブデータなどなど 特にCSVやタブ区切りテキストは扱えると 超便利 マップデータ、キャラクタパラメータ、 シナリオデータ、セーブデータなどなど 「テキストファイルとか見られたら  恥ずかしいし…」とか言うのは後だ!

とりあえず使うもの C++の標準機能だけでやってみよう インクルードは以下の通り 読み込みは「ifstream」クラス 書き込みは「ofstream」クラス インクルードは以下の通り #include <iostream> #include <fstream> 両方必要なので気をつける 必要に応じてusing namespace std;も

書き込みは絶望的に簡単だ! インスタンス生成時にファイル名指定 is_open()で開けているかチェック <<で書き込むデータを繋げて流し込む 最後はclose() ofstream out_file(“ファイル名”); if(out_file.is_open() == false) エラー処理; out_file << “書き込みたい文字” << endl; // int値やdouble値も<<で繋いで書ける // もちろんstring型やchar型もOK out_file << x << “,” << y << endl; //書き込み終わったらcloseして終了 out_file.close();

読み込みも ただ読み込むだけなら簡単だ! インスタンス生成時にファイル名指定 is_open()で開けて いるかチェック getline()で 1行ずつ取り出し、 処理する 最後はclose() ifstream in_file(“ファイル名”); string lineStr; vector<string> readBuffer; if(in_file.is_open() == false) { エラー処理; } // 1行ずつwhileループで読み出す while(getline(in_file, lineStr) == true) { // lineStrに1行分入る // とりあえず配列にしまうならこう readBuffer.push_back(lineStr); in_file.close();

結局何が面倒って 読み込んだ後の文字列処理なんです C++のstringクラスは基本的な機能しか ないので、ちょっと高度なことをやろう とすると、自前で頑張るか、boostなどに頼ることになります。 最低限の処理を使えるようになり、 データを取り出しやすいファイル構造を作ろう

区切り取り出し関数実装例 vector<string> fk_StrSplit(string argStr, string argToken) { vector<string> retStrArray; string::size_type curPos = 0, nextPos = 0; while(nextPos != string::npos) { nextPos = argStr.find(argToken, curPos); retStrArray.push_back(argStr.substr(curPos, nextPos-curPos)); curPos = nextPos+argToken.size(); } return retStrArray;

区切って取り出す fk_StrSplit()関数 FKUT/Misc.hで定義してあるので、 利用する場合はこれをインクルードする 第1引数の文字列を、第2引数の文字で 区切り、バラした結果を返す vector<string>型で受け取る FKUT/Misc.hで定義してあるので、 利用する場合はこれをインクルードする

整数値・実数値変換 Cの標準関数をなんだかんだで使う ただしstring型の変数は直接引数に 渡せないので、c_str()関数を使う atoi()が整数変換にあたる atof()が実数変換にあたる ただしstring型の変数は直接引数に 渡せないので、c_str()関数を使う atoi(anyStr.c_str())のようにする 実数値は誤差に厳しいものだと変換時に値がズレることがあるので注意

データ形式を仮決めしよう 次のようなテキストファイルを作ることにする 最初の行に[MY BOARD DATA]と表記する 次の行に石の個数を記述する 3行目以降から、 1行で石1個分を表すことにする X座標, Z座標, 色指定(とりあえず英語で)

データの例 [BOARD DATA] 4 -5.0, -5.0, Black 5.0, -5.0, White 5.0, 5.0, Black -5.0, 5.0, White

石のアニメーションで 使っているテクニック 細かいところだけど重要な 石のアニメーションで 使っているテクニック

ポイントになるもの update()関数の利用 三角関数おいしい! 毎フレーム呼び出して動きを更新する アニメーションの進行状態が分かるように メンバ変数を持たせておく 三角関数おいしい! 一番好きな関数です! 時間経過に応じて0~1の値を得るのに便利

動きを付ける時によくやるやり方 線形補間 半分半分また半分 色々な数式や関数の特徴を覚えておくと、 色んな場面で役立ちます! P = (1 - t)*(startPos) + t*(endPos) 半分半分また半分 P = 0.5*(nowPos) + 0.5*(endPos) 色々な数式や関数の特徴を覚えておくと、 色んな場面で役立ちます!

本日のメインディッシュ 置ける場所とひっくり返し判定

置ける場所の定義(1) 置くことで ひっくり返せること ○ ● そのためには、 置く場所の 周囲8マスに 相手の石が 置かれているのが 前提条件になる 初手で黒が置けるのは、 前提条件のみだと 右の赤いセル ○ ●

あるセルにおける 周囲の情報を得るには cellInfo[x][y]の周囲8セル 範囲外(0未満、8以上)の場合は対象外 [x-1][y-1], [x][y-1], [x+1][y-1] [x-1][y], [x+1][y] [x-1][y+1], [x][y+1], [x+1][y+1] 範囲外(0未満、8以上)の場合は対象外 これをこのままコーディングすると ださいので、座標のペアを配列に しまってループで処理できるとクール

置ける場所の定義(2) 相手の石があった 方向の先に、 自分の石があること ○ ● 端に到達した場合は その時点でNG 隣接する相手の石が 複数存在した場合は、それぞれの方向で判定 初手の場合青いセルが最終的にOKになる ○ ●

実装方針 位置と方向を与えて、その方向を調べる関数を作る 先ほどリストアップした隣接した相手の石リストを関数に流し込んでいく あとは実演!

To be continued…