ペアのカードを取り除く

二枚のカードをめくって、同じ数字であれば取り除きます。
Java Applet で 神経衰弱ゲーム が楽しめます。

前田稔の超初心者のプログラム入門

プログラムの作成

  1. メモ帳などでタイプして cardpair.java の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ ペアのカードを取り除く    前田 稔
    //   appletviewer cardpair.htm
    import java.applet.*;
    import javax.swing.*;
    import java.awt.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.net.URL;
    import java.awt.event.*;
    import java.util.*;
    
    public class cardpair extends JApplet implements MouseListener
    {   card    obj;
        // CARD のシャッフル,  0x100:裏,  0x200:非表示
        int     T[] = new int[52];
        // 0:1枚目  1:2枚目  2:照合
        int     Teban=0;
        // ペアで取り除いたカード
        ArrayList<Integer>  list = new ArrayList<Integer>();
        int     c1,c2;      // 選択カードの記憶
    
        // Initialize
        public void init()
        {   //画像ロード
            obj = new card(getCodeBase().toString() + "card.gif",56,65);
            obj.Shuffle(T,52);
            addMouseListener(this);
            setBackground(Color.gray);
            list.add(0);
            list.add(1);
            list.add(2);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   int i;
            Dimension  size = getSize();
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            for(i=0; i<52; i++)
            {   //if (T[i]<0x100)         obj.View(g,T[i],(i%13)*60+10,(i/13)*70+10);
                //else  if (T[i]<0x200)   obj.View(g,54,(i%13)*60+10,(i/13)*70+10);
                if (T[i]<0x200)         obj.View(g,T[i]&0xff,(i%13)*60+10,(i/13)*70+10);
            }
            for(i=0; i<list.size(); i++)
                obj.View(g,list.get(i),i*12+10,340);
            if (Teban==2)
            {   g.setColor(Color.black);
                g.drawString("カードを確認します", 20,320);
            }
        }
    
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int x,y,w1,w2;
            x= (e.getX()-10)/60;
            y= (e.getY()-10)/70;
            switch(Teban)
            {   case 0:     // 1枚目
                    c1= y*13+x;
                    if (c1<0 || c1>51)    break;
                    if (T[c1]<0x200 && T[c1]>=0x100)
                    {   T[c1] &= 0xff;  //表
                        Teban= 1;
                    }
                    break;
                case 1:     // 2枚目
                    c2= y*13+x;
                    if (c2<0 || c2>51)    break;
                    if (T[c2]<0x200 && T[c2]>=0x100)
                    {   T[c2] &= 0xff;  //表
                        Teban= 2;
                    }
                    break;
                case 2:     // 照合
                    w1= T[c1] & 0xff;
                    w2= T[c2] & 0xff;
                    if ((w1%13)==(w2%13))
                    {   T[c1] |= 0x200; //取り除く
                        T[c2] |= 0x200;
                        list.add(w1);
                        list.add(w2);
                    }
                    else
                    {   T[c1] |= 0x100; //裏
                        T[c2] |= 0x100;
                    }
                    Teban= 0;
                    break;
            }
            repaint();
        }
        public void mousePressed(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    }
    //★ 画像を切り分ける class card は前回と同じなので、省略しました。
    class card extends JFrame
    {   ・・・
    }
    
  2. カードの画像(card.gif)をプログラム(*.class)と同じフォルダーに格納して下さい。
  3. ホームページを表示する HTML FILE を作成します。
    <html>
      <body>
        <h3>ペアのカードを取り除く</h3>
        <applet code="cardpair.class" width="800" height="400">
        </applet>
      </body>
    </html>
    

