Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Here's the program you're looking for!

Author: Dann Corbit

Date: 15:06:03 10/06/05

Go up one level in this thread


Here is the source:

N = 1;
K = "";
F = px = py = 0;

function sm(i)
{
    if (N > 120)
        return;
    var             j = "abcdefgh";
    if (N & 1) {
        if (N < 19)
            K += " ";
        K += (1 + N >> 1) + ". ";
    } else
        K += "   ";
    if (i.f == 3)
        K += "o-o  ";
    else if (i.f == 5)
        K += "o-o-o";
    else
        K += j.charAt(i.x) + (8 - i.y) + " " + j.charAt(i.X) + (8 - i.Y);
    if (++N & 1)
        K += "\n";
    document.getElementById("m" + Math.floor((N - 2) / 20)).innerHTML = "<pre>"
+ K + "</pre>";
    if (!((N - 1) % 20))
        K = "";
}

function un(u, b)
{
    for (var i = u.x.length - 1; i >= 0; --i)
        Z(b, u.x[i], u.y[i], u.p[i]);
}

function au(u, b, x, y)
{
    u.x.push(x);
    u.y.push(y);
    u.p.push(b[x + y * 8]);
}

function st(x)
{
    document.getElementById("i").innerHTML = x;
}

function P(x, y, X, Y, f)
{
    this.x = x;
    this.y = y;
    this.X = X;
    this.Y = Y;
    this.f = f;
}

function U()
{
    this.x =[];
    this.y =[];
    this.p =[];
}

function em(b, x, y)
{
    return !b[x + y * 8];
}

function ge(b, x, y)
{
    return b[x + y * 8] & 7;
}

function co(b, x, y)
{
    return b[x + y * 8] & 192;
}

function sa(b, x, y, c)
{
    var             i = b[x + y * 8];
    return i && (i & c);
}

function op(b, x, y, c)
{
    var             i = b[x + y * 8];
    return i && !(i & c);
}

function mo(b, x, y)
{
    var             i = b[x + y * 8];
    return i && (i & 32);
}

function la(b, x, y)
{
    var             i = b[x + y * 8];
    return i && (i & 16);
}

function ra(x, y)
{
    return x >= 0 && x < 8 && y >= 0 && y < 8;
}

function di(c)
{
    return c == 64 ? -1 : 1;
}

function Z(b, x, y, p)
{
    b[x + y * 8] = p;
    return b;
}

function t(b, x, y, i, j, c, l)
{
    var             X = x;
    var             Y = y;
    while (ra(X += i, Y += j) && em(b, X, Y))
        l.push(new P(x, y, X, Y, 0));
    if (ra(X, Y) && op(b, X, Y, c))
        l.push(new P(x, y, X, Y, 0));
    return l;
}

function ro(b, x, y, c, l)
{
    t(b, x, y, 1, 0, c, t(b, x, y, -1, 0, c, t(b, x, y, 0, 1, c, t(b, x, y, 0,
-1, c, l))));
}

function bi(b, x, y, c, l)
{
    t(b, x, y, 1, 1, c, t(b, x, y, -1, -1, c, t(b, x, y, 1, -1, c, t(b, x, y,
-1, 1, c, l))));
}

function ki(b, x, y, c, l)
{
    for (var i = -1; i < 2; ++i)
        for (var j = -1; j < 2; ++j) {
            var             X = x + i;
            var             Y = y + j;
            if ((X || Y) && ra(X, Y) && !sa(b, X, Y, c))
                l.push(new P(x, y, X, Y, 0));
        }
    if (!mo(b, x, y))
        if (em(b, 5, y) && em(b, 6, y) && !em(b, 7, y) && !mo(b, 7, y)) {
            var             u = new U();
            au(u, b, x, y);
            Z(b, x, y, 0);
            var             i = fi(b, c ^ 192);
            var             j = 0;
            var             X = -1;
            while (!j && ++X != i.length)
                j = i[X].Y == y && i[X].X == 5;
            if (!j)
                l.push(new P(x, y, 6, y, 3));
            un(u, b);
        } else if (em(b, 3, y) && em(b, 2, y) && em(b, 1, y) && !em(b, 0, y) &&
!mo(b, 0, y)) {
            var             u = new U();
            au(u, b, x, y);
            Z(b, x, y, 0);
            var             i = fi(b, c ^ 192);
            var             j = 0;
            var             X = -1;
            while (!j && ++X != i.length)
                j = i[X].Y == y && i[X].X == 3;
            if (!j)
                l.push(new P(x, y, 2, y, 5));
            un(u, b);
        }
}

