2018年5月
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Amazonウィジェット

  • お気に入り
  • 欲しいもの
  • 面白かった本
  • Raspberry Pi
  • ドローン
  • 書籍ランキング

AdSense

  • 広告
無料ブログはココログ

« コラム:CUIの文字の縦横比(アスペクト比)を調べた。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その6 ~動かしてみた!!~ »

2018年3月14日 (水)

遺伝的アルゴリズムで育てる「お掃除ロボット」 その5 ~マップの読み込みと表示~

今日はシミュレーション環境を構築する話。
マップをロードして、シミュレーション環境を表示するところを作る。

mapをテキストファイルからロードする。

void readMap(void) {
	FILE *fp;
	fp = fopen("map.txt", "r");
	if (fp == NULL) {
		printf("file open error\n");
		exit(1);
	}

	char buff[BUFSIZE];
	int n = 0;
	while (fgets(buff, BUFSIZE, fp) != NULL) {
		memcpy(&map[n*W], buff, W);
		n++;
	}

	countItem();
	fclose(fp);
}

fgetsでbuffに1行分取り出して、memcpyでmap配列に入れる。 最初作ったときはfgetsを久しぶりに使って四苦八苦した。

BUFSIZEはもちろんマップの幅Wと同じ値にしてはいけない。
改行文字とナル文字を考慮してW+2とかにすればよいのでしょうとやってみたら、
なぜか#が次の行へ押し込まれてしまう。

よくよく調べてみると、
1行とは改行コード(\n)または読み込みバイトがファイルサイズに達するまでであると思っていたのだが、
指定文字数に達した時点でfgetsは終了。残りは次回の読み込みで取得されていた。

fgetsの引数にある文字数は、余裕をもっておくのがよい。
CUI画面に出すサイズから考えて、とりあえず256にした。

fgetsの使い方についてはこちらを参照しました

次は、mapの表示をする関数。

void draw(void) {
	for (int i = 0; i < W*H; i++) {
		printf("%c", map[i]);
		if (i%W == W - 1) {
			puts("");
		}
	}
}




CUI表示だったらこれだけで済む。

ほとんどprintfデバッグの延長程度しかない。
あとでGUIで表示したいときはここだけ書き換えればよい。
表示と内部処理をはっきり分けていると後々楽になる。


次は、いよいよ連結して動かす段階へ。
次回に続く。

« コラム:CUIの文字の縦横比(アスペクト比)を調べた。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その6 ~動かしてみた!!~ »

C言語」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/518723/66385153

この記事へのトラックバック一覧です: 遺伝的アルゴリズムで育てる「お掃除ロボット」 その5 ~マップの読み込みと表示~:

« コラム:CUIの文字の縦横比(アスペクト比)を調べた。 | トップページ | 遺伝的アルゴリズムで育てる「お掃除ロボット」 その6 ~動かしてみた!!~ »