ま総研2000(まどの総合研究所ver.5.1)

みんながみんなその物事に興味があると思っちゃいけないよという精神で綴る備忘録

あみだくじ改 C++練習メモ 第4回

   

独習C++ 第4版やら、独習C 第4版やら、ゲームプログラマになる前に覚えておきたい技術を、少し見て、C言語適当練習日記 第9回で作った、あみだくじを少し変えてみた。

数か月ぐらい経って、これをもう一度、見返してみて、もっと効率のいい方法あるのに…って思えればいいかなという感じだ。

[crayon]// amidacon.cppで、本を踏まえてC++でコンソールあみだくじ 参考文献は記事の上に書いている。
#include
#include
#include // _getche()用
using namespace std;

#define STAGE_NUMBER_MAX 3

int selectNumber(char *message, int n_max);// 数字の選択
void readFile(char **buffer, int *size, int f_num);// ファイル読み込みなど。
void nextStep();// 何かキーを押すことで次に進むというもの

// 1次元配列を2次風味の表現にする
// 読んだ本に書いてあったことほぼそのまま流用。
template class Array2D{
A2D *mArray;
int mSize0;
int mSize1;
public:
Array2D() : mArray(0){}
~Array2D(){
delete[] mArray;
mArray = 0;
}
void setSize(int size0,int size1){
mSize0=size0;
mSize1=size1;
mArray =new A2D[size0 * size1];
}
A2D &operator()(int index0, int index1){
return mArray[index1 *mSize0 + index0];
}
const A2D &operator()(int index0, int index1) const{
return mArray[index1 *mSize0 + index0];
}
};

// 状態(State)で描画、画面遷移など。
class State{
// enumをマップチップ代わりに使用。本の受け売り。
enum Object{
OB_SPACE,
OB_ROAD,
OB_TURN_LEFT,
OB_TURN_RIGHT,
OB_BRIDGE,
OB_WIN,
OB_LOSE,
OB_PLAYER,

OB_NUM,
OB_ETC
};
void setSize(const char *mapData,int size); // マップの広さを見る

int mEnum,mEnum2; // Pと交換で保持するenumのやつ。
int mWidth,mHeight; // マップの広さ
int mKuji; // 選択できるくじの本数
bool clearFlag; // いわゆるクリアフラグ
Array2D mObject; // マップデータ倉庫
public:
State(const char *mapData, int size);
void update();
void draw() const;
void pSet(); // 自機のセット。
bool mapClear(); // マップクリアのフラグ
};

int main(){
// ステージ番号の選択
int filenum;
filenum = selectNumber("ステージ",STAGE_NUMBER_MAX);

// マップファイル読み込み
char *mapData;
int fileSize;
readFile(&mapData, &fileSize, filenum);

State *state = new State(mapData,fileSize);
state->draw();
state->pSet();

// メインループ 自機操作系今回は入らない。だって勝手に動くゲームだもの。
while(!(state->mapClear())){
state->draw();
state->update();
}
cout << "ゲーム終了です。" << endl; delete[] mapData; //事後処理? mapData = 0; nextStep(); return 0; } // nextStepとselectNumberはクラスを作って承継ができるかもしれない。一応保留。 void nextStep(){ char ch; cout << "何かボタンを押すと次に進みます。" << endl; ch = _getche(); cout << endl; } int selectNumber(char *message, int n_max){ char ch; int num=0; while((num < 1) || (num > n_max)){
cout << "1から" << n_max << "までの" << message << "番号を入力してください" << endl; ch = _getche(); num = atoi(&ch); cout << endl; } return num; } void readFile(char **buffer, int *size, int f_num){ char filename[16]; sprintf_s(filename, 16,"mapdata%d.txt", f_num); ifstream in(filename); if(!in){ cout << "ファイルを開くことに失敗しました" << endl; exit(1); } else{ in.seekg(0,ifstream::end); *size = static_cast(in.tellg());
in.seekg(0,ifstream::beg);
*buffer = new char[*size];
in.read(*buffer, *size);
}
in.close();
}

State::State(const char *mapData, int size){
// 初期化シリーズ。
mEnum = OB_ETC;
mEnum2 = OB_ETC;
clearFlag = false;
mKuji = 0;

setSize( mapData, size);
mObject.setSize(mWidth,mHeight);

for(int y=0;y

 - C++練習