function kn(b, x, y, c, l)
{
    for (var i = -2; i < 3; ++i)
        for (var j = -2; j < 3; ++j)
            if (Math.abs(i) + Math.abs(j) == 3) {
                var             X = x + i;
                var             Y = y + j;
                if (ra(X, Y) && !sa(b, X, Y, c))
                    l.push(new P(x, y, X, Y, 0));
            }
}

function pa(b, x, y, c, l)
{
    var             Y = y + di(c);
    var             Z = y + di(c) * 2;
    if (!mo(b, x, y) && em(b, x, Y) && em(b, x, Z))
        l.push(new P(x, y, x, Z, 2));
    if (em(b, x, Y)) {
        if (!Y || Y == 7)
            l.push(new P(x, y, x, Y, 4));
        else
            l.push(new P(x, y, x, Y, 0));
    }
    for (var i = -1; i < 2; i += 2) {
        var             X = x + i;
        if (ra(X, Y)) {
            if (op(b, X, Y, c)) {
                if (!Y || Y == 7)
                    l.push(new P(x, y, X, Y, 4));
                else
                    l.push(new P(x, y, X, Y, 0));
            } else if (em(b, X, Y) && la(b, X, Y - di(c)))
                l.push(new P(x, y, X, Y, 1));
        }
    }
}

function d(b)
{
    for (var y = 0; y < 8; ++y)
        for (var x = 0; x < 8; ++x) {
            var             i = "<img src=\"";
            if (F == 1 && x == px && y == py)
                i += "s";
            i += (x + y & 1) ? "b" : "w";
            if (!em(b, x, y))
                i += (sa(b, x, y, 64) ? "w" : "b") + (ge(b, x, y) & 7);
            document.getElementById("" + x + y).innerHTML = i + ".png\">";
        }
}

function ma(b, m)
{
    u = new U();
    for (var x = 0; x < 8; ++x)
        for (var y = 0; y < 8; ++y)
            if (la(b, x, y)) {
                au(u, b, x, y);
                Z(b, x, y, ge(b, x, y) | co(b, x, y) | mo(b, x, y));
            }
    au(u, b, m.X, m.Y);
    if (m.f == 4)
        Z(b, m.X, m.Y, 37 | co(b, m.x, m.y));
    else
        Z(b, m.X, m.Y, ge(b, m.x, m.y) | co(b, m.x, m.y) | 32 | (m.f == 2 ? 16 :
0));
    au(u, b, m.x, m.y);
    Z(b, m.x, m.y, 0);
    if (m.f == 1) {
        au(u, b, m.X, m.Y - di(c));
        Z(b, m.X, m.Y - di(c), 0);
    } else if (m.f == 3) {
        au(u, b, 5, m.y);
        au(u, b, 7, m.y);
        Z(Z(b, 5, m.y, ge(b, 7, m.y) | co(b, 7, m.y) | 32), 7, m.y, 0);
    } else if (m.f == 5) {
        au(u, b, 3, m.y);
        au(u, b, 0, m.y);
        Z(Z(b, 3, m.y, ge(b, 0, m.y) | co(b, 0, m.y) | 32), 0, m.y, 0);
    }
    return u;
}

