東京理科大学 infoserv[更新日]2000.10.23


次の問11から問14までの4問については,この中から1問を選択し,
答案用紙の選択欄のを マークして解答してください。
 なお,2問以上選択した場合には,はじめの1問について採点します。

問11  次の C プログラムの説明及びプログラムを読んで,設問 1 〜 4 に答えよ。

〔プログラムの説明〕

画面上に表示されたモグラに対して,マウスでポインタを移動し,クリックして得点を 競うプログラムである。

(1)

画面上には,縦横 16 個ずつの正方形の  目に分割されたウィンドウがある。 升目の縦及び横の画素数は 24 であり,ウィンドウは縦 384×横 384 の画素で 構成されている(図 1 )。 画素の座標値は,ウィンドウの左上隅を基点 (0, 0) とした横座標及び縦座標の組合せである。

(2)

乱数を用いて選択した升目に,1 匹のモグラの絵(図 2 )を表示する。 モグラの絵はプログラム内で宣言された回数の繰返し処理の間だけ表示されており, 繰返し処理の終了と同時に画面から消える。

(3)

モグラが画面に表示されている間に,升目内をクリックできれば,升目の絵が 図 3 に変わり,得点が得られる。

(4)

クリック検出及びクリックされた画素の座標は,関数 sense を使用して獲得する。

(5)

このプログラムでは,次の三つの関数を利用している。

��関数 rand16

��関数 mogura

�� 関数 sense

〔プログラム〕

(行番号)

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 }

設問1 このプログラムでは,ゲーム終了までに図 2 のモグラが 最大何回出現するか,解答群の中から選べ。

解答群

ア 12   イ 15   ウ 16   エ 20

オ 24   カ 25   キ 32

設問2 プログラムの内容に関する記述として,正しくないものを解答群の中から 二つ選べ。

解答群

ア 行番号 7 の MGNCNT を 400 にすると得点が得やすくなる。

イ 行番号 8 の DSPCNT を 400 にすると得点が得やすくなる。

ウ 図 2 のモグラの表示回数の増減によって,図 2 が表示されてから消えるまでの時間が変化する。

エ モグラが表示された状態でプログラムが終了することがある。

オ モグラが表示されていないところをクリックすると得点に影響がある。

設問3 クリックによる得点だけでなく,見逃したモグラも数えることにした。 そこで,初期値が 0 である int 型変数 scnt を宣言部に追加し,行番号 57 の printf を次のように変更した。

printf ( "ゲーム終了\n あなたの得点は%d,見逃しは%d 匹です\n",
hitpt, scnt );

関数 main への変更として適切なものを,解答群の中から選べ。

解答群

ア 行番号 33 の直後に else scnt++; を追加する。

イ 行番号 34 の直後に else scnt++; を追加する。

ウ 行番号 44 を else { hitpt--; scnt++; } に置き換える。

エ 行番号 45 の直後に else scnt++; を追加する。

オ 行番号 52 の直後に scnt++; を追加する。

設問4 行番号 6 の直後に,次の #define の行を追加し,行番号 24 の直後に次の for文による繰返し処理を追加した。 その結果,升目内でのモグラのクリックを認識する領域が変化した。 変更後のクリック認識画素領域に近い図形を解答群の中から選べ。 ここで,図中の灰色の領域がクリックを認識する領域である。

     #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;
         }
     }

解答群


東京理科大学 infoserv 戻る 次頁:問12