じゃんけんゲーム


じゃんけんゲーム を実行します。


プログラムの説明

  1. あなたと私(コンピュター)が「じゃんけん」をします。
    組み合わせにより得点が変わります。
    得点表は次のとおりです。
    勝ち 負け あいこ
    グー(0) 5点 -5点 3点
    チョキ(1) 2点 0点 1点
    パー(2) 15点 0点 0点
  2. パーを出せば「勝ち点が大きく、負けたときの減点も無い」のですが、何時もパーを出せば勝てるでしょうか?
    そこに戦略が生まれます。
    「石取ゲーム」や「三山ゲーム」には必勝法が存在するのですが、このゲームには必勝法はありません。
    コンピューター側は、後出し無しで正々堂々と闘います。
  3. <body> から Init() 関数で初期化して、Play() 関数でゲーム開始です。
    <body bgcolor="faf8e0">
    <h2>じゃんけんゲーム</h2>
    
    <script type="text/javascript">
    Init();
    Play();
    </script>
    
  4. ゲームの準備を整える Init() 関数です。
    最初の呼び出し(パラメータ無し)のとき、ゲームのルールを表示して「開始」ボタンでゲームを開始します。
    hidden は隠しパラメータです。
    二回目以降は渡されたパラメータを取得します。
    function Init()
    {
        param = new Array();
        if (window.location.search.length<3)
        {   // 最初の呼び出し
            document.write("・あなたと私がじゃんけんをします<br>");
            document.write("・何で勝つかで得点が変わります<br>");
            document.write("・得点表は次のとおりです<br>");
            document.write('<table border="1">');
            document.write('<tr><th>手</th><th>勝ち</th><th>負け</th><th>あいこ</th></tr>');
            document.write('<tr><td>グー(0)</td><td>5点</td><td>-5点</td><td>3点</td></tr>');
            document.write('<tr><td>チョキ(1)</td><td>2点</td><td>0点</td><td>1点</td></tr>');
            document.write('<tr><td>パー(2)</td><td>15点</td><td>0点</td><td>0点</td></tr>');
            document.write('</table>');
            document.write('<form action="jyanken4.html" method="get">');
            document.write('<input type="hidden" name="mode" value=0>');
            document.write('<input type="hidden" name="score_m" value=0>');
            document.write('<input type="hidden" name="score_c" value=0>');
            document.write('<input type="hidden" name="cnt" value=0>');
            document.write('<input type="hidden" name="v1" value=0>');
            document.write('<input type="hidden" name="v2" value=0><br>');
            document.write('<input type="submit" value="開始">');
            document.write('</form>');
            return;
        }
        else
        {   // パラメータを取得する
            var query = window.location.search.substring(1);
            var parameters = query.split('&');
            for(i=0; i<parameters.length; i++)
            {
                var element = parameters[i].split('=');
                var paramName = decodeURIComponent(element[0]);
                var paramValue = decodeURIComponent(element[1]);
                param[paramName] = parseInt(paramValue);
            }
        }
    }
    
  5. ゲームを開始する Play() 関数です。
    param["mode"]==0 は、じゃんけんの開始(お互いの手を決める)ときです。
    radio Button で「グー, チョキ, パー」を選択します。
    スマホでは、戻るボタンをクリックしても一度に game_index に戻れません?
    そこで END ボタンを追加しました。
    param["mode"]==1 は、勝負の判定をして得点を計算して表示します。
    「確認」ボタンで次の勝負です。
    function Play()
    {
        if (param["mode"]==0)   //手を決める
        {
            var com = Think();
            document.write('<form action="jyanken4.html" method="get">');
            document.write('<input type="hidden" name="mode" value=1>');
            document.write('<input type="hidden" name="score_m" value=',param["score_m"],'>');
            document.write('<input type="hidden" name="score_c" value=',param["score_c"],'>');
            document.write('<input type="hidden" name="cnt" value=',param["cnt"],'>');
            document.write('<input type="hidden" name="v1" value=',param["v1"],'>');
            document.write('<input type="hidden" name="v2" value=',param["v2"],'>');
            document.write('<input type="hidden" name="com" value=',com,'>');
            document.write('<input type=radio name="man" value=0 CHECKED>グー <br><br>');
            document.write('<input type=radio name="man" value=1>チョキ<br><br>');
            document.write('<input type=radio name="man" value=2>パー <br><br><br>');
            document.write('<input type=radio name="man" value=3>END<br><br>');
            document.write('<br><input type="submit" value="送信">');
            document.write('</form>');
            return;
        }
        if (param["mode"]==1)   //勝負の判定
        {
            if (param["man"]==3)    location.href = "game_index.html";
            else
            {   var man = param["man"];
                var com = param["com"];
                var s_m = param["score_m"]; 
                var s_c = param["score_c"]; 
                document.write('<h2>あなた : わたし</h2>');
                if (man==0) document.write('<img src="jgu.gif">');
                if (man==1) document.write('<img src="jchi.gif">');
                if (man==2) document.write('<img src="jpa.gif">');
                if (com==0) document.write('<img src="jgu.gif">');
                if (com==1) document.write('<img src="jchi.gif">');
                if (com==2) document.write('<img src="jpa.gif">');
                var w = ((man+3)-com)%3;
                switch(w)
                {   case 1:     // Computer の勝ち
                        document.write('<h2>私の勝ちです</h2>');
                        switch(com)
                        {   case 0: //グーで勝ち
                                s_c += 5;
                                break;
                            case 1: //チョキで勝ち
                                s_c += 2;
                                break;
                            case 2: //パーで勝ち
                                s_c += 15;
                                s_m -= 5;
                                break;
                        }
                        break;
                    case 2:     // プレイヤー の勝ち
                        document.write('<h2>あなたの勝ちです</h2>');
                        switch(man)
                        {   case 0: //グーで勝ち
                                s_m += 5;
                                break;
                            case 1: //チョキで勝ち
                                s_m += 2;
                                break;
                            case 2: //パーで勝ち
                                s_m += 15;
                                s_c -= 5;
                                break;
                        }
                        break;    
                    default:    
                        document.write('<h2>あいこです</h2>');
                        switch(com)
                        {   case 0: //グー
                                s_m += 3;
                                s_c += 3;
                                break;
                            case 1: //チョキ
                                s_m += 1;
                                s_c += 1;
                                break;
                        }
                        break;
                }
                Info();     //情報の収集
                document.write('<table border="1">');
                document.write('<tr><th>あなたの得点</th><th>わたしの得点</th></tr>');
                document.write('<tr><td>',s_m,'</td><td>',s_c,'</td></tr>');
                document.write('</table>');
                document.write('<form action="jyanken4.html" method="get">');
                document.write('<input type="hidden" name="mode" value=0>');
                document.write('<input type="hidden" name="score_m" value=',s_m,'>');
                document.write('<input type="hidden" name="score_c" value=',s_c,'>');
                document.write('<input type="hidden" name="cnt" value=',(param["cnt"]+1),'>');
                document.write('<input type="hidden" name="v1" value=',param["v1"],'>');
                document.write('<input type="hidden" name="v2" value=',param["v2"],'>');
                document.write('<br><br><input type="submit" value="確認">');
                document.write('</form>');
            }
        }
    }
    
  6. コンピューターが出す手を考える Think() 関数です。
    何を出せばコンピューターに勝てるか、解析してみて下さい。
    function Think()
    {
        var n= Math.floor(Math.random()*3)+2;
        if (param["v2"]>n)
        {   param["v2"] = 0;
            n = (param["v1"]+2)%3;
            return(n);
        }
        var cnt = param["cnt"];
        if (cnt%12<5)    return(1);
        if (cnt%12<6)    return(2);
        if (cnt%12<10)   return(1);
        return(2);
    }
    
  7. コンピューターが情報を収集する Info() 関数です。
    この情報を元にコンピューターが出す手を決めます。
    function Info()
    {
        if (param["man"]==param["v1"])
        {   param["v2"] ++;
            return;
        }
        param["v1"] = param["man"];
        param["v2"] = 1;
    }
    
  8. Microsoft Edge では「戻るボタン」一発で game_index.html に戻ります。
    (2020/4/24 Windows10 & Microsoft Edge で確認)
    所が Google Chrome やスマホでは、プレイした画面をひとつずつ順に戻ります。
    そこでゲームを終了する END ボタンを追加しました。
    END を選択すると、リンク元に関係なく game_index.html が呼び出されます。
    また History には過去のリンクがそのまま残っているので留意して下さい。
    function Play()
    {
          ・・・
            document.write('<input type=radio name="man" value=3>END<br><br>');
          ・・・
        if (param["mode"]==1)   //勝負の判定
        {
            if (param["man"]==3)    location.href = "game_index.html";
          ・・・