無題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
JugS

無題

#1

投稿記事 by JugS » 18年前

簡単なRPGを作ろうと思って色々構想を練っているんですが、マップの作成方法に困っていて
自分の考えでは、
1、表示画面より大きいマップを、背景として読み込む方法。

2、二次元配列でマップを宣言しておいて、for関数で番号に対応したマップチップを敷き詰める方法。

1だと通れる所と通れない所の判断が、つけにくい。
2は配列がでかくて、初期化が面倒な気がする。

個人的には2の方が良いと思うんですが、
例えば、町のマップを2種類作るとき、構造体で
typedef struct{
int map[10][10];
}TW;

TW city[2];
というのを考えたんですが、これだと配列の初期化に手間がかかりそうなので、悩んでいるんですが。

なにか良い方法はありませんか?

よろしくお願いします。

管理人

Re:無題

#2

投稿記事 by 管理人 » 18年前

構造体を初期化する時や配列を初期化する時は、別にループ文を使わなくても出来ます。
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:無題

#3

投稿記事 by たかぎ » 18年前

主だった処理系では実用上の問題はないのですが、一応処理系不明ですので...

memset でゼロクリアするのは必ずしも正しい方法ではありません。
手前味噌ですが、
http://www.kijineko.co.jp/tech/supersti ... emset.html
http://www.kijineko.co.jp/node/163
でそのことを書いています。

JugS

Re:無題

#4

投稿記事 by JugS » 18年前

たかぎさんのリンク先も参考にさせて頂きました。
わざわざありがとうございます。

管理人さんの方法だと、すべて同じ値に初期化するときはいいんですが、
自分の理想としては、
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:無題

#5

投稿記事 by たかぎ » 18年前

普通に初期化子を使って、
TW town[2] =
{
  {
    {1,0,1}, 
    {0,0,1}, 
    {1,0,0}, 
  },
  {
    {1,1,1} 
    {0,0,0} 
    {0,1,0} 
  },
};
とすればよいだけではないのですか?

JugS

Re:無題

#6

投稿記事 by JugS » 18年前

早速打ってみたのですが、
内容は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");

}
}
}

フリオ

Re:無題

#7

投稿記事 by フリオ » 18年前

 
 "{}"が足りないのでは?
これだと、3*3の配列 の配列になっているような。
 

JugS

Re:無題

#8

投稿記事 by JugS » 18年前

ご指摘ありがとうございます。

解決しました。

閉鎖

“C言語何でも質問掲示板” へ戻る