じゃんけん Class

じゃんけんゲームに白番のクラスファイル(W_Sumaho.cs) を組み込みます。

思考 Object Class

  1. じゃんけんゲームに白番のクラス(W_Class)を定義した W_Sumaho.cs を組み込みます。
    W_Sumaho.cs の内容は ゲームの完成 のコンピュータ側から抜き出したものです。
    またスマホのじゃんけんゲームに組み込まれている物とも同じです。
    // W_Sumaho(白 スマホ) のオブジェクトクラス
    using System;
    
    class W_Class
    {
        Random  rand;
        int     game_cnt, old, y_cnt;
    
        public W_Class()
        {
            rand = new Random();    //時間に応じて決まるシード値で初期化
            game_cnt= 0;
            old= 0;
            y_cnt= 0;
            Console.WriteLine("白 スマホを組み込む");
        }
    
        // 白の手を出す
        public int W_Think()
        {
            int n= rand.Next(3)+2;          //2~4の乱数
            if (y_cnt>n)                    //連続回数>乱数
            {   y_cnt= 0;                   //回数をリセット
                n= (old+2)%3;               //old に勝つ手を選ぶ
                return(n);
            }
            if (game_cnt%12<5)     return(1);
            if (game_cnt%12<6)     return(2);
            if (game_cnt%12<10)    return(1);
            return(2);
        }
    
        // 情報の収集(you:対戦相手の手)
        public void W_Info(int you, int my)
        {
            game_cnt++;
            if (you==old)
            {   y_cnt++;            //y_cnt= you が続いた回数
                return;
            }
            old= you;               //old= you の手を記録 
            y_cnt= 1;               //y_cnt をリセット
        }
        
        // グー・チョキ・パーをパラメータの確率で出す
        public int WeightRand(int g, int c, int p)
        {   int x = rand.Next(g+c+p);
            if (x<g)        return 0;
            else if (x<g+c) return 1;
            else            return 2;
        }
    }
    
  2. 乱数を使うので、コンストラクタで乱数を初期化します。
    このクラスが起動されたことを確認するために Console.WriteLine(); でメッセージを印字します。
        public W_Class()
        {
            rand = new Random();    //時間に応じて決まるシード値で初期化
            game_cnt= 0;
            old= 0;
            y_cnt= 0;
            Console.WriteLine("白 スマホのクラスを組み込む");
        }
    
  3. W_Think() と W_Info() は必ず定義して下さい。
    W_Think() では、白の手を決めてリターンします。
        // 白の出す手を考える 
        public int W_Think()
        {
            int n= rand.Next(3)+2;          //2~4の乱数
            if (y_cnt>n)                    //連続回数>乱数
            {   y_cnt= 0;                   //回数をリセット
                n= (old+2)%3;               //old に勝つ手を選ぶ
                return(n);
            }
            if (game_cnt%12<5)     return(1);
            if (game_cnt%12<6)     return(2);
            if (game_cnt%12<10)    return(1);
            return(2);
        }
    
  4. W_Info() では、白の手を決める為の必要な情報を収集します。
    ここでは、ゲームカウントと対戦相手の同じ手が続いた回数をカウントしています。
    情報を収集する必要が無くても、関数だけは定義して下さい。
        // 情報の収集(you:対戦相手の手)
        public void W_Info(int you, int my)
        {
            game_cnt++;
            if (you==old)
            {   y_cnt++;            //y_cnt= you が続いた回数
                return;
            }
            old= you;               //old= you の手を記録 
            y_cnt= 1;               //y_cnt をリセット
        }
    