Java プログラムの説明

  1. 前回までの説明は カードのクリックで表返します を参照して下さい。
    card obj; は card object class の領域です。
    int T[] はカードをシャッフルする領域で、カードの番号にフラグを付加して格納します。
    Teban はプログラムを制御する領域です。
    1. 0 のときは、1枚目のカードをクリックします。
    2. 1 のときは、2枚目のカードをクリックします。
    3. 2 のときは、2枚のカードを調べます。
      同じ数字のときは削除して ArrayList に追加します。
      違う数字のときは裏返します。
    c1, c2 は選択したカードを一時的に記憶する領域です。
        public class cardpair extends JApplet implements MouseListener
        {   card    obj;
            // CARD のシャッフル,  0x100:裏,  0x200:非表示
            int     T[] = new int[52];
            // 0:1枚目  1:2枚目  2:照合
            int     Teban=0;
            // ペアで取り除いたカード
            ArrayList<Integer>  list = new ArrayList<Integer>();
            int     c1,c2;      // 選択カードの記憶
        
  2. init() メソッドで ArrayList に仮にカードを登録しています。
    最初から 0,1,2 のカードが重ねて描画されます。
        // Initialize
        public void init()
        {   //画像ロード
            obj = new card(getCodeBase().toString() + "card.gif",56,65);
            obj.Shuffle(T,52);
            addMouseListener(this);
            setBackground(Color.gray);
            list.add(0);
            list.add(1);
            list.add(2);
        }
        
  3. paint() メソッドで T[] でシャッフルされたカードを描画します。
    T[i]<0x100 の時は表面を描画します。
    T[i]<0x200 の時は裏面を描画します。
    T[i]>=0x200 の時はカードを描画しません。
    裏面で描画したのでは、デバッグが面倒なので、表面で描画しています。
    次に ArrayList に登録されているカードを重ねて描画します。
        // Paint Method
        public void paint(Graphics g)
        {   int i;
            Dimension  size = getSize();
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            for(i=0; i<52; i++)
            {   //if (T[i]<0x100)         obj.View(g,T[i],(i%13)*60+10,(i/13)*70+10);
                //else  if (T[i]<0x200)   obj.View(g,54,(i%13)*60+10,(i/13)*70+10);
                if (T[i]<0x200)         obj.View(g,T[i]&0xff,(i%13)*60+10,(i/13)*70+10);
            }
            for(i=0; i<list.size(); i++)
                obj.View(g,list.get(i),i*12+10,340);
            if (Teban==2)
            {   g.setColor(Color.black);
                g.drawString("カードを確認します", 20,320);
            }
        }
        
  4. マウスのクリックを検出するメソッドです。
    Teban==0 のときは一枚目です。
    Teban==1 のときは二枚目です。
    クリックエラーをチェックして表がえします。
    Teban==2 のときは二枚のカードを照合します。
    同じ数字のときは削除して ArrayList に追加します。
    違う数字のときは裏返します。
    カードの並び順から 13 で割った余りが一致すれば同じ数字と判定出来ます。
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int x,y,w1,w2;
            x= (e.getX()-10)/60;
            y= (e.getY()-10)/70;
            switch(Teban)
            {   case 0:     // 1枚目
                    c1= y*13+x;
                    if (c1<0 || c1>51)    break;
                    if (T[c1]<0x200 && T[c1]>=0x100)
                    {   T[c1] &= 0xff;  //表
                        Teban= 1;
                    }
                    break;
                case 1:     // 2枚目
                    c2= y*13+x;
                    if (c2<0 || c2>51)    break;
                    if (T[c2]<0x200 && T[c2]>=0x100)
                    {   T[c2] &= 0xff;  //表
                        Teban= 2;
                    }
                    break;
                case 2:     // 照合
                    w1= T[c1] & 0xff;
                    w2= T[c2] & 0xff;
                    if ((w1%13)==(w2%13))
                    {   T[c1] |= 0x200; //取り除く
                        T[c2] |= 0x200;
                        list.add(w1);
                        list.add(w2);
                    }
                    else
                    {   T[c1] |= 0x100; //裏
                        T[c2] |= 0x100;
                    }
                    Teban= 0;
                    break;
            }
            repaint();
        }
        
  5. ★画像を切り分ける class card は前回と同じなので、省略しています。

Java Game Program