カードのクリックで表返します

カードの画像をクリックすると表返し、もう一度クリックすると削除されます。

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

プログラムの作成

  1. メモ帳などでタイプして cardclick.java の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ CARD をクリックする    前田 稔
    //   appletviewer cardclick.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 cardclick extends JApplet implements MouseListener
    {   card    obj;
        // CARD のシャッフル,  0x100:裏,  0x200:非表示
        int     T[] = new int[52];
    
        // Initialize
        public void init()
        {   obj = new card(getCodeBase().toString() + "card.gif",56,65);
            obj.Shuffle(T,52);
            addMouseListener(this);
            setBackground(Color.gray);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   Dimension  size = getSize();
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            for(int 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);
            }
        }
    
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int x,y;
            x= (e.getX()-10)/60;
            y= (e.getY()-10)/70;
            if (T[y*13+x]<0x100)        T[y*13+x] |= 0x200; //非表示
            else  if (T[y*13+x]<0x200)  T[y*13+x] &= 0xff;  //表
            repaint();
        }
        public void mousePressed(MouseEvent e){}
        public void mouseReleased(MouseEvent e){}
        public void mouseEntered(MouseEvent e){}
        public void mouseExited(MouseEvent e){}
    }
    
    //★ 画像を切り分けるクラス
    class card extends JApplet
    {   private Image   Img;            // CARD Image
        private int     Width,Height;   // CARD の幅,高さ
        private int     Wnum,Hnum;      // CARD 横枚数,縦枚数
        private int     frameNum;       // Wnum*Hnum
        int             Sp_no;          // CARD の番号
        float           posX, posY;     // CARD の座標
        Random          rand;
    
        // Constructor
        card(String path, int ws, int hs)
        {   Width= ws;
            Height= hs;
            Wnum=Hnum= 1;
            Sp_no= 99;                  // flag:OFF
            posX=posY= 0f;              // 座標
            Img= null;
            rand = new Random();        //乱数の初期化
            try
            {   URL u = new URL(path);
                Img = ImageIO.read(u);
            }
            catch (IOException e)
            {   System.out.println("Image File Load Error");
                return;
            }
            Wnum= Img.getWidth(null)/Width;
            Hnum= Img.getHeight(null)/Height;
            frameNum = Wnum*Hnum;
            if (Wnum<1 || Hnum<1)   System.out.println("Image File Load Error");
        }
    
        // CARD View
        public void View(Graphics g, int n, int dx, int dy)
        {   int sx, sy;
            if (n>=frameNum)    return;
            sx = (n%Wnum) * Width;
            sy = (n/Wnum) * Height;
            if (Img != null)
            {   g.drawImage(Img,dx,dy,dx+Width,dy+Height,sx,sy,sx+Width,sy+Height,this);  }
        }
        public void View(Graphics g)
        {   View(g, Sp_no, (int)posX, (int)posY);
        }
    
        // CARD 番号と座標の設定
        public void Set(int num,float xp,float yp)
        {   Sp_no= num;
            posX= xp;
            posY= yp;
        }
    
        // n 枚のカードをシャッフルする
        public void Shuffle(int t[], int n)
        {   int     i,j;
            for(i=0; i<n; i++)  t[i]= -1;
            for(i=0; i<n; i++)
            {   for(j=rand.nextInt(n); t[j]!=-1; j=(j+1)%n);
                t[j]= i | 0x100;
            }
        }
    }
    
  2. カードの画像(card.gif)をプログラム(cardclick.class)と同じフォルダーに格納して下さい。
  3. ホームページを表示する cardclick.htm を作成します。
    <html>
      <body>
        <h3>CARD をクリックする</h3>
        <applet code="cardclick.class" width="800" height="400">
        </applet>
      </body>
    </html>
    

Java プログラムの説明

  1. 前回までの説明は カードの画像を切り分けて描画する を参照して下さい。
    マウスのクリックを検出するので java.awt.event.*; を import して MouseListener を implements します。
    card obj; は card object class の領域です。
    int T[] はカードをシャッフルする領域で、カードの番号にフラグを付加して格納します。
    0x100 はカード裏面の描画で、シャッフルメソッドを呼ぶと裏面に設定されます。
    0x200 はカードを削除(描画しない)フラグです。
        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 cardclick extends JApplet implements MouseListener
        {   card    obj;
            // CARD のシャッフル,  0x100:裏,  0x200:非表示
            int     T[] = new int[52];
        
  2. init() メソッドでジョカーを除く52枚のカードをシャッフルします。
    またマウスのクリックを検出するので、MouseListener を設定します。
        // Initialize
        public void init()
        {   obj = new card(getCodeBase().toString() + "card.gif",56,65);
            obj.Shuffle(T,52);
            addMouseListener(this);
            setBackground(Color.gray);
        }
        
  3. paint() メソッドで T[] でシャッフルされたカードを描画します。
    T[i]<0x100 の時は表面を描画します。
    T[i]<0x200 の時は裏面を描画します。
    T[i]>=0x200 の時はカードを描画しません。
        // Paint Method
        public void paint(Graphics g)
        {   Dimension  size = getSize();
            g.setColor(getBackground());
            g.fillRect(0, 0, size.width, size.height);
            for(int 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);
            }
        }
        
  4. マウスのクリックを検出するメソッドです。
    裏面をクリックすると表返ります。
    表面をクリックすると削除されます。
        // Mouse Click
        public void mouseClicked(MouseEvent e)
        {   int x,y;
            x= (e.getX()-10)/60;
            y= (e.getY()-10)/70;
            if (T[y*13+x]<0x100)        T[y*13+x] |= 0x200; //非表示
            else  if (T[y*13+x]<0x200)  T[y*13+x] &= 0xff;  //表
            repaint();
        }
        

card object class の説明

  1. 前回までの説明は カードの画像を切り分けて描画する を参照して下さい。
    ここでは追加された部分に付いて説明します。
  2. 乱数を使ってカードをシャッフルするメソッドを追加します。
    Random rand; を定義して Constructor でインスタンス化します。
        Random          rand;
        rand = new Random();    //乱数の初期化
        
  3. 乱数を使ってカードをシャッフルするメソッドです。
    int n がカードの枚数で int t[] に「0〜n-1」の値をシャッフルして格納します。
    t[j]= i | 0x100; の 0x100 はカードを伏せて描画する設定です。
        // n 枚のカードをシャッフルする
        public void Shuffle(int t[], int n)
        {   int     i,j;
            for(i=0; i<n; i++)  t[i]= -1;
            for(i=0; i<n; i++)
            {   for(j=rand.nextInt(n); t[j]!=-1; j=(j+1)%n);
                t[j]= i | 0x100;
            }
        }
        

Java Game Program