Карта сайта  Главная

Просмотр шахматной партии

Содержание

Ошибки и ловушки:
Партии:

 

Запись шахматной партии

При записи партии используются обозначения K, Q, R, B и N соответственно для короля, ферзя, ладьи, слона и коня.
Употребляются буквы английского алфавита.
Правила записи партии (на примерах):

Описание ошибок и ловушек

  1. Ошибка черных в Испанской партии (1).
  2. Ошибка черных в Испанской партии (2).
  3. Ловушка черных в Испанской партии (1).
    То же после 5. d4 e5xd4 6. Nxd4 Nxd4
  4. Ловушка черных в Испанской партии (2). (5. Nxf7).
  5. Ловушка черных в Испанской партии (3). (та же, но 5. Bxf7+).
    Более упорно за белых. В результате у белых лишняя пешка, но черных атака.
  6. Ошибка черных в Ферзевом гамбите.
  7. Ловушка белых в Ферзевом гамбите (1).
  8. Ловушка черных в Ферзевом гамбите (2).
  9. Ловушка черных в Ферзевом гамбите (3).
  10. Ловушка черных в Ферзевом гамбите (4).
  11. Ловушка черных в Ферзевом гамбите (5).
  12. Ловушка черных в Итальянской партии. (5. Nxf7).
    Не применять в серьезных партиях, поскольку после 4. Nxd4! у черных большие проблемы.
  13. Ловушка черных в Итальянской партии (та же, но 5. Bxf7+).
    Более упорно за белых, но черные должны выигрывать.
  14. Ошибка белых в Итальянской партии.
    После 7. d3 Ng4 нужно играть 8. h3…
  15. Ловушка черных в Сицилианской защите.
    После 5. e5!? Qa5+! белые теряют пешку e5.
  16. Ловушка белых в Сицилианской защите.
    После 5. Qa4+! черные теряют коня.
  17. Ошибка белых в староиндийской защите (1).
    После 7. Bd3? Ng4! Черные должны вигрывать.
  18. Ошибка белых в староиндийской защите (2).
    После 8. Nge2? … следует играть 8. d5 …
  19. Ловушка белых в защите Каро-Канн.
  20. Ошибка черных в защите Филидора. Мат Легаля. (4. Nc3 g6)
  21. Ошибка черных в защите Филидора. Мат Легаля (4. Nc3 Nc6)

Описание партий

  1. Эмануил Ласкер — Йоганн Бауэр. 1889. Жертва 2-х слонов.
    Ласкер жертвует обоих слонов и четко реализует выгоды возникшей позиции (Амстердам, 1889).
  2. Lichess — Chess-samara. Русская. Ошибка черных в дебюте.
    Компьютерная программа Lichess побеждает в Русской партии компьютерную программу Chess-samara.
    Отличительная особенность Chess-samara — это нелюбовь к рокировкам.
  3. Виктор. Корчной — Гарри. Каспаров. 1982.
    Каспаров побеждает, активно атакуя и пользуясь ошибками соперника (Люцерн, шахматная олимпиада, 1982).
  4. Chess-samara — Любитель. Дебют 4-х коней.
    Любитель, действуя в стиле компьютерной программы Chess-samara, добивается ничьей.
  5. Deep Blue — Гарри Каспаров. 1997. Защита Каро-Канн.
    Компьютер, реализуя имеющийся в его памяти вариант, жертвует коня за пешку (8. Nxe6 Qe7?) и, пользуясь ошибкой Каспарова, добивается победы.
  6. Борис Спасский — Давид Бронштейн. 1960. Королевский гамбит.
    Борис Спасский, десятый чемпион мира, обыгрывал в королевском гамбите Юрий Авербаха, Роберта Джеймс Фишера, Ратмира Холмова, Лайош Портиша, Ясер Сейравана, Сюзан Полгар и прочих шахматистов. При этом ни разу не проиграл, хотя иногда оказывался на грани поражения.
  7. Борис Спасский — Роберт Фишер. Финальный матч на титул победителя, 1970. Защита Грюнфельда. Классический вариант D86. 1-0.
    До 1972 Спасский достаточно уверенно переигрывал Фишера.
  8. Роберт Фишер — Борис Спасский. 1972. 6-я партия.
    Матч за звание чемпиона мира по шахматам 1972 года между Борисом Спасским и Робертом Фишером состоялся в столице Исландии Рейкьявике.
    Фишер, начав в шестой партии c4, застал Спасского врасплох и добился убедительной победы.
  9. Борис Спасский — Роберт Фишер. Матч Чемпионата мира, 1972. Сицилийская защита: Найдорф. Вариант "Отравленной пешки".
    Спасский показывает, что есть еще порох в пороховницах.
  10. Бент Ларсен – Борис Спасский. Белград, "Матч века", 1970. Английское начало A01.
    Спасский не замедлил воспользоваться вычурныеми ходами Ларсена.
  11. Борис Спасский — Роберт Фишер. Мар-дель-Плата. 1960. Королевский гамбит С39.
    Ошибки Фишера (23. ...Qg4?, 26. ...Rf8?) позволили Спасскому собрать фигуры в центре. Черные сдались ввиду неминуемой гибели слона e7.
  12. Борис Спасский – Тигран Петросян. Москва, матч на первенство мира 1969. Сицилианская защита B94.
    Петросян в тот момент отставал в счете, поэтому искал осложнений, и нашел…
  13. Д. Бронштейн — П. Дубинин. Ленинград 1947. Королевский гамбит.
    Давид Бронштейн обыгрывал в гамбите Ласло Сабо, Михаила Таля, Игоря Зайцева, Ратмира Холмова, Хесуса Ногейраса, Виталия Цешковского и Артура Юсупова. А в начале 90-х ему порой удавалось выигрывать после 1. е4 е5 2.  f4 у тогдашних первых компьютерных программ.
  14. Алексей Фёдоров - Йоосе Норри. 1997. Королевский гамбит C30.
    Белорусский и финский шахматисты.

