CARD をクリックする

CARD のクリックで裏返します。

Applet でプログラムを体験できます。
カードゲームα版のテスト

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

プログラムの作成

  1. ゲームプログラムは今まで説明したことの集大成です。欲張らずに基礎から学んで下さい。
    前回までの説明は CARD をシャッフルして描画 を参照して下さい。
  2. メモ帳などでタイプして Card_03.java の名前で保存して下さい。
    //★ CARD をクリックする    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.util.*;
    import java.awt.event.*;
    
    class Card_03 extends JFrame
    {   CARD    card;
        // CARD のシャッフル,  0x100:裏,  0x200:非表示
        int     T[] = new int[48];
    
        // Main
        public static void main(String args[])
        {   new Card_03();
        }
    
        // Constructor
        public Card_03()
        {   super("Image View");
            card = new CARD("c:\\data\\test\\hanafuda.gif",51,75);
            card.Shuffle(T,48);
            addMouseListener(new inMouseListener());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(720,400);
            setBackground(Color.gray);
            setVisible(true);
        }
    
        // 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<48; i++)
            {   if (T[i]<0x100)         card.view(g,T[i],(i%12)*56+20,(i/12)*80+46);
                else  if (T[i]<0x200)   card.view(g,48,(i%12)*56+20,(i/12)*80+46);
            }
        }
    
        // InnerClass MouseListener
        class inMouseListener extends MouseAdapter
        {   public void mouseClicked(MouseEvent e)
            {   int x,y;
                x= (e.getX()-20)/56;
                y= (e.getY()-46)/80;
                if (T[y*12+x]<0x100)        T[y*12+x] |= 0x200; //非表示
                else  if (T[y*12+x]<0x200)  T[y*12+x] &= 0xff;	//表
                repaint();
            }
        }
    }
    
    class CARD extends JFrame 
    {   private Image   Img;
        private int Height,Width,Hnum,Wnum;
        int     frameNum;
        Random  rand;
    
        // Constructor
        CARD(String filename, int ws, int hs)
        {   Width= ws;
            Height= hs;
            Wnum=Hnum= 1;
            //画像ロード
            File infile = new File(filename);
            Img = loadImage(infile);
            Wnum= Img.getWidth(null)/Width;
            Hnum= Img.getHeight(null)/Height;
            frameNum = Wnum*Hnum;
            if (Wnum<1 || Hnum<1)
                System.out.println("Image File Error" + filename);
            rand = new Random();    //乱数の初期化
        }
    
        // Sprite View
        public void view(Graphics g, int n, int dx, int dy)
        {   int sx, sy;
            if (n >= frameNum)
            {   System.out.println("Sprite Number Error" + n);
                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);  }
        }
    
        // Load Image
        public static Image loadImage(File f)
        {   try
            {   Image img = ImageIO.read(f);
                return img;
            }
            catch (IOException e)
            {   throw new RuntimeException(e);
            }
        }
    
        // 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;
            }
        }
    }
    
  3. 画像ファイル("c:\\data\\test\\hanafuda.gif")をパスで指定したフォルダーに格納して下さい。
    hanafuda.gif は「横=51ドット,縦=75ドット」の花札が5段10列に並んだ画像です。

プログラムの説明

  1. マウスのクリックを検出するので java.awt.event.* をインポートして下さい。
    マウスの説明は マウスのクリックを検出 を参照して下さい。
    T[] のシャッフルの領域を「表/裏/非表示」のフラグとして兼用します。
    0x100 のビットが ON の時は、裏面表示です。
    0x200 のビットが ON の時は、非表示です。
    それ以外は表面表示です。
        import java.awt.*;
        import javax.swing.*;
        import java.io.*;
        import javax.imageio.ImageIO;
        import java.util.*;
        import java.awt.event.*;
    
        class Card_03 extends JFrame
        {   CARD    card;
            // CARD のシャッフル,  0x100:裏,  0x200:非表示
            int     T[] = new int[48];
        
  2. ウインドウの背景色を gray に設定してみました。
        // Constructor
        public Card_03()
        {   ・・・
            addMouseListener(new inMouseListener());
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(720,400);
            setBackground(Color.gray);
            setVisible(true);
        }
        
  3. paint() メソッドでは T[] のフラグを調べてカードを描画します。
    背景色を設定したときは fillRect() で塗りつぶして下さい。
    super.paint(g) で初期化すると背景が既定値でクリアされます。
    fillRect() で塗りつぶすと「ちらつき」を抑える効果もあります。
    (T[i]<0x100) のときは表面を描画します。
    (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<48; i++)
            {   if (T[i]<0x100)         card.view(g,T[i],(i%12)*56+20,(i/12)*80+46);
                else  if (T[i]<0x200)   card.view(g,48,(i%12)*56+20,(i/12)*80+46);
            }
        }
        
  4. シャッフルするとカードは裏面に設定されます。
    カードがクリックされると、裏返して表面を描画します。
    表面をクリックすると、そのカードは非表示になります。
    マウスがクリックされた座標からカードを特定します。
    「T[y*12+x] |= 0x200」は T[y*12+x] と 0x200 の論理和を計算します。
    「T[y*12+x] &= 0xff」は T[y*12+x] と 0xff の論理積を計算します。
        // InnerClass MouseListener
        class inMouseListener extends MouseAdapter
        {   public void mouseClicked(MouseEvent e)
            {   int x,y;
                x= (e.getX()-20)/56;
                y= (e.getY()-46)/80;
                if (T[y*12+x]<0x100)        T[y*12+x] |= 0x200; //非表示
                else  if (T[y*12+x]<0x200)  T[y*12+x] &= 0xff;  //表
                repaint();
            }
        }
        
  5. Shuffle() メソッドでカードをシャッフルしたときは、裏面に設定して下さい。
    「i | 0x100」は i と 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;
            }
        }
        

超初心者のプログラム入門(Java2)