石の画像を描画

ゲームに使う石の画像を描画します。

C言語(Windows)でも本格的な 三山くずし Game Program を作成しています。
上の画像は、このプログラムのものです。
JavaScript でホームページから起動する三山くずしゲーム 三山ゲームβ版 を作成しています。
PHP でネット対戦型の三山くずしゲーム 対戦型三山くずしα版 を作成しています。
Java でも 三山くずしゲームの説明 を作成しています。
残念ながら現在のサーバーでは Java Applet 版の 三山くずしゲーム は起動出来ないので悪しからず。

直接リンク出来ない時は「前田稔(Maeda Minoru)の超初心者のプログラム入門」からたどって下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

三山くずしゲームのルール

  1. 三個の山にそれぞれ「1~15」の石を置きます。
  2. 石の数は、コンピュータが乱数を使って決めます。
  3. 二人のプレーヤー(人間とコンピュータ)が交互に石を取り除きます。
  4. 一つの山からであれば好きなだけ石を取り除くことができます。
  5. 最後の石を取らされた方が負けです。
  6. 三山くずしゲームのルールには「最後の石を取った方が勝ち」と「最後の石を取らされた方が負け」があります。
    今回は少し複雑な「最後の石を取らされた方が負け」を採用します。

石の画像を描画

  1. 最初は Miyama Object Class で、ゲームに使う石の画像を描画します。
    事前に石の画像(@"c:\data\test\jewel.gif")を用意しておいて下さい。
    ソースコードです。
    /*********************************/
    /*★ 石の画像を描画    前田 稔 ★*/
    /*********************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        Miyama   App;
    
        public MyForm()
        {
            App = new Miyama(@"c:\data\test\jewel.gif");
            Paint += new PaintEventHandler(MyHandler);
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (App.bmp == null)    Application.Exit();
            App.View(g,10,10);
        }
    }
    
    //☆ 三山 Object Class
    class Miyama
    {
        public  Bitmap  bmp;
    
        public Miyama(string file)
        {
            try
            {   bmp= new Bitmap(file);   }
            catch
            {   MessageBox.Show("イメージが取得できません", "Error");  }
        }
    
        public void View(Graphics g, int x, int y)
        {
            if (bmp!=null)  g.DrawImage(bmp,x,y);
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. 画像を描画する Object Class の説明は キー操作で画像を移動する を参照して下さい。

乱数で山の石を設定

  1. 三個の山に乱数で石を設定して描画します。
    横一列に15個ずつ並べる方が簡単なのですが、今回は縦に5個ずつ並べます。
    /*********************************************/
    /*★ 乱数で設定した山の石を描画    前田 稔 ★*/
    /*********************************************/
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        Miyama   App;
    
        public MyForm()
        {
            Text = "三山くずしゲーム";
            Width = 600;
            Height = 400;
            App = new Miyama(@"c:\data\test\jewel.gif");
            App.Settbl();
            Paint += new PaintEventHandler(MyHandler);
            MouseDown += new MouseEventHandler(OnMyMouseDown);
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            if (App.bmp == null)    Application.Exit();
            App.View(g);
        }
    
        private void OnMyMouseDown(object sender, MouseEventArgs e)
        {
            App.Settbl();
            Invalidate();
        }
    }
    
    //☆ 三山 Object Class
    class Miyama
    {
        public  Bitmap bmp;
        Random  rand = new Random();
        public int[]   T = new int[3];          //山の石数
        static  Point bas = new Point(50, 240); //石の左上座標
        static  int   xsiz = 180;               //山の横幅
    
        // Constructor
        public Miyama(string file)
        {
            try
            {   bmp= new Bitmap(file);   }
            catch
            {   MessageBox.Show("イメージが取得できません", "Error");  }
        }
    
        // 山の石を表示
        public void View(Graphics g)
        {   int     i,j,x,y;
            if (bmp==null)  return;
            for(i=0; i<3; i++)          // 山番号
                for(j=0; j<T[i]; j++)   // 山の石数
                {   x= i*xsiz+(j/5)*50+bas.X;
                    y= bas.Y-(j%5)*50;
                    g.DrawImage(bmp,x,y);
                }
        }
    
        // 山に乱数で石を設定
        public void Settbl()
        {   int     i;
            while(true)
            {   for(i=0; i<3; i++)  T[i]= rand.Next(15)+1;
                if (T[0]!=T[1] && T[0]!=T[2] && T[1]!=T[2])  return;
            }
        }
    }
    
    class form01
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. T[3] は山に積まれている石の数です。
    bas は山の石を描画する左上の座標です。
    xsiz は三個の山の横幅です。
    これらの値を参照して、山の石を描画します。
        public int[]   T = new int[3];          //山の石数
        static  Point bas = new Point(50, 240); //石の左上座標
        static  int   xsiz = 180;               //山の横幅
    
        for(i=0; i<3; i++)          // 山番号
            for(j=0; j<T[i]; j++)   // 山の石数
            {   x= i*xsiz+(j/5)*50+bas.X;
                y= bas.Y-(j%5)*50;
                g.DrawImage(bmp,x,y);
            }
        
  3. Settbl() では、三個の山に乱数で 1~15 の石を設定します。
    山の石が同じ数になると面白く無いので、避けています。
        public void Settbl()
        {   int     i;
            while(true)
            {   for(i=0; i<3; i++)  T[i]= rand.Next(15)+1;
                if (T[0]!=T[1] && T[0]!=T[2] && T[1]!=T[2])  return;
            }
        }
        

[Next Chapter ↓] クリック座標

前田稔(Maeda Minoru)の超初心者のプログラム入門