ステージ−4 コンピュータのプレイ

Web(C#)で人間側のプレイの確認と終了判定とコンピュータがプレイをするステージです。

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

ステージ−4の作成

  1. ステージ−4は、このゲームの最も重要なステージです。
    1. 人間側がプレイした山の状態を表示して、確認を求めます。
      この処理をパスすると「コンピュータがごまかしたのでは?」と在らぬ疑いを持たれます。 (^_^;)
    2. 確認が終わるとゲームの終了を判定します。
    3. ゲームが続いているときは、コンピュータがプレイして、人間側に手を渡します。
  2. ゲームの画面はページ下部のリンクから直接ゲームをして確かめて下さい。
    ここではソースコードを中心に説明します。
    プロジェクトの作成は ゲームの説明と最初のステージ を参照して下さい。
  3. 最初の Page_Load でパラメータを受け取って、ViewState に保存します。
    ニックネーム Nickname
    勝ち数 Win
    負け数 Lose
    山の石の数 Num
    取り除ける最大数Max
  4. 次に Num の個数だけ石の画像を並べます。
            protected void Page_Load(object sender, EventArgs e)
            {
                int n,i;
                if (!IsPostBack)
                {
                    ViewState["Nickname"] = (string)Context.Items["Nickname"];
                    ViewState["Win"] = (string)Context.Items["Win"];
                    ViewState["Lose"] = (string)Context.Items["Lose"];
                    ViewState["Num"] = (string)Context.Items["Num"];
                    ViewState["Max"] = (string)Context.Items["Max"];
                    str = "";
                    n = Convert.ToInt32(ViewState["Num"]);
                    for (i = 0; i < n; i++)
                    {   if (i==10 || i==20)	str = str + "<br>";
                        str = str + "<img src=http://www.eonet.ne.jp/~maeda/img/jewel.gif>";
                    }
                    Label1.Text = str;
                }
            }
        
  5. ボタンがクリックされたときに呼び出される Button1_Click 関数です。
    始めに次のステージにリンクするために、パラメータを設定しています。
    num が現在積まれている山の石の個数です。
    いま人間側がプレイした局面なので num==0 のときはコンピュータの勝ちです。
    逆に num==1 のときはコンピュータの負けです。
    num>1 のときはゲームが継続中で、コンピュータがプレイします。
    このゲームには必勝法が存在していて、コンピュータは必勝の手を打っています。
    人間側が必勝の手を打ってきたときは一個だけ取り除きます。
    ほんの数行なので必勝の手を求める方法を理解して下さい。
            protected void Button1_Click(object sender, EventArgs e)
            {   int     num,i,m;
                Context.Items.Add("Nickname", ViewState["Nickname"]);
                Context.Items.Add("Win", ViewState["Win"]);
                Context.Items.Add("Lose", ViewState["Lose"]);
                Context.Items.Add("Num", ViewState["Num"]);
                Context.Items.Add("Max", ViewState["Max"]);
                num = Convert.ToInt32(ViewState["Num"]);
                switch(num)
                {   case 0:
                        i = Convert.ToInt32(ViewState["Win"]);
                        Context.Items.Remove("Win");
                        Context.Items.Add("Win", (string)Convert.ToString(i+1));
                        Server.Transfer("ishitori5.aspx");
                        //Response.Write("次のステージへジャンプ");
                        return;
                    case 1:
                        i = Convert.ToInt32(ViewState["Lose"]);
                        Context.Items.Remove("Lose");
                        Context.Items.Add("Lose", (string)Convert.ToString(i+1));
                        Server.Transfer("ishitori5.aspx");
                        //Response.Write("次のステージへジャンプ");
                        return;
                    default:
                        m = Convert.ToInt32(ViewState["Max"]);
                        i = (num - 1) % (m + 1);
                        if (i == 0) i = 1;
                        Context.Items.Remove("Num");
                        Context.Items.Add("Num", (string)Convert.ToString(num-i));
                        Server.Transfer("ishitori3.aspx");
                        //Response.Write("次のステージへジャンプ");
                        return;
                }
            }
        

【演習】

  1. ほんの数行なのでコンピュータが必勝の手を求める方法を理解して下さい。
  2. 実は常にコンピュータが必勝の手を打つのでは、面白味に欠けます。 (-.-;)
    25%ぐらいの確率で、わざと乱数で取り除くようにプログラムを修正して下さい。
  3. 人間側が必勝の手を打ってきたときに、何時も一個だけ取り除くのでは、余りにも芸が無いですよね。 (;_;)
    また一個だけ取ることで、相手に必勝のパターンに入ったことを悟られます。
    そこで、このときにも乱数で取り除くようにプログラムを修正して下さい。
    ただし、山の石を全て取ってしまわないように注意して下さい。 (^_^;)

ishitori4.aspx.cs のソースコード

石取りゲームを呼び出す

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