三山ゲーム-3


三山ゲーム-3では src="miyama3.js" を組み込みます。
miyama3.js では、コンピュータのプレイが設定されています。
<script src="miyama3.js" type="text/javascript"></script>

<body> のコードは「三山ゲーム-1」と同じです。
<script type="text/javascript">
Init();
//Check();
Play();
</script>


"miyama3.js" の説明です。

Click() 関数ではコンピュータの手番に設定して miyama3.html を呼び出します。
// マウスクリック
function Click(id)
{
    //window.alert(id);
    var y = Math.floor(id/20)+1;
    var n = id%20;
    P[y] = n;
    location.href = "miyama3.html?P0=-1" + "&P1=" + P[1] + "&P2=" + P[2] + "&P3=" + P[3];
}

プレイヤーとコンピュータが交互にプレイする Play() 関数です。
P[0]==0 の処理(山に石を設定)と P[0]==1 の処理(プレイヤーのプレイ)は 三山ゲーム-1 を参照して下さい。
コンピュータの手番でゲームの終了を判定します。
Think() 関数のリターンコードが -1 のときはコンピュータの勝ちで、1 のときはコンピュータの負けです。
次のゲームの開始(P0=0)を設定して、ゲームの終了確認を表示します。
リターンコードが 0 のときは、コンピュータのプレイを確認して、プレイヤーの手番です。
// プレイ関数
function Play()
{
    ・・・

    if (P[0] == -1)
    {   // コンピュータがプレイする
        rc = Think();
        switch(rc)
        {   case -1:    //コンピュータの勝ち
                document.write('私の勝ちです\(^o^)/<br>');
                document.write('<form action="miyama3.html" method="get">');
                document.write('<input type="hidden" name="P0" value=0>');
                document.write('<input type="submit" value="確認">');
                document.write('</form>');
                break;
           case 1:     //コンピュータの負け
                document.write('私の負けです(^_^;)');
                document.write('<form action="miyama3.html" method="get">');
                document.write('<input type="hidden" name="P0" value=0>');
                document.write('<input type="submit" value="確認">');
                document.write('</form>');
                break;
            default:    //プレイの確認
                Stone(P[1]);
                Stone(P[2]);
                Stone(P[3]);
                document.write('<form action="miyama3.html" method="get">');
                document.write('<input type="hidden" name="P0" value=1>');
                document.write('<input type="hidden" name="P1" value=',P[1],'>');
                document.write('<input type="hidden" name="P2" value=',P[2],'>');
                document.write('<input type="hidden" name="P3" value=',P[3],'>');
                document.write('<input type="submit" value="私のプレイを確認">');
                document.write('</form>');
                break;
        }
    }
}

コンピュータ側が山の石を設定する Think() 関数です。
コンピュータが強すぎると面白く無いので、1割の確率でミスをするようにしています。
// コンピュータが考える
function Think()
{
    var     n1;         //石が残っている山の数
    var     n2;         //石が一個だけの山の数
    var     mx;         //石が一番多い山の番号
    var     flag;       //設定済みフラグ
    n1 = 0;
    n2 = 0;
    mx = 0;
    flag = 0;
    for(i=1; i<4; i++)
    {   if (P[i]>0)
        {   n1++;
            if (P[i]==1)    n2++;
            if (P[i]>P[mx]) mx= i;
        }
    }
    switch(n1)
    {
        case 0:     //三個の山が空(コンピュータの勝ち)
            return -1;
        case 1:     //石が残っている山は一個
            if (n2==1)  return 1;   //最後の石(コンピュータの負け)
            P[mx]= 1;               //一個を残して全て取り除く
            flag = 1;
            break;
        case 2:     //石が残っている山は二個
            if (n2==1)
            {   P[w]= 0;            //最後の一個を残す
                flag = 1;
            }
            break;
        case 3:     //石が残っている山は三個 
            if (n2==2)
            {   P[mx]= 1;           //1,1,1 に設定
                flag = 1;
            }
            break;
    }
    if (flag == 1)  return 0;    
    var w = P[1]^P[2]^P[3];
    for(i=1; i<4; i++)
    {   n= P[i]^w;
        if (n<P[i]) break;
    }
    if (i>3 || Math.random()<0.1)   //1割の確率でミスをする
    {   P[mx]--;
        return 0;
    }
    P[i]= n;
    return 0;    
}

[Next Chapter ↓] 三山ゲームβ版
[Previous Chapter ↑] 三山ゲーム-2

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