対戦オセロwebapi その3


概要

対戦オセロwebapiを作ってみる。
人対ai、作ってみた。
ライブラリーは、jquery,tatenoを使う。

写真

サンプルコード


window.onload = function() {
    var coma = 'https://camo.qiitausercontent.com/7873b55118f9bac84a20de35c02770aac1d1f02a/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f31383130342f33656230653537342d643430362d326537342d663238312d3561663132396130353834362e706e67';
    var pl0 = 'anta';
    var pl1 = 'ore';
    var ban = [];
    var flg = 1;
    var game = new Game();
    game.fps(5);
    game.preload([coma]);
    game.start();
    var aLabel = new Label('白 : ' + pl0 + '<br>黒: ' + pl1, 50, 330);
    aLabel.size(20);
    ban = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 2, 1, 1, 1,
        1, 1, 1, 2, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
    var field = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    var suji = [0, 7, 56, 63, 18, 21, 42, 45, 2, 16, 5, 23, 40, 58, 47, 61, 3, 4, 11, 12, 19, 20, 24, 25, 26, 32, 33, 34, 29, 30, 31, 37,
        38, 39, 43, 44, 51, 52, 59, 60, 1, 8, 9, 10, 17, 6, 13, 14, 15, 22, 41, 48, 49, 50, 57, 46, 53, 54, 55, 62];
    function check(put, d) {
        var x = put % 8;
        var y = Math.floor(put / 8);
        var res = 0;
        if (x == 0 && (d == -9 || d == -1 || d ==  7)) res = 1;
        if (x == 7 && (d == -7 || d ==  1 || d ==  9)) res = 1;
        if (y == 0 && (d == -9 || d == -8 || d == -7)) res = 1;
        if (y == 7 && (d ==  7 || d ==  8 || d ==  9)) res = 1;
        return res;
    }
    function sasu(ban) {
        var res;
        var all = 0;
        var iro = 2;
        var turn = 0;
        var dir = Array(-9, 9, -7, 7, -1, 1, -8, 8);
        var i;
        var j;
        var put;
        var count;
        var put1;
        var f1;
        for (j = 0; j < 60; j++)
        {
            put = suji[j];
            if (ban[put] == 1)
            {
                for (i = 0; i < 8; i++)
                {
                    count = 0;
                    if (check(put, dir[i]) == 0)
                    {
                        put1 = put + dir[i];
                        f1 = 0;
                        do
                        {
                            if (ban[put1] == iro)
                            {
                                count++;
                                if (check(put1, dir[i]) == 0)
                                {
                                    put1 += dir[i];
                                }
                                else
                                {
                                    f1 = 1;
                                }
                            }
                            else
                            {
                                f1 = 1;
                            }
                        } while (f1 == 0);
                    }
                    if ((count > 0) && (ban[put1] == turn))
                    {
                        all += count;
                    }
                }
            }
            if (all > 0)
            {
                res = put;
                break;
            }
        }
        return res;
    }
    function oku(put, iro) {
        var res = 0;
        var turn = 0;
        if (iro == 0) turn = 2;
        var dir = new Array(-9, -8, -7, -1, 1, 7, 8, 9);
        var tugi;
        var i;
        var count;
        if (ban[put] == 1)
        {
            for (i = 0; i < 8; i++)
            {
                count = 0;
                tugi = put;
                do
                {
                    if (check(tugi, dir[i]) == 1) break;
                    count++;
                    tugi += dir[i];
                }
                while (ban[tugi] == turn);
                if ((count > 1) && (ban[tugi] == iro))
                {
                    res = -1;
                    tugi = put;
                    do
                    {
                        ban[tugi] = iro;
                        tugi += dir[i];
                    }
                    while (ban[tugi] == turn);
                }
            }
        }
        return res;
    }
    function test(n) {
        var put;
        var res;
        if (flg > 0)
        {
            put = n;
            res = oku(put, 2);
            if (res == -1)
            {
                put = sasu(ban);
                res = oku(put, 0);
                var end = -1;
                for (var i = 0; i < 64; i++)
                {
                    field[i].frame(ban[i]);
                    if (ban[i] == 1) end = 0;
                }
                if (end == -1) alert("game over");
            }
        }
    }
    for (var i = 0; i < 64; i++)
    {
        field[i] = new Sprite(40, 40, coma, 4, 1);
        field[i].frame(ban[i]);
        field[i].x((i % 8) * 40);
        field[i].y(Math.floor(i / 8) * 40);
        field[i].jq.click(function() {
            var n = this.id;
            n = n.replace("tsGameNode", "");
            n = n - 2;
            test(n);
        });
    }
};



成果物

以上。