function fi(b, c)
{
    var             l =[];
    for (var x = 0; x < 8; ++x)
        for (var y = 0; y < 8; ++y)
            if (sa(b, x, y, c)) {
                var             i = ge(b, x, y);
                if (i == 1)
                    pa(b, x, y, c, l);
                else if (i == 2)
                    kn(b, x, y, c, l);
                else if (i == 3)
                    bi(b, x, y, c, l);
                else if (i == 4)
                    ro(b, x, y, c, l);
                else if (i == 5) {
                    bi(b, x, y, c, l);
                    ro(b, x, y, c, l)
                } else if (i == 6)
                    ki(b, x, y, c, l);
            }
    for (var i = 0; i < l.length / 3; ++i) {
        var             j = Math.floor(Math.random() * l.length);
        var             k = Math.floor(Math.random() * l.length);
        var             x = l[j];
        l[j] = l[k];
        l[k] = x;
    }
    return l;
}
var             Sp =[0, 60, 370, 370, 450, 1000, 5000];
var             Sb =[[0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 0, 0, 4, 3, 2, 4, 6, 12,
12, 12, 4, 6, 4, 4, 7, 18, 25, 25, 16, 7, 4, 6, 11, 18, 27, 27, 16, 11, 6, 10,
15, 24, 32, 32, 24, 15, 10, 10, 15, 24, 32, 32, 24, 15, 10, 0, 0, 0, 0, 0, 0, 0,
0],[-7, -3, 1, 3, 3, 1, -3, -7, 2, 6, 14, 20, 20, 14, 6, 2, 6, 14, 22, 26, 26,
22, 14, 6, 8, 18, 26, 30, 30, 26, 18, 8, 8, 18, 30, 32, 32, 30, 18, 8, 6, 14,
28, 32, 32, 28, 14, 6, 2, 6, 14, 20, 20, 14, 6, 2, -7, -3, 1, 3, 3, 1, -3,
-7],[16, 16, 16, 16, 16, 16, 16, 16, 26, 29, 31, 31, 31, 31, 29, 26, 26, 28, 32,
32, 32, 32, 28, 26, 16, 26, 32, 32, 32, 32, 26, 16, 16, 26, 32, 32, 32, 32, 26,
16, 16, 28, 32, 32, 32, 32, 28, 16, 16, 29, 31, 31, 31, 31, 29, 16, 16, 16, 16,
16, 16, 16, 16, 16],[0, 0, 0, 3, 3, 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0,
0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0, 0,
0, 0, 0, -2, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0],[-2, -2,
-2, 0, 0, -2, -2, -2, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 , 0, 0, 0, 0, 0, 0,
2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0, -2, -2, 0, 0,
0, 0, 0, 0, -2, -2, 0, 0, 0, 0, 0, 0],[3, 3, 8, -12, -8, -12, 10, 5, 0, 0, -5,
-5, -12, -12, -12, -12, -5, -5, -7, -15, -15, -15, -15, -15, -15, -7, -20, -20,
-20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
-20, -20, -20, -20, -20, -2 0, -20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
-20, -20, -20, -20, -20, -20],[]];
for (var x = 0; x < 8; ++x)
    for (var y = 0; y < 8; ++y)
        Sb[6][x + y * 8] = Sb[5][(7 - x) + y * 8];

function sc(b, c)
{
    var             s = 0;
    for (var x = 0; x < 8; ++x)
        for (var y = 0; y < 8; ++y) {
            var             i = ge(b, x, y);
            if (i)
                if (sa(b, x, y, 128))
                    s += Sb[i == 6 ? 6 : i - 1][(7 - x) + y * 8] + Sp[i];
                else
                    s -= Sb[i - 1][x + (7 - y) * 8] + Sp[i];
        }
    return c == 128 ? s : -s;
}

function cpu()
{
    if (F != 2)
        return;
    var             now = new Date();
    var             m = fi(b, c);
    var             bs = -99999;
    var             ws = bs;
    var             bm = 0;
    var             C = c ^ 192;
    var             kx = 0;
    var             ky = 0;
    for (var i = 0; i < m.length; ++i) {
        var             u = ma(b, m[i]);
        if (ge(b, kx, ky) != 6 || sa(b, kx, ky, C)) {
            kx = ky = 0;
            while (ge(b, kx, ky) != 6 || sa(b, kx, ky, C))
                if (++kx == 8) {
                    kx = 0;
                    ++ky;
                }
        }
        var             om = fi(b, C);
        var             obs = -99999;
        var             ows = 99999;
        for (var j = 0; j < om.length; ++j) {
            if (kx == om[j].X && ky == om[j].Y) {
                obs = -99999;
                break;
            }
            var             U = ma(b, om[j]);
            var             r = sc(b, c);
            un(U, b);
            obs = Math.max(obs, r);
            ows = Math.min(ows, r);
            if (r < ws)
                break;
        }
        un(u, b);
        if (obs > bs && ows > ws) {
            bs = obs;
            ws = ows;
            bm = m[i];
        }
    }
    ma(b, bm);
    sm(bm);
    nx();
    st("Move took " + (new Date() - now) / 1000 + " secs");
}
cpw = 0;
cpb = 1;

