Віктор Андрійович Шевченко, Виктор Андреевич Шевченко, Victor Andriyovich Shevchenko

Окт 07

Шахматы в 1024 байта

Автор: admin | Категория: Интернет | Опубликовано: 07-10-2012

Доброго времени суток!
Сразу скажу, что я был крайне удивлен, когда нашел этот скрипт:


Это и весь код, работающие шахматы, а учитывая размер кода, работают они весьма и весьма неплохо.

Убедитесь сами:

Вот читабельный вариант кода:

for (B = i = y = u = b = i = 5 - 5, x = 10, I = [], l = []; l[B] = "[email protected]@TSb~?A6J57IKJT576,+-48HLSUmgukgg OJNMLK IDHGFE".charCodeAt(B) - 64, B++ < 120; I[B - 1] = B % x ? B / x % x < 2 | B % x < 2 ? 7 : B / x & 4 ? 0 : l[i++] : 7);

function X(c, h, e, s) {
e ^= 8;
for (var o, S, C, A, R, T, G, n, N = -1e8, O = 20; ++O < 99;) if ((o = I[T = O]) && (G = o ^ e) < 7) {
A = G-- & 2 ? 8 : 4;
C = o - 9 ? l[61 + G] : 49;
do
if (!(R = I[T += l[C]]) && !! G | A < 3 || (R + 1 ^ e) > 9 && G | A > 2) {
if (!(R - 2 & 7)) return 78 - h << x;
n = G | (e ? T > 29 : T < 91) ? o : 6 ^ e;
S = (R && l[R & 7 | 32] - h - G) + (G ? 0 : n - o ? 55 : (A < 2) + 1);
if (c > h || 1 < c & c == h && S > 2) {
I[T] = n;
I[O] = 0;
S -= X(c, h + 1, e, S - N);
if (!(h || c - 1 | B - O | T - b | S < -1e4)) return W(B = 0), e && setTimeout("X(2,0,8),X(1,0,8)", 50);
I[O] = o;
I[T] = R
}
if (S > N || !h & S == N && Math.random() < .5) if (N = S, c > 1) if (h ? s - S < 0 : (B = O, b = T, 0)) return S
}
while (!R & G > 2 || (T = O, (G || A > 2 | (e ? O > 78 : O < 41) & !R) && ++C--A))
}
return N
}
function W() {
i = "

";for (u = 18; u < 98; i += ++u % x - 9 ? "8?W(B=b):X(1,0,0)'style='font-size:50px'bgcolor=#" + (u - B ? u.9 & 1 || 9 : "d") + "0f0e0>&#" + (I[u] ? 9808 + l[67 + I[u]] : 160) + ";" : u++ && "
"); document.body.innerHTML = i + "

"
}
W();

Осмыслить этот код, не смотря на его обьем, было весьма не просто, но по сути ничего сложного здесь нет. Функция W() отображает шахматную доску и фигуры, в этой строке «ECDFBDCEAAAAAAAAIIIIIIIIMKLNJLKM» содержатся  позиции фигур,  далее по всей видимости ходы. Думает на один ход вперед, перебором, использует рандом.

Но как автор уместил графику в таком объеме?
Тут все просто: в юникоде есть специальные шахматные символы, например:
♔♕♖♗♙♚♛♜♝
Шахматная доска — это обычная html таблица, создаваемая циклом, для «графической» части этого вполне достаточно.

Функционал весьма скромен, например нет возможности сделать рокировку. Причина в том, что для этого потребуются дополнительные переменные и дополнительная проверка на движения фигур, что в свою очередь увеличит размер кода.

Замечу, что сложность  не в победе, а в написании столь оптимизированного и малого кода… Кстати это далеко не наименьшая шахматная программа. В далеком 1983 году была выпущена 1K ZX Сhess, занимающая всего 672 байта.

Также весьма интересная шахматная программа microchess:
http://users.telenet.be/kim1-6502/microchess/microchess.html 

Ну и напоследок небольшая модификация шахмат от меня, специально для Чака Норриса:
Шахматы для Чака 

 

Комментарии: (2)

Класная инфа! Хм… можно подобную, только «тетрисную» игру на сайт для пользователей вставить;)

Проиграл! :(

Оставить комментарий