- (問題a) 以下の様な10行の内容の "map.txt" というテキストファイルを作成せよ.---- は含まない. ------ ############ # # # # ## ## # # # # #G # # # ### # # #### # # # # # # # # # ## # # # # ############ ------ 以下のプログラムを記述せよ. プログラムの先頭近辺(#includeの直後)に以下を記述せよ. #define W 12 #define H 10 グローバル変数として,以下を宣言せよ. char map[H][W]; 以下の様な関数 void read_map() を作成し,main関数より呼び出せ. ファイル "map.txt" を "rt" モードで開く. 開けなかったら,下記の様に表示して,exit(1)を呼び出し強制終了. perror("ファイルを開けない."); ファイルの中身を fgetc で1文字ずつ読み込み, その中身が ' ' であれば,map[y][x] に 0 を, その中身が '#' であれば,map[y][x] に 1 を, その中身が 'G' であれば,map[y][x] に 2 を,代入する. その中身が 上記以外であれば,下記の様に表示して強制終了. printf("不正なデータ.(%d,%d) %d %c\n", x, y, ch, ch); ただし,ch は fgetc で取得したデータ. 読み込めなかったら,下記の様に表示して強制終了. perror("データを読み込めない."); 注意:正しく読み込めた場合は,画面に何も表示されない. 全マス分読み込み終わったら ファイルを閉じる. ファイルの読み込みは ch = fgetc( fp ); で可能.fp はファイルポインタ.ch は int 型の変数. 正しく読めたら ch に 読み込んだ文字の文字コードが代入され, 正しく読めなかったら ch には -1 が代入される. 文字コードの表示は printf("%c", ch); で,可能.%d でなく %c である点に注意. 読み込んだ値(文字コード)が '#'の文字コード と等しいか否かは,以下の様にして可能. if( ch == '#' ) 続いて,以下の様な 関数 void print_map() を作成し, main()関数 にて read_map の次に呼び出せ. read_map()関数で読み込んだ データ(map)を, 以下の様に 横 W マス,縦 H マスの長方形型に表示する ############ # # # # ## ## # # # # #G # # # ### # # #### # # # # # # # # # ## # # # # ############ ただし,map[y][x] のデータは,長方形の横座標x,縦座標y に対応する. 横座標は 最左列が 0 で,右に行くにつれて横座標は増加していく. 縦座標は 最上段が 0 で,下に行くにつれて縦座標は増加していく. G のマークは 横座標 6, 縦座標 3 である. 配列 map の対応する値が 0 であれば その場所には空白を表示し, 値が 1 であれば # を表示し, 値が 2 であれば G を表示し, (表示は 全角でも半角でも構わない) 0:空白 は通れる場所を, 1:# は通れない場所を, 2:G は ゴールを, 意味している. この問題は,先週の問題から,「3 通った場所」を 削除したものである. - (問題b) main関数の中のローカル変数として, int x, y; を作成せよ.これは,自分の現在の位置を表している. 次に,以下の様な 関数 void print_mini_map(int x, int y) を作成し, main()関数 より 引数を print_mini_map(x, y) として呼び出せ. これは,自分の現在地(x,y)の近辺を標示する関数である. 関数 print_mini_map(int x, int y) 以下の様に,座標を表示し, その下にデータ(map)の 横座標 x-1 〜 x+1,縦座標 y-1 〜 y+1 の部分を, 横 3 マス,縦 3 マスの正方形型に表示する. (1,1) ### #o. #.# 自分がいる(横座標がx, 縦座標がy)マスには o を表示する. それ以外のマスは, 配列 map の対応する値が 0 であれば その場所には . を表示し, 値が 1 であれば # を表示し, 値が 2 であれば G を表示し, (表示は 全角でも半角でも構わない) - (問題c) main 関数で 以下を繰り返すプログラムを作成せよ. print_mini_map(x,y)を呼び出し,自分の近辺を標示する. map[y][x] の値が 2 なら, printf("Goal!\n");と表示し終了. "上8, 左4, 右6, 下2>" と表示する. これは,「上に移動したいなら,8を入力せよ.左に進みたいなら...」の意味である. scanf で,ユーザの入力を受け付ける. 入力が 2 4 6 8 以外なら「入力がおかしい」と表示する. 入力が 2 なら,自分の下のマス map[y][x] を調べ, そこが通れるマス(1以外)なら,y を y+1 に修正する. 通れないなマスなら,"そこ(%d,%d)は通れません\n" と表示する.(%dは座標) 入力が 4 や 6 や 8 も同様. - (問題d) 以下の様に修正する. "上8, 左4, 右6, 下2, 読込0, 保存1>" と表示する. 入力が 2 4 6 8のときは前問同様. 入力が 1 なら, "data.txt"に"X=横座標\nY=縦座標\n"と保存する. 例えば,(x,y)=(2,3)なら X=2 Y=3 と保存される. 保存が終わったら,ファイルを閉じて(開きっぱなしにしない), "保存しました"と表示する. ファイルが開けない場合は,"ファイルを開けない"と表示し終了. 入力が 0 なら, "data.txt"の値をx, yに読み込む. 例えば,"data.txt"の中身が, X=2 Y=3 なら,(x,y)=(2,3)となる. 読込が終わったら,ファイルを閉じて,"読み込みました"と表示する. ファイルが開けない場合は,"ファイルを開けない"と表示し終了. - (問題e) 発展問題? 変数x, y, hp, mp を作り, x=1, y=1, hp=10, mp=5 で始まる. 以下の様に仕様を変更せよ. ・print_mini_map にて x, y, hp, mp を表示 ・"上8, 左4, 右6, 下2, 回復5, 読込0, 保存1>" と表示する. ・1歩 歩くごと,hp が1減る.hp が 0以下 になると終了. ・5を入力すると,hp=10となり,mpが1減る.ただし,mpが0以下の場合は 回復はできない. ・その他,好きな様に仕様を変更せよ.  例 横 5 マス,縦5マス表示.    あるマスを通ると 鍵を入手し,鍵を持っていないと通れないマスがある.