じゃんけんゲームの完成

コンピュータの思考関数を作成してゲームの完成です。

私のダウンロードのページから実行形式のプログラムを提供しています。
マジでプログラムに勝てるでしょうか?

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

ゲームの完成

  1. C:\Data\C#\BAT\WIN\ のフォルダーに Jyanken4.cs の名前で utf-8(BOM 有り)でタイプして格納して下さい。
    プログラムを起動して、ゲームを楽しんで下さい。
    // Think() 関数を作成する(グーだけ, チョキだけ, パーだけのプレイヤーに対応)
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyForm : Form
    {
        Bitmap  score, gu, chyoki, pa;
        Button  button0, button1, button2;
        TextBox textBox1;
        Random  rand;
        int     you, my;            //あなたと私の手
        int     y_c, m_c;           //あなたと私の得点
        int     game_cnt;           //ゲームのカウント
        int     old;                //前回の you の手
        int     y_cnt;              //you の手の連続数
         
        public MyForm()
        {
            InitializeComponent();
            rand = new Random();    //時間に応じて決まるシード値で初期化
            Paint += new PaintEventHandler(MyHandler);
            try
            {
                score = new Bitmap("C:\\DATA\\Test\\score.gif");
                gu    = new Bitmap("C:\\DATA\\Test\\jyanken0.gif");
                chyoki= new Bitmap("C:\\DATA\\Test\\jyanken1.gif");
                pa    = new Bitmap("C:\\DATA\\Test\\jyanken2.gif");
            }
            catch
            {
                MessageBox.Show("画像ファイルが読めません!", "C:\\DATA\\Test\\");
                return ;
            }
            y_c= 0;
            m_c= 0;
            game_cnt= 0;
            old= 0;
            y_cnt= 0;
        }
    
        private void InitializeComponent()
        {
            // button0
            button0 = new Button();
            button0.Parent = this;
            button0.Location = new System.Drawing.Point(20, 240);
            button0.Text = "グー";
            button0.Click += new System.EventHandler(this.button0_Click);
            // button1
            button1 = new Button();
            button1.Location = new System.Drawing.Point(20, 280);
            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);
            // textBox1
            textBox1 = new System.Windows.Forms.TextBox();
            textBox1.Location = new System.Drawing.Point(20, 380);
            textBox1.Size = new System.Drawing.Size(300, 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.textBox1);
            this.Name = "MyForm";
            this.ResumeLayout(false);
            this.PerformLayout();
        }
    
        private void MyHandler(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            g.DrawImage(score, 20, 20);
            switch(you)
            {   case 0: g.DrawImage(gu, 110, 240);
                        break;
                case 1: g.DrawImage(chyoki, 110, 240);
                        break;
                case 2: g.DrawImage(pa, 110, 240);
                        break;
            }
            switch(my)
            {   case 0: g.DrawImage(gu, 240, 240);
                        break;
                case 1: g.DrawImage(chyoki, 240, 240);
                        break;
                case 2: g.DrawImage(pa, 240, 240);
                        break;
            }
        }
    
        private void button0_Click(object sender, EventArgs e)
        {
            you = 0;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            you = 1;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            you = 2;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
        // コンピュータが考える
        private int 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:人間側  my:コンピュータ側)
        private void 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;
        }
        // 勝敗の判定と得点の計算
        private void Judge(int you, int my)
        {   string  str= "";
            int w;
            w = ((you+3)-my)%3;
            switch(w)
            {   case 1:
                    str= "私の勝ちです    ";
                    switch(my)
                    {   case 0: //グーで勝ち
                            m_c += 5;
                            break;
                        case 1: //チョキで勝ち
                            m_c += 2;
                            break;
                        case 2: //パーで勝ち
                            m_c += 15;
                            y_c -= 5;
                            break;
                    }
                    break;
                case 2:
                    str= "あなたの勝ちです    ";
                    switch(you)
                    {   case 0: //グーで勝ち
                            y_c += 5;
                            break;
                        case 1: //チョキで勝ち
                            y_c += 2;
                            break;
                        case 2: //パーで勝ち
                            y_c += 15;
                            m_c -= 5;
                            break;
                    }
                    break;    
                default:    
                    str= "あいこです    ";
                    switch(my)
                    {   case 0: //グー
                            y_c += 3;
                            m_c += 3;
                            break;
                        case 1: //チョキ
                            y_c += 1;
                            m_c += 1;
                            break;
                    }
                    break;
            }
            str= str + "あなたの得点:" + y_c.ToString() + "    わたしの得点:" + m_c.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 コマンドを叩きます。
    >CD C:\Data\C#\Jyanken
    >CSC Jyanken4.cs
    >Jyanken4.exe          
    
  3. コンパイルが終われば、下記のフォルダーに画像ファイルを格納して *.exe を実行して下さい。
    score = new Bitmap("C:\\DATA\\Test\\score.gif");
    gu    = new Bitmap("C:\\DATA\\Test\\jyanken0.gif");
    chyoki= new Bitmap("C:\\DATA\\Test\\jyanken1.gif");
    pa    = new Bitmap("C:\\DATA\\Test\\jyanken2.gif");
    
  4. プレイヤーの手はラジオボタンで選択します。
    コンピュータの手は Think() 関数で決定します。
    Judge() 関数は勝敗を判定して得点を計算する関数です。
    Info() 関数はコンピュータが手を決めるための情報収集です。
        private void button0_Click(object sender, EventArgs e)
        {
            you = 0;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            you = 1;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            you = 2;
            my = Think();
            Judge(you, my);
            Info(you, my);
            Invalidate();
        }
    
  5. コンピュータが情報を収集する Info() 関数です。
    game_cnt はゲームのカウンターです。
        // 情報収集(you:人間側  my:コンピュータ側)
        private void 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 をリセット
        }
    
  6. コンピュータが出す手を決める Think() 関数です。
    グー, チョキ, パーのどれか一種類しか出さないプレイヤーにも対応しています。
        // コンピュータが考える
        private int 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);
        }
        // グー・チョキ・パーをパラメータの確率で出す
        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;
        }
    
  7. 私のダウンロードのページから実行形式のプログラム(ダブルクリックでゲームが起動する)を提供しています。
    圧縮ファイルを解凍してプログラムと対戦してみて下さい。
    マジでプログラムに勝てるでしょうか?

[Next Chapter ↓] じゃんけん Class
[Previous Chapter ↑] 得点を計算

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