function pw(e)
{
    cpw = e.checked;
    if (F < 2 && cpw && c == 64) {
        F = 2;
        setTimeout("cpu()", 100);
    }
}

function pb(e)
{
    cpb = e.checked;
    if (F < 2 && cpb && c == 128) {
        F = 2;
        setTimeout("cpu()", 100);
    }
}

function l()
{
    b =[];
    for (i = 0; i < 8; ++i)
        Z(Z(b, i, 6, 65), i, 1, 129);
    d(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(Z(b, 0, 0, 132), 1, 0, 130), 2, 0, 131), 3,
0, 133), 4, 0, 134), 5, 0, 131), 6, 0, 130), 7, 0, 132), 0, 7, 68), 1, 7, 66),
2, 7, 67), 3, 7, 69), 4, 7, 70), 5, 7, 67), 6, 7, 66), 7, 7, 68));
    c = 64;
}

function hu(x, y)
{
    if (F == 0) {
        if (sa(b, x, y, c)) {
            px = x;
            py = y;
            F = 1;
            d(b);
        }
    } else if (F == 1) {
        if (x == px && y == py) {
            F = 0;
            d(b);
            return;
        }
        var             m = fi(b, c);
        for (var i = 0; i < m.length; ++i) {
            if (m[i].x == px && m[i].y == py && m[i].X == x && m[i].Y == y &&
ge(b, x, y) != 6) {
                var             u = ma(b, m[i]);
                var             o = fi(b, c ^ 192);
                for (var j = 0; j < o.length; ++j)
                    if (ge(b, o[j].X, o[j].Y) == 6 && sa(b, o[j].X, o[j].Y, c))
{
                        un(u, b);
                        st("Invalid move");
                        return;
                    }
                sm(m[i]);
                nx();
                return;
            }
        }
        st("Invalid move");
    }
}

function nx()
{
    c ^= 192;
    F = 0;
    d(b);
    for (var x = 0; x < 8; ++x)
        for (var y = 0; y < 8; ++y)
            if (ge(b, x, y) == 6 && sa(b, x, y, c)) {
                var             kx = x;
                var             ky = y;
            }
    var             m = fi(b, c ^ 192);
    var             ic = 0;
    for (var i = 0; i < m.length; ++i)
        if (m[i].X == kx && m[i].Y == ky)
            ic = 1;
    var             m = fi(b, c);
    var             cm = 1;
    for (var i = 0; i < m.length; ++i) {
        var             u = ma(b, m[i]);
        for (var x = 0; x < 8; ++x)
            for (var y = 0; y < 8; ++y)
                if (ge(b, x, y) == 6 && sa(b, x, y, c)) {
                    var             kx = x;
                    var             ky = y;
                }
        var             om = fi(b, c ^ 192);
        un(u, b);
        var             hm = 0;
        for (var j = 0; j < om.length; ++j)
            if (om[j].X == kx && om[j].Y == ky)
                hm = 1;
        cm &= hm;
    }
    if (cm) {
        alert((ic ? "Check" : "Stale") + "mate!");
        F = 3;
        return;
    }
    if ((cpw && c == 64) || (cpb && c == 128)) {
        F = 2;
        setTimeout("cpu()", 500);
    }
}
for (var i = 0; i < 8; ++i) {
    document.write("<img src=\"l.png\">");
    for (var j = 0; j < 8; ++j)
        document.write("<span onclick=\"hu(" + j + "," + i + ")\" id=\"" + j + i
+ "\"><img></span>");
    document.write("<img src=\"r.png\"><br>");
}



This page took 0.02 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.