カードゲームα版

カードゲームα版です。二人のプレイヤーが対戦します。
Java Applet で 神経衰弱ゲーム が楽しめます。

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

プログラムの作成

  1. メモ帳などでタイプして cardalpha.java の名前で保存して下さい。
    Applet はサーバーにアップロードすることが前提なので、ファイル名やクラス名を小文字で統一しています。
    //★ カードゲームα版    前田 稔
    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 cardalpha extends JApplet implements MouseListener
    {   card    obj;
        // CARD のシャッフル,  0x100:裏,  0x200:非表示
        int     T[] = new int[52];
        ArrayList<Integer>  listA = new ArrayList<Integer>();
        ArrayList<Integer>  listB = new ArrayList<Integer>();
        int     Teban=0;
        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);
        }
    
        // 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<listA.size(); i++)
                obj.View(g,listA.get(i),i*12+10,340);
            for(i=0; i<listB.size(); i++)
                obj.View(g,listB.get(i),i*12+10,420);
            //g.setFont(new Font("MS P明朝",Font.PLAIN,32));
            g.setFont(new Font("Helvetica",Font.PLAIN,32));
            g.setColor(Color.black);
            switch(Teban)
            {   case 0:
                    g.drawString("Aさんの1枚目です", 20,320);
                    break;
                case 1:
                    g.drawString("Aさんの2枚目です", 20,320);
                    break;
                case 2:  case 5:
                    g.drawString("カードを確認します", 20,320);
                    break;
                case 3:
                    g.drawString("Bさんの1枚目です", 20,320);
                    break;
                case 4:
                    g.drawString("Bさんの2枚目です", 20,320);
                    break;
                case 6:
                    g.drawString("Aさんは" + listA.size() + "枚、  Bさんは" + listB.size() + "でした。", 20,100);
                    break;
            }
        }
    
        // 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:  case 3:        // 1枚目
                    c1= y*13+x;
                    if (c1<0 || c1>51)  break;
                    if (T[c1]<0x200 && T[c1]>=0x100)
                    {   T[c1] &= 0xff;  // 表
                        Teban++;
                    }
                    break;
                case 1:  case 4:        // 2枚目
                    c2= y*13+x;
                    if (c2<0 || c2>51)  break;
                    if (T[c2]<0x200 && T[c2]>=0x100)
                    {   T[c2] &= 0xff;  // 表
                        Teban++;
                    }
                    break;
                case 2:  case 5:        // 照合
                    w1= T[c1] & 0xff;
                    w2= T[c2] & 0xff;
                    if ((w1%13)==(w2%13))
                    {   T[c1] |= 0x200; // 取り除く
                        T[c2] |= 0x200;
                        if (Teban==2)
                        {   listA.add(w1);
                            listA.add(w2);
                            Teban= 0;
                        }
                        else
                        {   listB.add(w1);
                            listB.add(w2);
                            Teban= 3;
                        }
                        if (listA.size()+listB.size()>50)   Teban= 6;
                    }
                    else
                    {   T[c1] |= 0x100; // 裏
                        T[c2] |= 0x100;
                        if (Teban==2)   Teban= 3;
                        else            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="cardalpha.class" width="800" height="500">
        </applet>
      </body>
    </html>
    

Java プログラムの説明

  1. 前回までの説明は ペアのカードを取り除く を参照して下さい。
    card obj; は card object class の領域です。
    int T[] はカードをシャッフルする領域で、カードの番号にフラグを付加して格納します。
    listA はプレイヤーAが取得したカードで、listB がプレイヤーBが取得したカードです。
    Teban はプログラムを制御する領域です。
    1. Teban==0 のときは、プレイヤーAの1枚目のカードです。
    2. Teban==1 のときは、プレイヤーAの2枚目のカードです。
    3. Teban==2 のときは、プレイヤーAの2枚のカードを調べます。
      同じ数字のときは削除して listA に追加します。
      違う数字のときは裏返します。
    4. Teban==3 のときは、プレイヤーBの1枚目のカードです。
    5. Teban==4 のときは、プレイヤーBの2枚目のカードです。
    6. Teban==5 のときは、プレイヤーBの2枚のカードを調べます。
      同じ数字のときは削除して listB に追加します。
      違う数字のときは裏返します。
    7. Teban==6 のときは、ゲーム終了です。
      プレイヤーAとプレイヤーBが獲得した枚数を表示します。
    c1, c2 は選択したカードを一時的に記憶する領域です。
        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 cardalpha extends JApplet implements MouseListener
        {   card    obj;
            // CARD のシャッフル,  0x100:裏,  0x200:非表示
            int     T[] = new int[52];
            ArrayList<Integer>  listA = new ArrayList<Integer>();
            ArrayList<Integer>  listB = new ArrayList<Integer>();
            int     Teban=0;
            int     c1,c2;
        
  2. paint() メソッドで T[] でシャッフルされたカードを描画します。
    裏面で描画したのでは、デバッグが面倒なので、表面で描画しています。
    次に listA と listB に登録されているカードを重ねて描画します。
    Teban の値に従ってゲームの進行メッセージを描画します。
    マイナーな Font を設定するとホームページから起動出来ないことがあります。
    "Helvetica" が無難なようです。
        // 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<listA.size(); i++)
                obj.View(g,listA.get(i),i*12+10,340);
            for(i=0; i<listB.size(); i++)
                obj.View(g,listB.get(i),i*12+10,420);
            //g.setFont(new Font("MS P明朝",Font.PLAIN,32));
            g.setFont(new Font("Helvetica",Font.PLAIN,32));
            g.setColor(Color.black);
            switch(Teban)
            {   case 0:
                    g.drawString("Aさんの1枚目です", 20,320);
                    break;
                case 1:
                    g.drawString("Aさんの2枚目です", 20,320);
                    break;
                case 2:  case 5:
                    g.drawString("カードを確認します", 20,320);
                    break;
                case 3:
                    g.drawString("Bさんの1枚目です", 20,320);
                    break;
                case 4:
                    g.drawString("Bさんの2枚目です", 20,320);
                    break;
                case 6:
                    g.drawString("Aさんは" + listA.size() + "枚、  Bさんは" + listB.size() + "でした。", 20,100);
                    break;
            }
        }
        
  3. マウスのクリックを検出するメソッドです。
    クリックエラーをチェックして表返します。
    二枚のカードが揃うと照合します。
    同じ数字のときは削除して 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:  case 3:        // 1枚目
                    c1= y*13+x;
                    if (c1<0 || c1>51)  break;
                    if (T[c1]<0x200 && T[c1]>=0x100)
                    {   T[c1] &= 0xff;  // 表
                        Teban++;
                    }
                    break;
                case 1:  case 4:        // 2枚目
                    c2= y*13+x;
                    if (c2<0 || c2>51)  break;
                    if (T[c2]<0x200 && T[c2]>=0x100)
                    {   T[c2] &= 0xff;  // 表
                        Teban++;
                    }
                    break;
                case 2:  case 5:        // 照合
                    w1= T[c1] & 0xff;
                    w2= T[c2] & 0xff;
                    if ((w1%13)==(w2%13))
                    {   T[c1] |= 0x200; // 取り除く
                        T[c2] |= 0x200;
                        if (Teban==2)
                        {   listA.add(w1);
                            listA.add(w2);
                            Teban= 0;
                        }
                        else
                        {   listB.add(w1);
                            listB.add(w2);
                            Teban= 3;
                        }
                        if (listA.size()+listB.size()>50)   Teban= 6;
                    }
                    else
                    {   T[c1] |= 0x100; // 裏
                        T[c2] |= 0x100;
                        if (Teban==2)   Teban= 3;
                        else            Teban= 0;
                    }
                    break;
            }
            repaint();
        }
        
  4. ★画像を切り分ける class card は前回と同じなので、省略しています。

Java Game Program