Report#8


Java Applet/AWTについて学び、Java Appletのオリジナルプログラムを作成し解説せよ。

 ・オリジナルプログラム

   import java.applet.Applet;
   import java.awt.*;

   public class Game extends Applet {

       MediaTracker mt;

       Image pict[] = new Image[7] ; // 絵を入れる配列
       Image back ; // カードの裏の絵を入れる変数

       int count = 0; // ひっくり返されたカードの枚数
       int openCard[] = new int[2]; // ひっくり返された2枚のカード番号
       int stat[] = new int[12]; // カードの状態(0:裏、1:ひっくり返された、2:表のまま)
       int card[] = new int[12]; // カードの配列(セットされた絵の番号が入る)
       int x[] = new int[12]; // カードのx座標
       int y[] = new int[12]; // カードのy座標
       int cardWidth = 32, cardHeight = 32; // カードの幅、高さ

       public void init(){
           int i ,j; // カウンター
           int k; // カード番号
           int yy; // 段毎のy座標

           mt = new MediaTracker(this);

           /* イメージファイルの読み込み */
           back = getImage(getCodeBase(), "back.gif");
           for( i = 0 ; i < 7 ; i++ ){
               pict[i] = getImage(getCodeBase(), "img" + (i) + ".gif");
               mt.addImage(pict[i],0);
           }

           try{
              mt.waitForID(0);
           } catch (InterruptedException e) {
              return;
           }

           /* カードの位置(x、y座標)の設定 */
           k = 0;
           for( i = 0 ; i < 3 ; i++ ){
              yy = i * cardHeight + 5;
              for( j = 0 ; j < 4 ; j++ ){
                  x[k] = j * cardWidth + 5 ;
                  y[k] = yy;
                  k = k + 1;
              }
       }

           /* カードをセットする */		
           shuffle();
   }

       public void paint(Graphics g) {
           update(g);
       }

       public void update(Graphics g){
           int i; // カウンター

           /* バックをオレンジで塗る */
           g.setColor(Color.pink);
           g.fillRect(0,0,223,106);

           /* タイトルの描画 */
           g.setColor(Color.blue);
           g.drawString("アンパンマン", 138, 30); 		

           /* カードの描画 */
           for( i = 0 ; i < 12 ; i++ ){
               if ( stat[i] == 0 ) {
                   /* statが0だったら裏の絵を描く */
                   g.drawImage( back, x[i], y[i], this);
               } else {
                   /* セットされている絵を描く */
                   g.drawImage( pict[card[i]], x[i], y[i], this);
               }
           }

            /* SHUFFLEボタンの描画 */
           g.setColor(Color.white);
           g.fillRect( 138, 70, 65, 25 );  
           g.setColor(Color.black);
           g.drawString("SHUFFLE", 145, 88);

       }

       public boolean mouseDown(java.awt.Event evt, int ix, int iy){
           int i; // カウンター
           int row, col; // マウスが押された位置(行、列)
           int nn; // ひっくり返すカードの番号

           /* 1枚目のカードをひっくり返す前の処理 */
           if ( count == 0 ) {
               for( i = 0 ; i < 12 ; i++ ) {
                   if ( stat[i] == 1 ) {
                       /* 前回ひっくり返されたカードを裏に戻す */
                       /* (前回一致したカードは表のまま残す) */
                       stat[i] = 0;
                       repaint(x[i], y[i], 32, 32);
                   }
               }
           }

           if ( ix > 138 && ix < 203 && iy > 70 && iy < 95 ) {
               /* マウスの座標(ix,iy)がSHUFFLEボタン内 */
               /* だったらカードをセットし直す     */
               shuffle();
               repaint();
               return true; // このメソッドを抜ける
           }

           /* マウスで何列目が押されたか */	
           col = 0;
           if( ix > cardWidth + 5  ) col = 1;
           if( ix > cardWidth * 2 + 5 ) col = 2;
           if( ix > cardWidth * 3 + 5 ) col = 3; 
           if( ix > cardWidth * 4 + 5 ) col = -1; 
           if( col < 0 ) return true; // カードの無い場所だったらこのメソッドを抜ける

           /* マウスで何行目が押されたか */	
           row = 0;
           if( iy > cardHeight + 5 ) row = 1;
           if( iy > cardHeight * 2 + 5 ) row = 2;
           if( iy > cardHeight * 3 + 5 ) row = -1; 
           if( row < 0 ) return true; // カードの無い場所だったらこのメソッドを抜ける

           /* ひっくり返すカード番号の計算 */
           nn = row * 4 + col;

           /* カードが裏でなかったらこのメソッドを抜ける */		
           if( stat[nn] != 0 ) return true;

           /* カードをひっくり返す */
           openCard[count] = nn; // どのカードが開けられたかセットする
           stat[nn] = 1; // カードの状態を「ひっくり返す」にする
           repaint(x[nn], y[nn], 32, 32);

           /* 2枚目のカードをひっくり返したときの処理 */
           if ( count == 1 ) {

               if ( card[openCard[0]] == card[openCard[1]] ) {

                  /* 絵が一致したらカードの状態を表に固定する */
                  stat[openCard[0]] = 2;
                  stat[openCard[1]] = 2;
               }

           }

           /* 現在何枚のカードがひっくり返されたか */
           count = count + 1; 
           if ( count == 2 ) {
               count = 0; 
           }

           return true;
       }

       public void shuffle(){
           int i, k; // カウンター
           int notuse; // 使わない絵の番号
           int no ; // 入れ替えるカードの位置
           int work; // 入れ替えに使うワーク変数

           /* 変数の初期化 */		
           count = 0; // ひっくり返されたカードは0枚
           for( i = 0 ; i < 12 ; i++ ){
               stat[i] = 0; // カードをすべて裏の状態に戻す
           }

           /* 使用しない絵を乱数で決める */
           notuse = (int)( Math.random() * (float)(7) );

           /* カードに絵の番号をセットする */
           k = 0;	
           for( i = 0 ; i < 7 ; i++ ){
              if ( i != notuse ) {
                 /* notuse以外の絵の番号をセット */
                 card[k] = i;
                 card[k+1] = i;
                 k = k + 2;
              }
           }

           /* カードの順番を入れ替える */
           /* カードの枚数だけループ  */
           for( k = 0 ; k < 12 ; k++ ){

              /* 乱数で入れ替えるカードを決める */
              no = (int)( Math.random() * (float)(12) );

              /* カードの入れ替え */
              work = card[k];
              card[k] = card[no];
              card[no] = work;
           }
       }
   }
・実行結果

 考察

 これは、神経衰弱ゲームです。マウスで押すとカードがひっくり返って絵が出ます。絵は、私のイメージキャラクタ(?)のアンパンマンを使いました。キャラクタの絵は、7枚あります。 SHUFFLEボタンを押すと、絵の位置が入れ替わるだけでなく、さっきはなかったキャラクタが出てきます。

・プログラムの流れ

   public class Game extends Applet {
       MediaTracker mt;
       Image pict[] = new Image[7] ; 
       Image back ;