簡単なRPGを作ろうと思って色々構想を練っているんですが、マップの作成方法に困っていて
自分の考えでは、
1、表示画面より大きいマップを、背景として読み込む方法。
2、二次元配列でマップを宣言しておいて、for関数で番号に対応したマップチップを敷き詰める方法。
1だと通れる所と通れない所の判断が、つけにくい。
2は配列がでかくて、初期化が面倒な気がする。
個人的には2の方が良いと思うんですが、
例えば、町のマップを2種類作るとき、構造体で
typedef struct{
int map[10][10];
}TW;
TW city[2];
というのを考えたんですが、これだと配列の初期化に手間がかかりそうなので、悩んでいるんですが。
なにか良い方法はありませんか?
よろしくお願いします。
無題
Re:無題
構造体を初期化する時や配列を初期化する時は、別にループ文を使わなくても出来ます。
memsetという関数を使って、先頭のポインタから示した領域分、指定した値で初期化することが出来ます。
例えばこの通りです。
アイテムに関する構造体、item_t型で宣言した配列を全て0で初期化する時はmemsetでこのように書きます。
memset( 1 , 2 , 3);
1のアドレスから
2の値で
3のサイズ埋める
という意味になります。
この関数について詳しく知りたければググっって下さい。
http://www.google.co.jp/search?hl=ja&q=memset&lr=
構造体の構造体の構造体の・・・と深い階層まで入り組んでいて、初期化が面倒な時も、memsetを使えば全て1行で初期化できます。
memsetという関数を使って、先頭のポインタから示した領域分、指定した値で初期化することが出来ます。
例えばこの通りです。
#define ITEM_MAX 1000 typedef struct{ int flag,cnt,knd; double x,y; }item_t; item_t item[ITEM_MAX]; memset(item , 0, sizeof(item_t)*ITEM_MAX);
アイテムに関する構造体、item_t型で宣言した配列を全て0で初期化する時はmemsetでこのように書きます。
memset( 1 , 2 , 3);
1のアドレスから
2の値で
3のサイズ埋める
という意味になります。
この関数について詳しく知りたければググっって下さい。
http://www.google.co.jp/search?hl=ja&q=memset&lr=
構造体の構造体の構造体の・・・と深い階層まで入り組んでいて、初期化が面倒な時も、memsetを使えば全て1行で初期化できます。
Re:無題
主だった処理系では実用上の問題はないのですが、一応処理系不明ですので...
memset でゼロクリアするのは必ずしも正しい方法ではありません。
手前味噌ですが、
http://www.kijineko.co.jp/tech/supersti ... emset.html
http://www.kijineko.co.jp/node/163
でそのことを書いています。
memset でゼロクリアするのは必ずしも正しい方法ではありません。
手前味噌ですが、
http://www.kijineko.co.jp/tech/supersti ... emset.html
http://www.kijineko.co.jp/node/163
でそのことを書いています。
Re:無題
たかぎさんのリンク先も参考にさせて頂きました。
わざわざありがとうございます。
管理人さんの方法だと、すべて同じ値に初期化するときはいいんですが、
自分の理想としては、
typedef struct{
int map[3][3];
}TW;
TW town[2];
と、宣言しておいて、配列の中身を
town[0].map //1は壁、2は道
{1,0,1}
{0,0,1}
{1,0,0}
town[1].map
{1,1,1}
{0,0,0}
{0,1,0}
と上記のように、任意の値を入れて、番号に対応したマップチップを敷き詰める描画したいのですが、
このように出来ないでしょうか?
わざわざありがとうございます。
管理人さんの方法だと、すべて同じ値に初期化するときはいいんですが、
自分の理想としては、
typedef struct{
int map[3][3];
}TW;
TW town[2];
と、宣言しておいて、配列の中身を
town[0].map //1は壁、2は道
{1,0,1}
{0,0,1}
{1,0,0}
town[1].map
{1,1,1}
{0,0,0}
{0,1,0}
と上記のように、任意の値を入れて、番号に対応したマップチップを敷き詰める描画したいのですが、
このように出来ないでしょうか?
Re:無題
早速打ってみたのですが、
内容はtown.mapを初期化し、値を出力するだけのプログラムですが、
エラーが出ます。原因は何でしょうか?
エラー内容は 初期化子が多すぎる、宣言の構文エラー 等です。
int a,b,c;
typedef struct{
int map[3][3];
}TW;
TW town[2] ={
{
{1,0,1},
{0,0,1},
{1,0,0}
},
{
{1,1,1},
{0,0,0},
{0,1,0}
},
};
for(a=0;a<2;a++){
for(b=0;b<3;b++){
for(c=0;c<3;c++){
printf("%d ",town[a].map[c]);
if(c == 2)
printf("\n");
}
}
}
内容はtown.mapを初期化し、値を出力するだけのプログラムですが、
エラーが出ます。原因は何でしょうか?
エラー内容は 初期化子が多すぎる、宣言の構文エラー 等です。
int a,b,c;
typedef struct{
int map[3][3];
}TW;
TW town[2] ={
{
{1,0,1},
{0,0,1},
{1,0,0}
},
{
{1,1,1},
{0,0,0},
{0,1,0}
},
};
for(a=0;a<2;a++){
for(b=0;b<3;b++){
for(c=0;c<3;c++){
printf("%d ",town[a].map[c]);
if(c == 2)
printf("\n");
}
}
}