問11 次の C プログラムの説明及びプログラムを読んで,設問 1 〜 4 に答えよ。
〔プログラムの説明〕
画面上に表示されたモグラに対して,マウスでポインタを移動し,クリックして得点を 競うプログラムである。
画面上には,縦横 16 個ずつの正方形の 目に分割されたウィンドウがある。 升目の縦及び横の画素数は 24 であり,ウィンドウは縦 384×横 384 の画素で 構成されている(図 1 )。 画素の座標値は,ウィンドウの左上隅を基点 (0, 0) とした横座標及び縦座標の組合せである。
乱数を用いて選択した升目に,1 匹のモグラの絵(図 2 )を表示する。 モグラの絵はプログラム内で宣言された回数の繰返し処理の間だけ表示されており, 繰返し処理の終了と同時に画面から消える。
モグラが画面に表示されている間に,升目内をクリックできれば,升目の絵が 図 3 に変わり,得点が得られる。
クリック検出及びクリックされた画素の座標は,関数 sense を使用して獲得する。
このプログラムでは,次の三つの関数を利用している。
��関数 rand16
��関数 mogura
引数 p1 が“open”の場合 : p2 及び p3 で指定された升目に図 2 を表示する。
引数 p1 が“hit”の場合 : p2 及び p3 で指定された升目に図 3 を表示する。
引数 p1 が“close”の場合: p2 及び p3 で指定された升目の図を消去する。
p1: 処理モード(“open”,“hit”,“close”の 3 種類)
p2: 升目の列番号(0 〜 15)
p3: 升目の行番号(0 〜 15)
�� 関数 sense
p1: クリックされた画素の横座標へのポインタ
マウスのクリックありの場合にだけ,p1 が指すアドレスに座標値が設定される。
p2: クリックされた画素の縦座標へのポインタ
マウスのクリックありの場合にだけ,p2 が指すアドレスに座標値が設定される。
〔プログラム〕
(行番号)
01 #include <stdio.h> 02 #define ON 1 03 #define OFF 0 04 #define HIT 1 05 #define CMAX 16 06 #define BLKSZ 24 07 #define MGNCNT 200 08 #define DSPCNT 250 09 #define STOP 3000 10 typedef struct { int flg; int st; } mbox; 11 int rand16(void); 12 int sense( int*, int* ); 13 void mogura( char*, int, int ); 14 main(void) { 15 int mflg=OFF, hitpt=0; 16 int hitck[BLKSZ][BLKSZ], gcnt, gx, gy, ix, iy; 17 mbox mg[CMAX][CMAX]; 18 for ( ix=0; ix<CMAX; ix++ ) 19 for ( iy=0; iy<CMAX; iy++ ) { 20 mg[ix][iy].flg = OFF; 21 mg[ix][iy].st = 0; 22 } 23 for ( ix=0; ix<BLKSZ; ix++ ) 24 for ( iy=0; iy<BLKSZ; iy++ ) hitck[ix][iy] = HIT; 25 for ( gcnt=0; gcnt<STOP; gcnt++ ) { 26 if ( gcnt % MGNCNT == 0 ) { 27 ix = rand16(); 28 iy = rand16(); 29 if ( mg[ix][iy].flg == OFF ) { 30 mg[ix][iy].flg = ON; 31 mg[ix][iy].st = gcnt; 32 mogura( "open", ix, iy ); 33 } 34 } 35 mflg = sense( &gx, &gy ); 36 if ( mflg == ON ) { 37 if ( mg[gx/BLKSZ][gy/BLKSZ].flg == ON && 38 hitck[gx%BLKSZ][gy%BLKSZ] == HIT ) { 39 hitpt += 10; 40 mogura( "hit", gx/BLKSZ, gy/BLKSZ ); 41 mg[gx/BLKSZ][gy/BLKSZ].flg = OFF; 42 mg[gx/BLKSZ][gy/BLKSZ].st = 0; 43 } 44 else hitpt--; 45 } 46 for ( ix=0; ix<CMAX; ix++ ) { 47 for ( iy=0; iy<CMAX; iy++ ) 48 if ( mg[ix][iy].flg == ON ) { 49 if ( (gcnt-mg[ix][iy].st)>DSPCNT ) { 50 mg[ix][iy].flg = OFF; 51 mg[ix][iy].st = 0; 52 mogura( "close", ix, iy ); 53 } 54 } 55 } 56 } 57 printf( "ゲーム終了\nあなたの得点は%dです\n", hitpt ); 58 }
解答群
ア 12 イ 15 ウ 16 エ 20
オ 24 カ 25 キ 32
ア 行番号 7 の MGNCNT を 400 にすると得点が得やすくなる。
イ 行番号 8 の DSPCNT を 400 にすると得点が得やすくなる。
ウ 図 2 のモグラの表示回数の増減によって,図 2 が表示されてから消えるまでの時間が変化する。
エ モグラが表示された状態でプログラムが終了することがある。
オ モグラが表示されていないところをクリックすると得点に影響がある。
printf ( "ゲーム終了\n あなたの得点は%d,見逃しは%d 匹です\n", hitpt, scnt );
関数 main への変更として適切なものを,解答群の中から選べ。
ア 行番号 33 の直後に else scnt++; を追加する。
イ 行番号 34 の直後に else scnt++; を追加する。
ウ 行番号 44 を else { hitpt--; scnt++; } に置き換える。
エ 行番号 45 の直後に else scnt++; を追加する。
オ 行番号 52 の直後に scnt++; を追加する。
#define TSZ BLKSZ/3 for ( ix=0; ix<TSZ; ix++ ) { for ( iy=0; iy<TSZ-ix; iy++ ) { hitck[ix ][iy ] = OFF; hitck[ix ][BLKSZ-iy-1] = OFF; hitck[BLKSZ-ix-1][iy ] = OFF; hitck[BLKSZ-ix-1][BLKSZ-iy-1] = OFF; } }