メインプログラム

  1. W_Sumaho.cs を組み込むメインプログラムファイル JyankenCls1.cs です。
    // じゃんけん Class のテスト
    // csc JyankenCls1.cs W_Sumaho.cs
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        W_Class w_cls = new W_Class();
    
        Bitmap  score_img, gu_img, ti_img, pa_img;
        Button  button0, button1, button2, button3;
        TextBox textBox1;
        Random  rand;
        int     red, white;         //紅白の手
        int     r_score, w_score;   //紅白の得点
        int     game_cnt;           //ゲームカウント
        int[]   tbl= new int[3];    //対戦相手のグーチョキパー
    
        // R_Class の領域
         
        public MyForm()
        {
            InitializeComponent();
            rand = new Random();    //時間に応じて決まるシード値で初期化
            Paint += new PaintEventHandler(MyHandler);
            try
            {
                score_img = new Bitmap("C:\\DATA\\Test\\score2.gif");
                gu_img    = new Bitmap("C:\\DATA\\Test\\jyanken0.gif");
                ti_img    = new Bitmap("C:\\DATA\\Test\\jyanken1.gif");
                pa_img    = new Bitmap("C:\\DATA\\Test\\jyanken2.gif");
            }
            catch
            {
                MessageBox.Show("画像ファイルが読めません!", "C:\\DATA\\Test\\");
                return ;
            }
            r_score= 0;
            w_score= 0;
            for(int i=0; i<3; i++)    tbl[i] = 0;
            game_cnt= 1;        
            R_Init();
        }
    
        private void R_Init()
        {
        }
        
        private void InitializeComponent()
        {
            // button0
            button0 = new Button();
            button0.Parent = this;
            button0.Location = new System.Drawing.Point(20, 260);
            button0.Text = "グー";
            button0.Click += new System.EventHandler(this.button0_Click);
            // button1
            button1 = new Button();
            button1.Location = new System.Drawing.Point(20, 290);
            button1.Text = "チョキ";
            button1.Click += new System.EventHandler(this.button1_Click);
            // button2
            button2 = new Button();
            button2.Location = new System.Drawing.Point(20, 320);
            button2.Text = "パー";
            button2.Click += new System.EventHandler(this.button2_Click);
            // button3
            button3 = new Button();
            button3.Location = new System.Drawing.Point(20, 350);
            button3.Text = "Think";
            button3.Click += new System.EventHandler(this.button3_Click);
            // textBox1
            textBox1 = new System.Windows.Forms.TextBox();
            textBox1.Location = new System.Drawing.Point(20, 390);
            textBox1.Size = new System.Drawing.Size(360, 40);
    
            this.ClientSize = new System.Drawing.Size(400, 420);
            this.Controls.Add(this.button0);
            this.Controls.Add(this.button1);
            this.Controls.Add(this.button2);
            this.Controls.Add(this.button3);
            this.Controls.Add(this.textBox1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
            this.PerformLayout();
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(score_img, 20, 10);
            switch(red)
            {   case 0: g.DrawImage(gu_img, 100, 260);
                        break;
                case 1: g.DrawImage(ti_img, 100, 260);
                        break;
                case 2: g.DrawImage(pa_img, 100, 260);
                        break;
            }
            switch(white)
            {   case 0: g.DrawImage(gu_img, 240, 260);
                        break;
                case 1: g.DrawImage(ti_img, 240, 260);
                        break;
                case 2: g.DrawImage(pa_img, 240, 260);
                        break;
            }
        }
    
        private void button0_Click(object sender, EventArgs e)
        {
            red = 0;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            red = 1;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            red = 2;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
        private void button3_Click(object sender, EventArgs e)
        {
            red = R_Think();
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
    
        // 紅の手を考える
        private int R_Think()
        {
            return WeightRand(2, 20, 10);
        }
        // 紅の情報収集(you:対戦相手  my:自分側)
        private void R_Info(int you, int my)
        {
            game_cnt++;
            tbl[you]++;
    Console.WriteLine("GameCount:{0}   {1} {2} {3}",game_cnt,tbl[0],tbl[1],tbl[2]);
        }
        // グー・チョキ・パーをパラメータの確率で出す
        public int WeightRand(int g, int c, int p)
        {   int x = rand.Next(g+c+p);
            if (x<g)        return 0;
            else if (x<g+c) return 1;
            else            return 2;
        }
        // 勝敗の判定と得点の計算
        private void Judge(int red, int white)
        {   string  str= "";
            int w;
            w = ((red+3)-white)%3;
            switch(w)
            {   case 1:
                    str= "白の勝ちです        ";
                    switch(white)
                    {   case 0: //グーで勝ち
                            w_score += 5;
                            break;
                        case 1: //チョキで勝ち
                            w_score += 2;
                            break;
                        case 2: //パーで勝ち
                            w_score += 15;
                            r_score -= 5;
                            break;
                    }
                    break;
                case 2:
                    str= "赤の勝ちです        ";
                    switch(red)
                    {   case 0: //グーで勝ち
                            r_score += 5;
                            break;
                        case 1: //チョキで勝ち
                            r_score += 2;
                            break;
                        case 2: //パーで勝ち
                            r_score += 15;
                            w_score -= 5;
                            break;
                    }
                    break;    
                default:
                    str= "あいこです          ";
                    switch(white)
                    {   case 0: //グー
                            r_score += 3;
                            w_score += 3;
                            break;
                        case 1: //チョキ
                            r_score += 1;
                            w_score += 1;
                            break;
                    }
                    break;
            }
            str= str + "紅の得点:" + r_score.ToString() +
                       "                    白の得点:" + w_score.ToString();
            textBox1.Text = str;
        }
    }
    
    class form03
    {
        public static void Main()
        {
            MyForm mf = new MyForm();
            Application.Run(mf);
        }
    }
    
  2. スタートメニューから[すべてのプログラム][Visual C++ 2005 Express Edition][Visual Studio Tools] [Visual Studio 2005 コマンド プロンプト] から起動します。
    C:\Data\C#\Jyanken のフォルダーに移動して、直接 csc コマンドを叩きます。
    CSC JyankenCls1.cs W_Sumaho.cs でメインプログラムと W_Sumaho.cs を同時にコンパイルします。
    コンパイルが終われば JyankenCls1.exe を実行して下さい。
    >CD C:\Data\C#\Jyanken
    >CSC JyankenCls1.cs W_Sumaho.cs
    >JyankenCls1.exe          
    
  3. じゃんけんはラジオボタンのクリックで行います。
    button0 ~ button2 をクリックすると、紅はクリックされた手を出します。
    白は white = w_cls.W_Think(); で W_Sumaho.cs に組み込まれた手を出します。
    R_Info(white, red); と w_cls.W_Info(red, white); で紅白に情報を伝えます。
        private void button0_Click(object sender, EventArgs e)
        {
            red = 0;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            red = 1;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            red = 2;
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
    
  4. button3 をクリックすると、紅はメインプログラムの R_Think(); 関数を使って手を決めます。
    白は W_Sumaho.cs に組み込まれた手を出します。
        private void button3_Click(object sender, EventArgs e)
        {
            red = R_Think();
            white = w_cls.W_Think();
            Judge(red, white);
            R_Info(white, red);
            w_cls.W_Info(red, white);
            Invalidate();
        }
    
  5. R_Think() では乱数を使って手を決めます。
        // 紅の手を考える
        private int R_Think()
        {
            return WeightRand(2, 20, 10);
        }
    
  6. 今回は R_Info() で情報を収集する必要は無いのですが、ゲームの回数と白が出すグー・チョキ・パーをカウントしています。
        // 紅の情報収集(you:対戦相手  my:自分側)
        private void R_Info(int you, int my)
        {
            game_cnt++;
            tbl[you]++;
    Console.WriteLine("GameCount:{0}   {1} {2} {3}",game_cnt,tbl[0],tbl[1],tbl[2]);
        }
    
  7. このプログラムで W_Class(白)が、対戦相手(紅)の手にきちんと対応しているかを調べます。
    マウスのクリックで連続してパーを出し続けて W_Class の対応を調べて下さい。
    マウスのクリックで連続してチョキを出し続けて W_Class の対応を調べて下さい。
    このプログラムは、新規に Class を作成するにあたって R_Think() や R_Info() に組み込んで動作確認するときにも使います。

[Next Chapter ↓] じゃんけんゲームバトル
[Previous Chapter ↑] ゲームの完成

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