Программа просмотра партии

В программе, выполняющей просмотр шахматной партии, реализуется следующая схема:

  1. Из раскрывающегося списка выбирается партия.
  2. Формируется массив arrF, отображающий начальное расположение фигур. Формируется начальная картинка шахматной доски.
  3. Отображается список ходов выбранной партии.
  4. Для каждого хода

Код, обеспечивающий эту последовательность действий:

tbl = "";
lbl = "";
clrCurrent = 'b';
moveCount = 0;
gameIsOver = false;
timerId = 0;
buttonFirst = "";
buttonPlay = "";
buttonNext = "";
buttonPrev = "";
buttonLast = "";
selGame = "";
gameId = 0;
fillInCB = true;
// Массив шахматных партий
arrGm = new Array(
"1. f4 d5 2. e3 Nf6 3. b3 e6 4. Bb2 Be7 5. Bd3 b6 6. Nf3 Bb7 7. Nc3 Nbd7 8. O-O O-O 9. Ne2 c5 10. Ng3 Qc7 11. Ne5 Nxe5 12. Bxe5 Qc6 13. Qe2 a6 14. Nh5! Nxh5 15. Bxh7+! Kxh7 16. Qxh5+ Kg8 17. Bxg7!! Kxg7 18. Qg4+ Kh7 19. Rf3 e5 20. Rh3+ Qh6 21. Rxh6+ Kxh6 22. Qd7! Bf6 23. Qxb7 Kg7 24. Rf1 Rab8 25. Qd7 Rfd8 26. Qg4+ Kf8 27. fxe5 Bg7 28. e6 Rb7 29. Qg6 f6 30. Rxf6+ Bxf6 31. Qxf6+ Ke8 32. Qh8+ Ke7 33. Qg7+ Kxe6 34. Qxb7 Rd6 35. Qxa6 d4 36. exd4 cxd4 37. h4 d3 38. Qxd3 1-0",
"1. e4 e5 2. Nf3 Nf6 3. Nxe5 Qe7 4. d4 d6 5. Nf3 Nxe4 6. Be2 g6 7. O-O Nd7 8. Bd3 f5 9. Re1 Ndf6 10. Bg5 Be6 11. Bxe4 fxe4 12. Rxe4 d5 13. Re3 Kf7 14. c4 c6 15. Qe2 Re8 16. Nc3 h6 17. Re1 Kg7 18. Bxf6+ Qxf6 19. cxd5 cxd5 20. Rxe6 Qxe6 21. Qxe6 Rxe6 22. Rxe6 Kf7 23. Re3 Bg7 24. Ne5+ Bxe5 25. Rxe5 Re8 26. Rxe8 Kxe8 27. Kf1 Ke7 28. Nxd5+ Ke6 29. Ne3 b5 30. b4 Kd6 31. Ke2 Kd7 32. Kf3 Ke6 33. Ke4 Ke7 34. h4 Kf8 35. Kd5 Ke7 36. Kc6 Kd8 37. d5 Kc8 38. Ng4 h5 39. Nh6 Kd8 40. d6 a5 41. bxa5 Ke8 42. a6 Kf8 43. a7 Kg7 44. a8Q b4 45. Kd5 b3 46. Qg8+ Kf6 47. Qf7# 1-0",
"1. d4 Nf6 2. c4 g6 3. g3 Bg7 4. Bg2 c5 5. d5 d6 6. Nc3 O-O 7. Nf3 e6 8. O-O exd5 9. cxd5 a6 10. a4 Re8 11. Nd2 Nbd7 12. h3 Rb8 13. Nc4 Ne5 14. Na3 Nh5 15. e4 Rf8 16. Kh2 f5 17. f4 b5! 18. axb5 axb5 19. Naxb5 fxe4 20. Bxe4 Bd7 21. Qe2 Qb6 22. Na3 Rbe8 23. Bd2 Qxb2 24. fxe5? Bxe5 25. Nc4 Nxg3 26. Rxf8+ Rxf8 27. Qe1 Nxe4+ 28. Kg2 Qc2 29. Nxe5 Rf2+? 30. Qxf2 Nxf2 31. Ra2 Qf5 32. Nxd7 Nd3 33. Bh6? Qxd7 34. Ra8+ Kf7 35. Rh8 Kf6 36. Kf3 Qxh3+ 37. 0-1",
"1. e4 e5 2. Nc3 Nc6 3. Nf3 Nf6 4. d4 exd4 5. Nxd4 Bb4 6. Nxc6 bxc6 7. Bd3 d5 8. exd5 cxd5 9. Kf1 Kf8 10. h4 h5 11. Bf4 c6 12. Qf3 c5 13. Be5 Ng4 14. Bf4 Nf6 15. Be5 Ng4 16. Bf4 1/2-1/2",
"1. e4 c6 2. d4 d5 3. Nc3 dxe4 4. Nxe4 Nd7 5. Ng5 Ngf6 6. Bd3 e6 7. Ngf3 h6? 8. Nxe6 Qe7? 9. O-O fxe6 10. Bg6+ Kd8 11. Bf4 b5? 12. a4 Bb7 13. Re1 Nd5? 14. Bg3 Kc8 15. axb5 cxb5 16. Qd3 Bc6 17. Bf5 exf5 18. Rxe7 Bxe7 19. c4 1-0",
"1. e4 e5 2. f4 exf4 3. Nf3 d5 4. exd5 Bd6 5. Nc3 Ne7 6. d4 O-O 7. Bd3 Nd7 8. O-O h6 9. Ne4 Nxd5 10. c4 Ne3 11. Bxe3 fxe3 12. c5 Be7 13. Bc2 Re8 14. Qd3 e2 15. Nd6 Nf8 16. Nxf7 exf1Q 17. Rxf1 Bf5 18. Qxf5 Qd7 19. Qf4 Bf6 20. Nfe5 Qe7 21. Bb3 Bxe5 22. Nxe5+ Kh7 23. Qe4 1-0",
"1. d4 Nf6 2. c4 g6 3. Nc3 d5 4. cxd5 Nxd5 5. e4 Nxc3 6. bxc3 Bg7 7. Bc4 c5 8. Ne2 Nc6 9. Be3 O-O 10. O-O Qc7 11. Rc1 Rd8 12. h3 b6 13. f4 e6 14. Qe1 Na5 15. Bd3 f5 16. g4 fxe4 17. Bxe4 Bb7 18. Ng3 Nc4 19. Bxb7 Qxb7 20. Bf2 Qc6 21. Qe2 cxd4 22. cxd4 b5 23. Ne4 Bxd4 24. Ng5 Bxf2 25. Rxf2 Rd6 26. Re1 Qb6 27. Ne4 Rd4 28. Nf6+ Kh8 29. Qxe6 Rd6 30. Qe4 Rf8 31. g5 Rd2 32. Ref1 Qc7 33. Rxd2 Nxd2 34. Qd4 Rd8 35. Nd5+ Kg8 36. Rf2 Nc4 37. Re2 Rd6 38. Re8+ Kf7 39. Rf8 1-0",
"1. c4 e6 2. Nf3 d5 3. d4 Nf6 4. Nc3 Be7 5. Bg5 O-O 6. e3 h6 7. Bh4 b6 8. cxd5 Nxd5 9. Bxe7 Qxe7 10. Nxd5 exd5 11. Rc1 Be6 12. Qa4 c5 13. Qa3 Rc8 14. Bb5?! a6?! 15. dxc5 bxc5 16. O-O Ra7 17. Be2 Nd7 18. Nd4 Qf8 19. Nxe6 fxe6 20. e4 d4 21. f4 Qe7 22. e5 Rb8 23. Bc4 Kh8 24. Qh3 Nf8 25. b3 a5 26. f5 exf5 27. Rxf5 Nh7 28. Rcf1 Qd8 29. Qg3 Re7 30. h4 Rbb7 31. e6 Rbc7 32. Qe5 Qe8 33. a4 Qd8 34. R1f2 Qe8 35. R2f3 Qd8 36. Bd3 Qe8 37. Qe4 Nf6 38. Rxf6! gxf6 39. Rxf6 Kg8 40. Bc4 Kh8 41. Qf4 1-0",
"1. e4 c5 2. Nf3 d6 3. d4 cxd4 4. Nxd4 Nf6 5. Nc3 a6 6. Bg5 e6 7. f4 Qb6 8. Qd2 Qxb2 9. Nb3 Qa3 10. Bxf6 gxf6 11. Be2 h5 12. O-O Nc6 13. Kh1 Bd7 14. Nb1 Qb4 15. Qe3 d5 16. exd5 Ne7 17. c4 Nf5 18. Qd3 h4 19. Bg4 Nd6 20. N1d2 f5 21. a3 Qb6 22. c5 Qb5 23. Qc3 fxg4 24. a4 h3 25. axb5 hxg2+ 26. Kxg2 Rh3 27. Qf6 Nf5 28. c6 Bc8 29. dxe6 fxe6 30. Rfe1 Be7 31. Rxe6 1-0",
"1. e4 e5 2. f4 exf4 3. Nf3 g5 4. h4 g4 5. Ne5 h5 6. Bc4 Rh7 7. d4 Bh6? 8. Nc3 Nc6 9. Nxf7! Rxf7 10. Bxf7+ Kxf7 11. Bxf4! Bxf4 12. O-O Qxh4 13. Rxf4+ Kg7 14. Qd2 d6 15. Raf1 Nd8 16. Nd5 Bd7 17. e5 dxe5 18. dxe5 Bc6 19. e6! Bxd5 20. Rf7+! Nxf7 21. Rxf7+ Kh8 22. Qc3+ Nf6 23. Rxf6 Qxf6 24. Qxf6+ Kh7 25. Qf5+ Kh6 26. Qxd5 Kg6 27. Qd7 1-0",
"1. b3 e5 2. Bb2 Nc6 3. c4 Nf6 4. Nf3 e4 5. Nd4 Bc5 6. Nxc6 dxc6 7. e3 Bf5 8. Qc2 Qe7 9. Be2 O-O-O 10. f4? Ng4! 11. g3 h5 12. h3 h4! 13. hxg4 hxg3 14. Rg1 Rh1 15. Rxh1 g2 16. Rf1 Qh4+ 17. Kd1 gxf1Q+ 18. 0-1",
"1.e4 e5 2.f4 exf4 3.Nf3 g5 4.h4 g4 5.Ne5 Nf6 6.d4 d6 7.Nd3 Nxe4 8.Bxf4 Bg7 9.Nc3 Nxc3 10.bxc3 c5! 11.Be2 cxd4 12.0–0 Nc6 13.Bxg4 0–0 14.Bxc8 Rxc8 15.Qg4 f5 16.Qg3 dxc3 17.Rae1 Kh8 18.Kh1!? Rg8 19.Bxd6 Bf8! 20.Be5+ Nxe5 21.Qxe5+ Rg7! 22.Rxf5 Qxh4+ 23.Kg1 Qg4? 24.Rf2 Be7 25.Re4! Qg5 26.Qd4! Rf8? 27.Re5! Rd8 28.Qe4 Qh4 29.Rf4 1-0",
"1.e4 c5 2.Nf3 d6 3.d4 cxd4 4.Nxd4 Nf6 5.Nc3 a6 6.Bg5 Nbd7 7.Bc4 Qa5 8.Qd2 h6?! 9.Bxf6 Nxf6 10.0–0–0 e6 11.Rhe1 Be7 12.f4 0–0 13.Bb3 Re8 14.Kb1 Bf8 15.g4! Nxg4 16.Qg2 Nf6 17.Rg1 Bd7 18.f5 Kh8 19.Rdf1 Qd8 20.fxe6 fxe6 21.e5! dxe5 22.Ne4 Nh5 23.Qg6! exd4 24.Ng5! 1-0",
"1. e4 e5 2. f4 Bc5 3. Nf3 d6 4. Nc3 Nf6 5. Bc4 Nc6 6. d3 Be6 7. Bb5 a6 8. B:c6+ bc6 9. f5 Bd7 10. Qe2 Qb8 11. Nd1 Qb5 12. c3 a5 13. Be3 Bc8 14. O-O Ba6 15. c4 Qb6 16. Kh1 B:e3 17. N:e3 Nd7 18. g4 f6 19. g5 O-O-O 20. Rg1 Nc5 21. gf6 gf6 22. Rg7 d5 23. ed5 Rhe8 24. Rd1 e4 25. de4 N:e4 26. Nd4 cd5 27. Ne6 d4 28. Nd5 R:d5 29. Q:e4 B:c4 30. Rc1 B:a2 31. N:c7! 1-0"
);
// Расположение фигур на шахматной доске
arrF = new Array(8);
arrF[0] = new Array(8);
arrF[1] = new Array(8);
arrF[2] = new Array(8);
arrF[3] = new Array(8);
arrF[4] = new Array(8);
arrF[5] = new Array(8);
arrF[6] = new Array(8);
arrF[7] = new Array(8);
// A B C D E F G H
// 1 2 3 4 5 6 7 8
// Коды шахматных фигур
KW = '&#9812';
KB = '♚';
QW = '♕';
QB = '♛';
RW = '♖';
RB = '♜';
BW = '♗';
BB = '♝';
NW = '♘';
NB = '♞';
PW = '♙';
PB = '♟';
function mkTblFftngs(tSz)
{
 bgClr = "f0f0f0";
 bgClr = "#c0c0c0"; // Серый
 bgClr2 = "#008080"; // Сине-зеленый
 d = document;
 d.write("<table id = 'tbl' bgColor = '#ccccaa' cellspacing = '0' align = 'center'>");
 for (i = 0; i < 8; i++)
 {
  d.write("<tr>");
  for (j = 0; j < 8; j++)
  {
   if ((i + j) % 2 == 0)
    td = "<td bgcolor = " + bgClr + " width = " + tSz + " height = " + tSz + "></td>";
   else
    td = "<td bgcolor = " + bgClr2 + " width = " + tSz + " height = " + tSz + "></td>";
   d.write(td);
  }
  d.write("</tr>");
 }
 d.write("</table>");
}
// Init
function initArrF()
{
 arrF[0][0] = RB;
 arrF[0][1] = NB;
 arrF[0][2] = BB;
 arrF[0][3] = QB;
 arrF[0][4] = KB;
 arrF[0][5] = BB;
 arrF[0][6] = NB;
 arrF[0][7] = RB;
 for (k = 0; k < 8; k++) {arrF[1][k] = PB};
 for (k = 0; k < 8; k++) {arrF[6][k] = PW};
 arrF[7][0] = RW;
 arrF[7][1] = NW;
 arrF[7][2] = BW;
 arrF[7][3] = QW;
 arrF[7][4] = KW;
 arrF[7][5] = BW;
 arrF[7][6] = NW;
 arrF[7][7] = RW;
 for (i = 2; i < 6; i++)
  for (j = 0; j < 8; j++) arrF[i][j] = '';
}
function fllN()
{
 initArrF();
 if (fillInCB) fillInChessBoard();
 // Fill in game text
 gm2 = arrGm[gameId];
 vl = "";
 for (k = 2; k < 500; k++)
 {
  p = gm2.indexOf(k + ".");
  if (p == -1) {
   gm2 = gm2.replace('.', '. ');
   // Меняем 2 пробела на один
   gm2 = gm2.replace(' ' + ' ', ' ');
   vl += (gm2 + '\n');
   break;
  }
  m = gm2.substr(0, p - 1);
  m = m.replace('.', '. ');
// Меняем 2 пробела на один
  m = m.replace(' ' + ' ', ' ');
  m = m.replace(/–/g, '-');
  vl += (m + '\n');
  gm2 = gm2.substr(p);
 }
 document.getElementById("txtr").value = vl;
 // Treat elements and global vars
 clearInterval(timerId);
 buttonFirst.disabled = true;
 buttonPlay.disabled = false;
 buttonNext.disabled = false;
 buttonPrev.disabled = true;
 buttonLast.disabled = false;
 lbl.innerHTML = '';
 clrCurrent = 'b';
 moveCount = 0;
 gameIsOver = false;
}
// Pawn
function moveP(pp, clr, i, j)
{
 b = pp.indexOf('x');
 if (b == -1) b = pp.indexOf(':');
 pb0 = pp[0];
 pb1 = pp[1];
 if (b == -1 && pb0 >= 'a' && pb0 <= 'h' && pb1 >= 'a' && pb1 <= 'h') b = 0;
 j0 = (b == -1) ? j : pb0.charCodeAt(0) - 97;
 if(i == 7 || i == 0)
  f07 = (b == -1) ? pp[2] : ((b == 0) ? pp[3] : pp[4]); // a8Q or ef1Q or exf1Q for example
 else
  f07 = '';
 if (clr == 'w')
 {
  fwb = PW;
  qwb = QW;
  rwb = RW;
  bwb = BW;
  nwb = NW;
  i0 = i + 1;
  if (b == -1) if (arrF[i0][j0] == "") i0++;
 }
 else
 {
  fwb = PB;
  qwb = QB;
  rwb = RB;
  bwb = BB;
  nwb = NB;
  i0 = i - 1;
  if (b == -1) if (arrF[i0][j0] == "") i0--;
 }
 if (f07 == 'Q')
  fwb = qwb;
 else if (f07 == 'R')
  fwb = rwb;
 else if (f07 == 'B')
  fwb = bwb;
 else if (f07 == 'N')
  fwb = nwb;
 makeChange(fwb, i, j, i0, j0);
}
// Knight
function moveN(pp, clr, i, j)
{
 fwb = (clr == 'w') ? NW : NB;
 iB = i - 1;
 iU = i + 1;
 iBB = i - 2;
 iUU = i + 2;
 jL = j - 1;
 jR = j + 1;
 jLL = j - 2;
 jRR = j + 2;
 arrI0 = new Array(2);
 arrJ0 = new Array(2);
 ni = -1;
 if (iB >= 0 && jLL >= 0)
  if (arrF[iB][jLL] == fwb)
  {
   ni++;
   arrI0[ni] = iB; arrJ0[ni] = jLL;
  }
 if (iB >= 0 && jRR < 8)
  if (arrF[iB][jRR] == fwb)
  {
   ni++;
   arrI0[ni] = iB; arrJ0[ni] = jRR;
  }
 if (iU < 8 && jLL >= 0)
  if (arrF[iU][jLL] == fwb)
  {
   ni++;
   arrI0[ni] = iU; arrJ0[ni] = jLL;
  }
 if (iU < 8 && jRR < 8)
  if (arrF[iU][jRR] == fwb)
  {
   ni++;
   arrI0[ni] = iU; arrJ0[ni] = jRR;
  }
 if (iUU < 8 && jL >= 0)
  if (arrF[iUU][jL] == fwb)
  {
   ni++;
   arrI0[ni] = iUU; arrJ0[ni] = jL;
  }
 if (iUU < 8 && jR < 8)
  if (arrF[iUU][jR] == fwb)
  {
   ni++;
   arrI0[ni] = iUU; arrJ0[ni] = jR;
  }
 if (iBB >= 0 && jL >= 0)
  if (arrF[iBB][jL] == fwb)
  {
   ni++;
   arrI0[ni] = iBB; arrJ0[ni] = jL;
  }
 if (iBB >= 0 && jR < 8)
  if (arrF[iBB][jR] == fwb)
  {
   ni++;
   arrI0[ni] = iBB; arrJ0[ni] = jR;
  }
 if (ni == 0)
 {
  i0 = arrI0[0]; j0 = arrJ0[0];
 }
 else // pp.length == 4; Nbd7 for example (k0 = 1) or N1d2
 {
  i0 = -1;
  j0 = -1;
  if (pp[1] > '8')
   j0 = pp.charCodeAt(1) - 97;
  else
   i0 = 7 - (pp.charCodeAt(1) - 49);
  for (ii = 0; ii <= ni; ii++)
  {
   i01 = arrI0[ii];
   j01 = arrJ0[ii];
   if (i01 == i0)
    {
     j0 = j01;
     break;
    }
   else
    if (j01 == j0)
    {
     i0 = i01;
     break;
    }
  }
 }
 makeChange(fwb, i, j, i0, j0);
}
// Queen
function moveQ(clr, i, j)
{
 fwb = (clr == 'w') ? QW : QB;
 for (ip = 0; ip < 8; ip++)
  for (jp = 0; jp < 8; jp++)
   if (arrF[ip][jp] == fwb)
   {
    i0 = ip;
    j0 = jp;
    break;
   }
 makeChange(fwb, i, j, i0, j0);
}
// Finds Rook on I
function findRI(i, j, ni, arrRI)
{
 if (ni < 0) return -1;
 for (ii = 0; ii <= ni; ii++)
 {
  i01 = arrRI[ii];
  if(i01 == i + 1 || i01 == i - 1) return i01;
  if (i01 > i)
  {
   for (ip = i + 1; ip < i01; ip++) if (arrF[ip][j].length > 0) arrRI[ii] = -1;
  }
  else
  {
   for (ip = i01 + 1; ip < i; ip++) if (arrF[ip][j].length > 0) arrRI[ii] = -1;
  }
 }
 for (ii = 0; ii <= ni; ii++) if (arrRI[ii] >= 0) return arrRI[ii];
 return -1;
}
// Finds Rook on J
function findRJ(i, j, nj, arrRJ)
{
 if (nj < 0) return -1;
 for (jj = 0; jj <= nj; jj++)
 {
  j01 = arrRJ[jj];
  if(j01 == j + 1 || j01 == j - 1) return j01;
  if (j01 > j)
  {
   for (jp = j + 1; jp < j01; jp++)
    if (arrF[i][jp].length > 0) arrRJ[jj] = -1;
  }
  else
  {
   for (jp = j01 + 1; jp < j; jp++)
    if (arrF[i][jp].length > 0) arrRJ[jj] = -1;
  }
 }
 for (jj = 0; jj <= nj; jj++) if (arrRJ[jj] >= 0) return arrRJ[jj];
 return -1;
}
// Rook
function moveR(pp, clr, i, j)
{
 fwb = (clr == 'w') ? RW : RB;
 i0 = -1;
 j0 = -1;
 if (pp.length == 4) // Rfe8 for example (k0 = 5) or R4e8
 {
  if (pp[1] > '8')
   j0 = pp.charCodeAt(1) - 97;
  else
   i0 = 7 - (pp.charCodeAt(1) - 49);
 }
 arrRI = new Array(2);
 arrRJ = new Array(2);
 ni = -1;
 nj = -1;
 for (ip = 0; ip < 8; ip++)
  if (arrF[ip][j] == fwb)
  {
   ni++;
   arrRI[ni] = ip;
  }
 for (jp = 0; jp < 8; jp++)
  if (arrF[i][jp] == fwb)
  {
   nj++;
   arrRJ[nj] = jp;
  }
 i01 = -1;
 j01 = -1;
 if (i0 >= 0)
 {
  for (jp = 0; jp < 8; jp++)
   if (arrF[i0][jp] == fwb)
   {
     j0 = jp;
     break;
   }
 }
 else if (j0 >= 0)
 {
  for (ip = 0; ip < 8; ip++)
   if (arrF[ip][j0] == fwb)
   {
     i0 = ip;
     break;
   }
 }
 else
 {
  i01 = findRI(i, j, ni, arrRI);
  j01 = findRJ(i, j, nj, arrRJ);
  if (i01 >= 0)
  {
   i0 = i01;
   j0 = j;
  }
  else
  {
   i0 = i;
   j0 = j01;
  }
 }
 makeChange(fwb, i, j, i0, j0);
}
// Bishop
function moveB(clr, i, j)
{
 fwb = (clr == 'w') ? BW : BB;
 r = (i + j) % 2;
 for (ip = 0; ip < 8; ip++)
  for (jp = 0; jp < 8; jp++)
   if (arrF[ip][jp] == fwb && (ip + jp) % 2 == r)
   {
    i0 = ip;
    j0 = jp;
    break;
   }
 makeChange(fwb, i, j, i0, j0);
}
// King
function moveK(clr, i, j)
{
 fwb = (clr == 'w') ? KW : KB;
 iB = i - 1;
 iU = i + 1;
 jL = j - 1;
 jR = j + 1;
 i0 = -1;
 if (iB >= 0 && jL >= 0)
  if (arrF[iB][jL] == fwb)
  {
   i0 = iB; j0 = jL;
  }
 if (i0 == -1 && iB >= 0 && jR < 8)
  if (arrF[iB][jR] == fwb)
  {
   i0 = iB; j0 = jR;
  }
 if (i0 == -1 && iU < 8 && jR < 8)
  if (arrF[iU][jR] == fwb)
  {
   i0 = iU; j0 = jR;
  }
 if (i0 == -1 && iU < 8)
  if (arrF[iU][j] == fwb)
  {
   i0 = iU; j0 = j;
  }
 if (i0 == -1 && iU < 8 && jL >= 0)
  if (arrF[iU][jL] == fwb)
  {
   i0 = iU; j0 = jL;
  }
 if (i0 == -1 && iB >= 0)
  if (arrF[iB][j] == fwb)
  {
   i0 = iB; j0 = j;
  }
 if (i0 == -1 && iU < 8)
  if (arrF[iU][j] == fwb)
  {
   i0 = iU; j0 = j;
  }
 if (i0 == -1 && jR < 8)
  if (arrF[i][jR] == fwb)
  {
   i0 = i; j0 = jR;
  }
 if (i0 == -1 && jL >= 0)
  if (arrF[i][jL] == fwb)
  {
   i0 = i; j0 = jL;
  }
 makeChange(fwb, i, j, i0, j0);
}
// Castling
function oo(clr, d)
{
 j0K = 4;
 i0 = (clr == 'w') ? 7 : 0;
 if (d == 2) // Short castling
 {
  jK = 6;
  jR = 5;
  j0R = 7;
 }
 else
 {
  jK = 2;
  jR = 3;
  j0R = 0;
 }
 fK = arrF[i0][j0K];
 fR = arrF[i0][j0R];
 makeChange(fK, i0, jK, i0, j0K);
 makeChange(fR, i0, jR, i0, j0R);
}
function makeChange(fwb, i, j, i0, j0)
{
 arrF[i][j] = fwb;
 arrF[i0][j0] = "";
}
function oneMove(f, pp, clr)
{
 // i, j - новая позиция фигуры
 // i0, j0 - прежняя позиция фигуры (нужно найти)
 d = pp.length - 1; // End pos
 pd3 = pp.substring(0, 3);
 if (pd3 == "O-O" || pd3 == "0-0") // Рокировка
 {
  f = 'O';
  // Меняем все нули на латинскую букву O
  pp = pp.replace(/0/g, 'O');
  d = (pp.substring(0, 5) == "O-O-O") ? 4 : 2;
 }
 else
 {
  cd = pp[d].charCodeAt(0);
  while ((cd < 49 || cd > 56) && d > 0)
  {
   if (f != 'p') pp = pp.substring(0, d); // Pawn may turn to Q, R, B, N or +, #, !, ?
   d--;
   cd = pp[d].charCodeAt(0); // ++ Double check or !! or +?
  }
  i = 7 - (pp[d].charCodeAt(0) - 49);
  j = pp[d - 1].charCodeAt(0) - 97;
 }
 switch (f) {
 case 'p':
  moveP(pp, clr, i, j); break;
 case 'n':
  moveN(pp, clr, i, j); break;
 case 'q':
  moveQ(clr, i, j); break;
 case 'r':
  moveR(pp, clr, i, j); break;
 case 'b':
  moveB(clr, i, j); break;
 case 'k':
  moveK(clr, i, j); break;
 default:
  oo(clr, d); // Рокировка
 }
}
function seeIfEndGame(pwb, before)
{
 if (before)
 {
  if (pwb == "1-0")
  {
   lbl.innerHTML = lbl.innerHTML + ". White win";
   gameIsOver = true;
  }
  if (pwb == "0-1")
  {
   lbl.innerHTML = lbl.innerHTML + ". Black win";
   gameIsOver = true;
  }
  if (pwb == "1/2-1/2" || pwb == "1/2")
  {
   lbl.innerHTML = lbl.innerHTML + ". Draw";
   gameIsOver = true;
  }
 }
 else // After move
 {
  if (pwb.indexOf("#") > 0)
  {
   lbl.innerHTML = lbl.innerHTML + ". Checkmate";
   gameIsOver = true;
  }
 }
 if (gameIsOver)
 {
  buttonPlay.disabled = true;
  buttonNext.disabled = true;
  buttonLast.disabled = true;
 }
}
function fillInGame()
{
 selGame = document.getElementById('selGame');
 gameId = selGame.value - 1;
 fllN();
}
// Возвращает в нижнем регистре имя фигуры p, q, k, r, b or n
function findF(c1)
{
 cd = c1.charCodeAt(0);
 return (cd >= 97 && cd <= 104) ? 'p' : c1.toLowerCase();
}
function fillInChessBoard()
{
 for (i = 0; i < 8; i++)
 {
  rw = tbl.rows[i];
  for (j = 0; j < 8; j++) rw.cells[j].innerHTML = arrF[i][j];
 }
}
// Один ход белых или черных
function next()
{
 if (gameIsOver) return;
 clrCurrent = (clrCurrent == 'b') ? 'w' : 'b';
 if (clrCurrent == 'w')
 {
   if (moveCount == 0)
   {
    gm2 = document.getElementById("txtr").value;
    buttonFirst.disabled = false;
    buttonPrev.disabled = false;
    buttonPlay.disabled = true;
   }
   moveCount++;
 }
 pNew = gm2.indexOf('\n');
 m = (pNew == -1) ? gm2 : gm2.substr(0, pNew);
 s = m.trim().split(" ");
 if (s.length == 2)
 {
  seeIfEndGame(s[1], true);
  if (gameIsOver) return;
 }
 else if (s.length != 3)
 {
  gameIsOver = true;
  lbl.innerHTML = "Think how to win";
  return;
 }
 pwb = (clrCurrent == 'w') ? s[1] : s[2];
 if (pwb.length < 2)
 {
  gameIsOver = true;
  lbl.innerHTML = "Think how to win";
  return;
 }
 if (fillInCB) lbl.innerHTML = s[0] + ((clrCurrent == 'w') ? ' ' : ' ...') + pwb;
 // fwb - chess piece name: P, K, Q, R, B or N in lower case
 fwb = findF(pwb[0]);
 if (fwb != 'p')
 {
  px = pwb.indexOf('x');
  if (px >= 0) pwb = pwb.replace('x', '');
  px = pwb.indexOf(':');
  if (px >= 0) pwb = pwb.replace(':', '');
 }
 seeIfEndGame(pwb, true);
 if (gameIsOver) return;
 // One move 'w' or 'b'
 oneMove(fwb, pwb, clrCurrent);
 // Fill in chess board from arrF
 if (fillInCB) fillInChessBoard();
 seeIfEndGame(pwb, false);
 if (clrCurrent == 'b') gm2 = gm2.substr(pNew + 1);
}
function play()
{
 if (gameIsOver) return;
 buttonNext.disabled = true;
 timerId = setInterval(next, 1000);
 if (gameIsOver) clearInterval(timerId);
}
function prev()
{
 moveToGo = moveCount - ((clrCurrent == 'w') ? 2 : 1);
 clrLast = clrCurrent;
 if (moveToGo < 0)
 {
  fillInCB = true;
  fllN();
  buttonPrev.disabled = true;
 }
 else if (moveToGo == 0)
 {
  fillInCB = false;
  fllN();
  if (clrLast == 'w') next();
  fillInCB = true;
  next();
 }
 else
 {
  fillInCB = false;
  fllN();
  for (im = 0; im < moveToGo; im++)
  {
   next();
   next();
  }
  if (clrLast == 'w') next();
  fillInCB = true;
  next();
 }
}
function doWhenEnd()
{
 next();
 if (gameIsOver)
 {
  buttonLast.disabled = true;
  fillInCB = true;
  fillInChessBoard();
  lblTxt = lbl.innerHTML;
  lblTxt = lblTxt.replace(". ", "");
  lbl.innerHTML = lblTxt;
 }
}
function last()
{
 fillInCB = false;
 fllN();
 for (im = 0; im < 500; im++)
 {
  doWhenEnd()
  if (gameIsOver) return;
 }
}

Рейтинг@Mail.ru