CARD を反転表示する

CARD を上下(左右)反転して描画します。

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

プログラムの作成

  1. ゲームプログラムは今まで説明したことの集大成です。欲張らずに基礎から学んで下さい。
    前回までの説明は CARD をシャッフルして描画 を参照して下さい。
  2. メモ帳などでタイプして Card_04.java の名前で保存して下さい。
    //★ CARD を反転表示する    前田 稔
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
    import javax.imageio.ImageIO;
    import java.util.*;
    
    class Card_04 extends JFrame
    {   CARD    card;
        int     T[] = new int[48];  //配列の生成
    
        // Main
        public static void main(String args[])
        {   new Card_04();
        }
    
        // Constructor
        public Card_04()
        {   super("Image View");
            card = new CARD("c:\\data\\test\\hanafuda.gif",51,75);
            card.Shuffle(T,48);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(720,400);
            setBackground(Color.gray);
            setVisible(true);
        }
    
        // Paint Method
        public void paint(Graphics g)
        {   for(int i=0; i<48; i++)
                card.view(g,T[i],(i%12)*56+20,(i/12)*80+46);
        }
    }
    
    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);
                //g.drawImage(Img,dx,dy+Height,dx+Width,dy,sx,sy,sx+Width,sy+Height,this);
                //g.drawImage(Img,dx+Width,dy,dx,dy+Height,sx,sy,sx+Width,sy+Height,this);
                //g.drawImage(Img,dx+Width,dy+Height,dx,dy,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;
            }
        }
    }
    
  3. 画像ファイル("c:\\data\\test\\hanafuda.gif")をパスで指定したフォルダーに格納して下さい。
    hanafuda.gif は「横=51ドット,縦=75ドット」の花札が5段10列に並んだ画像です。

プログラムの説明

  1. 画像の反転表示は簡単です。
    drawImage() のパラメータの順序を変えるだけです。
    上下を反転するときは、上と下の座標を入れ替えます。
    左右を反転するときは、左と右の座標を入れ替えます。
    上から、正常表示/上下反転/左右反転/上下左右反転です。
        if (img != null)
        {   g.drawImage(img,dx,dy,dx+Width,dy+Height,sx,sy,sx+Width,sy+Height,this);
            //g.drawImage(img,dx,dy+Height,dx+Width,dy,sx,sy,sx+Width,sy+Height,this);
            //g.drawImage(img,dx+Width,dy,dx,dy+Height,sx,sy,sx+Width,sy+Height,this);
            //g.drawImage(img,dx+Width,dy+Height,dx,dy,sx,sy,sx+Width,sy+Height,this);
        }
        
  2. 手持札などのとき、カードを重ねて描画したいことがあります。
    先に描画した画像の上から後から描画したカードが重ねられます。
        // Paint Method
        public void paint(Graphics g)
        {   for(int i=0; i<48; i++)
                //card.view(g,T[i],(i%12)*56+20,(i/12)*80+46);
                card.view(g,T[i],(i%24)*20+20,(i/24)*80+46);
        }
        

カードゲームの作成

  1. ゲームの分類方法も様々ですが、乱数を使うゲームをモンテカルロゲームと言います。
    モナコの賭博の町にちなむ名前で、カードゲームやマージャンなどがこれに属します。
    極端な話として、最初からカードが揃っていたり、配牌で聴牌(テンパイ)することも 無いとは言えず、勝敗が乱数に大きく左右されます。
    乱数はコンピュータで発生させるので、プログラムで自由に操作出来ます。
    そのような理由で、私はモンテカルロゲームはあまり好きではありません。
  2. モンテカルロゲームに属さないゲームをオープンゲームと言います。
    全ての情報が完全にオープンされているゲームで、囲碁や将棋やチェスがこれに属します。
    コンピュータと言えどもごまかしが効かないゲームで、プログラミング能力が試されます。
    最近ではチェスの世界チャンピオンに勝ったり、将棋の名人に善戦するなど随分強くなってきました。
  3. パソコンゲームを分類すると、RPG ゲーム, シューティングゲーム, シュミレーションゲーム, アドベンチャーゲーム, サウンドノベル, パズルゲーム, ホラーゲーム など幾らでも出てきそうです。
  4. ここまででカードゲームの基本を説明したのですが、神経衰弱ぐらいは作成できるようになったでしょうか。
    人間同士の対戦は簡単ですが、コンピュータがゲームに参加するときは一苦労です。
    何しろ相手の手の内も、やろうと思えば乱数も思いどおりに操作出来るのですから、勝つのは簡単です。
    それよりも「いかに人間らしくプレイ」して、プレイヤーを楽しませるかが腕の見せ所です。
  5. Java Applet で作成すると、ホームページのブラウザ上でゲームを楽しむことが出来るようになります。
    ブラウザ上で実行できる神経衰弱ゲームです。
    二人が交互にプレイする神経衰弱ゲーム
    面白いゲームを作成して公開して下さい。

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