Консультация № 180304
13.10.2010, 05:19
0.00 руб.
0 51 1
Здравствуйте дорогие эксперты!

Помогите пожалуйста с курсовым проэктом.
Мне необходимо сделать игру "МАТ 2 ФИГУРАМИ"
Тоисть надо чтобы на шахматной доске(каждый квадратие это елемент Timage) играли 2 фигуры и вражеский король.

Основная рутина по движку уже продумана, но никак не могу продумать систему проверки, которая бы проверяла после каждого совершонного хода мат ли королю.....

Помогите процедуркой или советом....просто уже голова кипит от 10.000 строчек кода!

Обсуждение

Неизвестный
15.10.2010, 11:44
общий
за самое короткое число ходов из возможных)
давно
Академик
320937
2216
15.10.2010, 12:04
общий
Юдин Евгений Сергеевич:
Доброе утро! В этом случае речь идет о написании шахматной программы, т.е. из сферы искусственного интеллекта, что к вопросу 180304 не имеет никакого отношения. Можно, конечно, сочинить некоторые алгоритмы, например, мат двумя ладьями, используя правила. Не факт, что число ходов будет оптимальным.

Может быть, есть смысл ограничить вопрос проверкой позиций и правильности ходов. Тогда все решаемо.
Неизвестный
16.10.2010, 23:10
общий
Ну у меня преподаватель сказал тему так...написать курсовой проект "Мат 2 фигурами", Пользователь должен за кратчайшее число ходов поставить мат королю используя только 2 фигуры на выбор.

Вот так.

Я думаю надо как то ограничиться тем , что в статистике будет написано

Код:
"Результаты игр:
1)К-Ф:=число ходов использованных, fio
2)---///---///----///----//---/////-----"


Вот...если игрок выбрал К-ф(тоисть короля и ферзя) и при этом в новой игре поставил мат королю за меньшее чем в предыдущей игре с такими фигурами, то его считать Чемпионом и в статистике показывать его имя...

И еще вот вопросик....работал я с Tdrawgrid....неплохо, но я так и не понял как загружать нужны картинки в любую из ячеек этой таблицы...устанавливал Acol и Arow нужными числами, но толку от этого ничего... да и читал что этот елемент работает с канвой, что мне не оч нравится.... потому как много минусов....хотелось бы такой компонент, в котором есть настройки цвета ячейки(тобишь цвет поля черный или белый как в шахматах) и возможность подгрузить картинку(битовую или jpeg нет разницы)....и еще чтобы было возможно отслеживать это все...

Если кто может и имеет на все это свое мнение то расскажите мне его в плане того, что как вы видите выполнение курсового проекта....какие компоненты лучше интерактивная работа с пользователем(выбор фигур,координат и прочего)....

давно
Академик
320937
2216
16.10.2010, 23:15
общий
Юдин Евгений Сергеевич:
Добрый вечер! Я могу поработать с проверками и массивами, может быть, сделать некоторые замечания по коду, скажем, к среде. Что касается графики - увы, пас. Выложите, пожалуйста, последнюю работающую версию (если она изменилась)
давно
Мастер-Эксперт
17387
18346
17.10.2010, 08:57
общий
Юдин Евгений Сергеевич:
Как я понял, в матовании неприятельского короля участвуют только две фигуры. Второго короля на доске нет. Как в этом случае при составлении программы Вы учитывали то обстоятельство, что мат двумя лёгкими фигурами поставить невозможно? Лёгкие фигуры - это слон и конь. Невозможно поставить мат также ферзём и лёгкой фигурой, ладьёй и лёгкой фигурой.

Короче говоря, Ваша задача сводится к постановке мата двумя тяжёлыми фигурами. К ним относятся ферзь и ладья. Это значительно упрощает программу.

И ещё. В Правилах игры в шахматы существют ограничения на число ходов без взятия, на повторения ходов. Вы это учитываете?
Об авторе:
Facta loquuntur.
давно
Мастер-Эксперт
17387
18346
17.10.2010, 09:01
общий
Юдин Евгений Сергеевич:
Если же второй участвующей в матовании фигурой является король, то мат возможен только при наличии на доске ферзя или ладьи...
Об авторе:
Facta loquuntur.
Неизвестный
18.10.2010, 21:21
общий
Цитата: lamed
Юдин Евгений Сергеевич:
Добрый вечер! Я могу поработать с проверками и массивами, может быть, сделать некоторые замечания по коду, скажем, к среде. Что касается графики - увы, пас. Выложите, пожалуйста, последнюю работающую версию (если она изменилась)


Версия не поменялась...завтра займусь этим и выложу сюда же новую версию...Среда тажа а замечания вот небольшие есть... надо как то продумать компонент движения картинок по полю ..... может использовать другие компоненты...жду идей....

Цитата: Гордиенко Андрей Владимирович
Невозможно поставить мат также ферзём и лёгкой фигурой, ладьёй и лёгкой фигурой.


Ферзь и любуя другая фигура(защищающая ферзя) ставит мат если король в углу а ферзья защищенный рядом....

Цитата: Гордиенко Андрей Владимирович
И ещё. В Правилах игры в шахматы существют ограничения на число ходов без взятия, на повторения ходов. Вы это учитываете?

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

Цитата: Гордиенко Андрей Владимирович
Если же второй участвующей в матовании фигурой является король, то мат возможен только при наличии на доске ферзя или ладьи...

вы совершенно правы....

Цитата: Гордиенко Андрей Владимирович
Короче говоря, Ваша задача сводится к постановке мата двумя тяжёлыми фигурами. К ним относятся ферзь и ладья. Это значительно упрощает программу.

шутник)))
давно
Академик
320937
2216
18.10.2010, 22:15
общий
Юдин Евгений Сергеевич:
Евгений Сергеевич, добрый вечер!
1.По поводу возможных комбинаций построения мата двумя фигурами - Вы так сильно не переживайте
а.Кр+Ф, Кр+Л, Кр+п
б.Ф+Ф, Ф+Л, Ф+С, Ф+К, Ф+п
в.Л+Л, Л+К, Л+п
г.С+п
д.К+п
е.п+п
Ничего не забыл?

2. По поводу корректировки кода - речь идет лишь о подсказке, как улучшения качество кода.
3. Если же есть желание получить полноценный курсовой проект - welcome to Решебник.
PS. Преподаватель, который обязан по долгу службы Вас консультировать, что сказал по поводу графики?

давно
Мастер-Эксперт
17387
18346
18.10.2010, 22:30
общий
Юдин Евгений Сергеевич:
Про мат ферзём и легкой фигурой я указал неверно, а вот про мат ладьёй и лёгкой фигурой Вы зря игнорируете. Ладья матует или удерживает только по горизонтали или вертикали. Лёгкая фигура может матовать только по диагоналям (слон) или полям, по цвету противоположным тем, на которых она сама находилась за ход до матования (конь). Поэтому у неприятельского короля всегда найдётся одно свободное поле, даже если он находится в углу.

И про ограничения на число ходов следует подумать...

А вообще, смотрите сами.
Об авторе:
Facta loquuntur.
давно
Мастер-Эксперт
17387
18346
18.10.2010, 22:33
общий
lamed:
Для матования короля двумя фигурами не нужно и 50 ходов, если мат возможен.
Об авторе:
Facta loquuntur.
давно
Мастер-Эксперт
17387
18346
19.10.2010, 11:01
общий
Доброе утро!

Согласен, что

В этом случае, кажется, остаются варианты
Кр+Ф, Кр+Л, Кр+п;
Ф+Ф, Ф+Л, Ф+С, Ф+К, Ф+п;
Л+Л;
А также некоторые ситуации, если пешка "проходит в ферзи", то есть несколько удалена от короля слабейшей стороны:
Л+п, С+п, К+п, п+п


Пусть принимает решение теперь сам автор вопроса.

С уважением.
Об авторе:
Facta loquuntur.
Неизвестный
19.10.2010, 12:48
общий
Цитата: lamed
Если же есть желание получить полноценный курсовой проект - welcome to Решебник

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

Цитата: lamed
1.По поводу возможных комбинаций построения мата двумя фигурами - Вы так сильно не переживайте
а.Кр+Ф, Кр+Л, Кр+п
б.Ф+Ф, Ф+Л, Ф+С, Ф+К, Ф+п
в.Л+Л, Л+К, Л+п
г.С+п
д.К+п
е.п+п
Ничего не забыл?

Все комбинации описаны в моем модуле....единственное там лишь 1 ошибка, что король и пешка могут ставить мат
Цитата: lamed
PS. Преподаватель, который обязан по долгу службы Вас консультировать, что сказал по поводу графики?

В четверг первая встреча по этому поводу...но было указание писать на любом языке и используя любые известные примочки достойные студента.

Цитата: Гордиенко Андрей Владимирович
Для матования короля двумя фигурами не нужно и 50 ходов, если мат возможен.

Все зависит от расположения фигур.....





Я так думаю что надо не обьявляя шах(промежуточный) королю поставить ему мат.....это упростит задачу с интелектом....ненадо будет двигать короля в свободные от шаха ячейки

Просто у многих проекты оч легкие...а я, наверное, то что описал в задаче имел ввиду оценку преподавателя "ОТЛИЧНО с 5 плюсами"


давно
Академик
320937
2216
19.10.2010, 12:58
общий
Юдин Евгений Сергеевич:
Пока давайте ссылку на последнюю рабочую версию сюда, посмотрим, что можно улучшить
Неизвестный
19.10.2010, 19:42
общий
Ссылка на изменившийся курсовой проект вот тут эксперты я кое что доработал и немного продумал....может будет полезно....как считаете*?
давно
Академик
320937
2216
19.10.2010, 19:43
общий
Юдин Евгений Сергеевич:
А пароль, однако?
Неизвестный
19.10.2010, 19:44
общий
ах да вот пароль.... случайно поставил
password: Курсовойпроектна19.10.2010
Неизвестный
19.10.2010, 19:45
общий
перепутал описания и пароль поля...основные изменения в модуле game(основном)
давно
Академик
320937
2216
19.10.2010, 19:54
общий
Юдин Евгений Сергеевич:
Так там ошибки есть. Не транслируется. Точка с запятой перед else, например
Код:
procedure TForm1.Image1Click(Sender: TObject);
begin
if status=true then
begin
if flag=false then
begin
flag:=true;
end;
else
begin

end;
end;
end;

Неизвестный
19.10.2010, 20:37
общий
так...... это процедура не была дописана по причине того что не продуман сам интелект перемещения игры......я так примерно как видите начал его писать но остановился на том, что как распознать фигуру и потом её переместить.....вот...может у вас есть идеи.....ну я думаю надо через массив....
давно
Академик
320937
2216
19.10.2010, 20:46
общий
Юдин Евгений Сергеевич:
Точку с запятой убираю, транслируется. Работаем :)
Неизвестный
19.10.2010, 21:28
общий
Слежу за новостями))
давно
Академик
320937
2216
22.10.2010, 15:43
общий
Юдин Евгений Сергеевич:
Примерный план такой.
1. Отвлекаемся временно от графики.
2.Ход вводится текстом по правилам: e2-e4 или Кре1-е2 или h7-h8Ф
3.Ходы храним в массиве (списке)
4. Каждое поле представляет собой структуру
- Фигура (Название, цвет) или пусто
- Число ударов белых
- Число ударов черных
5. Последнюю позицию храним в глобальном массиве полей.
6. Храним флаги:
6.1. Возможность рокировки
6.2. Возможность взятия на "проходе"
6.3. Троекратное повторение позиции неясно, игнорируем.
7. Список пар, с которыми мат теоретически возможен, храним в файле
8. Функция, анализирующая корректность хода (поле1, поле2, фигура)->код ошибки
Возможно, что-то поменяется.

ABC
Код:
program chess;

const
White = 0;
Black = 1;
type
TColor = White..Black;
TFigure = record
(* King, 'K'; Queen, 'Q'; Rook, 'R'; Bishop, 'B'; Knight, 'N'; Pawn, 'P'; *)
name: char;
color: TColor;
end;
TCell = record
h, v : integer;
figure : TFigure;
strikes: integer;
end;
TBoard = array[1..8, 1..8] of TCell;
const
NAMES = ['к', 'ф', 'л', 'ь', 'с', 'п'];
HORIZ = [1..8];
VERT = ['a'..'h'];
RECREATES = ['ф', 'л', 'к', 'с'];
var
r,c: integer;
smove: string;

function ValidBoardSyntax(sboard: string): boolean;
// кh6,лf6;кh8
var
sfig: string[3];
white, black: string;
c:char;
p: integer;
vbs: boolean;
begin
p:=pos(';', sboard);
if p=0 then
vbs := false;
//
// ToDo
//
ValidBoardSyntax := vbs;
end; { ValidBoardSyntax }

function ValidMoveSyntax(smove: string): boolean;
// Проверка синтаксиса хода и элементарные проверки
// 1.начальное поле <> конечному
// 2.превращение пешки в допустимую фигуру
// пe7-e8ф
// кe2-e3
begin
ValidMoveSyntax :=
((smove[1] in names) and (smove[2] in VERT) and
(ord(smove[3])-ord('0') in HORIZ) and (smove[4] ='-') and
(smove[5] in VERT) and (ord(smove[6])-ord('0') in HORIZ) and
((smove[2]<>smove[5]) or (smove[3]<>smove[6])) and
((length(smove)=6) or
(length(smove)=7) and (smove[1]='п') and (smove[7] in RECREATES)));
end; { ValidMoveSyntax }

function ValidBoard: boolean;
begin
//
// ToDo
//
ValidBoard := true;
end; { ValidBoard }

function ValidMove: boolean;
begin
//
// ToDo
//
ValidMove := true;
end; { ValidMove }

begin { main }
write('Ход белых ');
readln(smove);
if ValidMoveSyntax(smove) then
writeln('true')
else
writeln('false');

{ write('Ход черных ');
readln(move);
if ValidSyntax(move) then
writeln('true')
else
writeln('false');
validate(move);
}
end.

Неизвестный
25.10.2010, 16:10
общий
Так....я посмотрел код....как я понял этот код делает проверку "возможен ли ход введенный с кллавиатуры" так?и если возможен то перемещение фигуры( из ячейки в ячейку так?
Если я правильно понял конечно....
тогда думаю надо добавить тут функцию проверка "мат ли королю" и запускать её после каждого верного хода.
Цитата: lamed
7. Список пар, с которыми мат теоретически возможен, храним в файле

Это тоисть описывание всех всевозможных комбинаций мата в фаиле так?

План примерно ясен и работа проделана хорошо....в эту процедуру("передвижения фигуры") добавить еще одну искусственно написанную, которая все отображает на поле статистики("ну каждый ход строчкой записывается ") ну и "счет ходов" с обычным счетчиком I.

Какой дальше план? Привязка все к графике?
давно
Академик
320937
2216
25.10.2010, 17:14
общий
Юдин Евгений Сергеевич:
День добрый! Код удже переделываю, завтра поздно вечером выложу. Тогда сразу отвечу на вопросы.
Неизвестный
25.10.2010, 17:55
общий
Ок!...буду ждать!
давно
Академик
320937
2216
25.10.2010, 18:10
общий
Юдин Евгений Сергеевич:
1. По графике не специалист. Единственное, что могу сказать - у нас хранится массив полей, и про каждое поле известно, какая фигура на этом поле. Наверно, надо найти картинки с пустыми полями, и картинки с полями с фигурами.
Если, допустим, конь с g1 пошел на f3, надо поменять две картинки: на g1 положить изображение пустого поля, на f3 - картинку поля с конем.
2. Показать можно будет отдельно текстовые наработки и графические
3. Проверка "мат ли королю" состоит из двух проверок:
= Шах ли королю
= Есть ли у короля возможности
- побить атакующую фигуру (или отступить);
- закрыться.
Поскольку мы рассматриваем ситуацию с одиноким королем, вторая возможность не рассматривается. Таким образом, мат - это шах + отсутствие свободных полей, несколькими постами раньше уже это обсуждали :)
4. Протокол, скорей всего, будем хранить в массиве и "сбрасывать" в файл.
Неизвестный
26.10.2010, 02:43
общий
Цитата: lamed
1. По графике не специалист. Единственное, что могу сказать - у нас хранится массив полей, и про каждое поле известно, какая фигура на этом поле. Наверно, надо найти картинки с пустыми полями, и картинки с полями с фигурами.
Если, допустим, конь с g1 пошел на f3, надо поменять две картинки: на g1 положить изображение пустого поля, на f3 - картинку поля с конем.

С вопросом по графике обащусь в решебник...но только после подготовки кода для дизайнеров

Цитата: lamed
2. Показать можно будет отдельно текстовые наработки и графические


Да...надо с текстовыми закончить и я найду специалиста в нашем университете который оценит и скажет что и как....

Цитата: lamed
4. Протокол, скорей всего, будем хранить в массиве и "сбрасывать" в файл.


Самое последнее дело....
давно
Академик
320937
2216
26.10.2010, 18:21
общий
это ответ
Здравствуйте, Евгений Сергеевич!
Сколько уже не сделано! А сколько еще предстоит не сделать..

Считаю целесообразным, прежде чем переходить к графике, отработать алгоритм. Часть реализована (* довольно упрощенно *) в коде.
Если Вы примете этот путь, Вам будет необходимо доработать/разработать
1. проверку "На одной диагонали"
2. проверку "на соседних клетках" (для короля)
3. проверку для пешки
4. проверку на шах. Для этого в цикле по каждой белой фигуре после хода белых проверяется возможность хода на поле черного короля
5. проверку на пат
6. проверку на мат, как "сумму" проверок на шах и пат

Присылайте свои доработки, целесообразно будет создать новую консультацию.
Удачи!
Код:
(*
а.Кр+Ф, Кр+Л, Кр+п
б.Ф+Ф, Ф+Л, Ф+С, Ф+К, Ф+п
в.Л+Л, Л+К, Л+п
г.С+п
д.К+п
е.п+п
*)

program chess;

const
WHITE = 0;
BLACK = 1;
type
TColor = WHITE..BLACK;
TFigure = record
(* King, 'K'; Queen, 'Q'; Rook, 'R'; Bishop, 'B'; Knight, 'N'; Pawn, 'P'; *)
id: integer;
name: char;
color: TColor;
h,v: integer;
deleted: boolean;
end;
TCell = record
h, v : integer;
id : integer;
end;
TBoard = array[1..8, 1..8] of integer;
const
MAXFIG = 50;
NAMES = ['к', 'ф', 'л', 'ь', 'с', 'п'];
HORIZ = [1..8];
VERT = ['a'..'h'];
RECREATES = ['ф', 'л', 'к', 'с'];
var
r,c: integer;
smove: string;
figs: array[1..50] of TFigure;
MaxId: integer;
board: TBoard;
KingCheck: boolean; // шах королю
MoveNo: integer; // номер хода

function ValidMoveSyntax(smove: string): boolean;
// Проверка синтаксиса хода и элементарные проверки
// 1.начальное поле <> конечному
// 2.превращение пешки в допустимую фигуру
// пe7-e8ф
// кe2-e3
begin
ValidMoveSyntax :=
((smove[1] in names) and (smove[2] in VERT) and
(ord(smove[3])-ord('0') in HORIZ) and (smove[4] ='-') and
(smove[5] in VERT) and (ord(smove[6])-ord('0') in HORIZ) and
((smove[2]<>smove[5]) or (smove[3]<>smove[6])) and
((length(smove)=6) or
(length(smove)=7) and (smove[1]='п') and (smove[7] in RECREATES)));
end; { ValidMoveSyntax }

function ValidMove(c1,c2: TCell): boolean;
// Не анализируем превращение, рокировку
//
function CheckH(c1,c2: TCell): boolean;
var
i: integer;
begin

if c1.h <> c2.h then
CheckH := false
else
begin
for i:= c1.v+1 to c2.v-1 do
if board[c1.h,i]<>0 then
exit;
CheckH := true;
end;
end; { CheckH }

function CheckV(c1,c2: TCell): boolean;
var
i: integer;
begin

if c1.v <> c2.v then
CheckV := false
else
begin
for i:= c1.h+1 to c2.h-1 do
if board[i, c1.v]<>0 then
exit;
CheckV := true;
end;
end; { CheckV }

function CheckG(c1,c2: TCell): boolean;
begin
CheckG := abs((c1.h-c2.h)*(c1.v-c2.v))=2;
end; { CheckG }

function CheckD(c1,c2: TCell): boolean;
//
// Внимание! Только диагонали, параллельные главной
//
var
i: integer;
cells : integer;
v1, h1: integer;
begin
CheckD := false;
cells := c1.v+c1.h-1;
if c1.v+c1.h=c2.v+c2.h then
begin
begin
if c1.h>c2.h then
begin
v1:=c1.v;
h1:=c1.h;
end
else
begin
v1:=c2.v;
h1:=c2.h;
end;
for i:= 2 to cells-1 do
begin
if board[i, c1.v]<>0 then
exit;
dec(h1);
inc(v1);
end
end;
CheckD := true;
end;
end; { CheckD }

var
fig1, fig2: TFigure;
i, j: integer;
CanCheck: boolean;
b1, b2: integer;
begin
b1:= board[c1.h, c1.v];
b2:= board[c2.h, c2.v];

ValidMove := false;
CanCheck := false;

if b1=0 then
exit;
fig1:= figs[b1];

if b2 <> 0 then begin
fig2:= figs[b2];
if fig1.color=fig2.color then
exit;

/// а вот здесь недоработка
/// проверять придется после любого хода белых
/// и любого хода черных
/// пример.
/// Белые. Крf6, Фa1;
/// Черные. Крh8
/// 1.Крf6-g6+! ("Вскрытый" шах)
///
if fig2.name='к' then
CanCheck := true;
end;

if
(fig1.name='к') { ToDo } or
(fig1.name='ф') and (CheckH(c1,c2) or CheckV(c1, c2) or CheckD(c1,c2)) or
(fig1.name='л') and (CheckH(c1,c2) or CheckV(c1, c2)) or
(fig1.name='ь') and CheckG(c1,c2) or
(fig1.name='с') and CheckD(c1,c2) or
(fig1.name='п') { ToDo }
then
begin
ValidMove := true;
if CanCheck then
KingCheck := true;
end;
end; { ValidMove }

procedure init;
var
i,j: integer;
begin
KingCheck := false;
MaxId := 0;
for i:= 1 to 8 do
for j:= 1 to 8 do
board[i,j] := 0;
MoveNo := 0;
end; { init }

procedure GetFigures(c: TColor);
// считывание позиций фигур одной стороны
var
s: string;
h,v: integer;
begin
repeat
write('->');
readln(s);
if trim(s)<>'' then
begin
h := ord(s[3])-ord('0');
v := ord(s[2])-ord('a')+1;
if board[h,v]=0 then
begin
inc(MaxId);
figs[MaxId].name := s[1];
figs[MaxId].color:= c;
figs[MaxId].h:= h;
figs[MaxId].v:= v;
figs[MaxId].deleted := false;
board[h,v]:=MaxId;
end
else
writeln('Ошибка: поле занято');
end;
until trim(s)='';
end; { GetFigure }

procedure PrintPos;
var
sw, sb: string; // позиция белых и черных
ds: string;
i: integer;
begin
sw:= 'Белые : ';
sb:= 'Черные: ';
for i:= 1 to MaxId do
begin
ds := figs[i].name+chr(ord('a')+figs[i].v-1)+chr(ord('0')+figs[i].h);
if figs[i].color=WHITE then
sw := sw+ds+' '
else
sb := sb+ds+' ';
end;
sw:=sw+';';
sb:=sb+'.';
writeln(sw);
writeln(sb);
end; { PrintPos }

procedure StrToMove(sMove: string; var c1: TCell; var c2: TCell);
begin
c1.v := ord(sMove[2])-ord('a')+1;
c1.h := ord(sMove[3])-ord('0');

c2.v := ord(sMove[5])-ord('a')+1;
c2.h := ord(sMove[6])-ord('0');
end; { StrToMove }

procedure ChangeBoard(c1, c2: TCell);
var
b1, b2: integer;
begin
b1:= board[c1.h, c1.v];
b2:= board[c2.h, c2.v];

if b2 <> 0 then
figs[b2].deleted := true;
figs[b1].h := c2.h;
figs[b1].v := c2.v;
board[c2.h,c2.v] := b1;
board[c1.h,c1.v] := 0;
end; { ChangeBoard }

procedure PrintBoard;
var
h, v: integer;
begin
for h:= 8 downto 1 do begin
for v:= 1 to 8 do
write(board[h,v],' ');
writeln;
end;
writeln('================');
end; { PrintBoard }

var
h,v: integer;
sWhiteMove, sBlackMove: string;
cc1, cc2: TCell;
cc3, cc4: TCell;
done: boolean;
begin { main }

init;
// Вводим позицию и заполняем массивы:
// доску и фигуры
//
writeln('Введите позицию белых фигур, пробел для завершения');
GetFigures(WHITE);

writeln('Введите позицию черных фигур, пробел для завершения');
GetFigures(BLACK);

// Эхо-печать
PrintPos;
PrintBoard;

// Вводим ходы
writeln('Вводите ходы, пробел для завершения');
repeat
inc(MoveNo);
write(MoveNo, '.');
readln(sWhiteMove);
sWhiteMove := trim(sWhiteMove);

if sWhiteMove='' then
begin
writeln('Партия прервана на ', MoveNo, ' ходу ');
exit;
end;

if not ValidMoveSyntax(sWhiteMove) then
begin
writeln('Ошибка в записи ', MoveNo, ' хода белых');
dec(MoveNo);
break;
end;

StrToMove(sWhiteMove, cc1, cc2);
if not ValidMove(cc1, cc2) then
begin
writeln('Ход ', sWhiteMove, ' невозможен');
dec(MoveNo);
break;
end;

ChangeBoard(cc1, cc2);
// Если все удачно, меняем позицию на доске
// Меняем список фигур
PrintPos;
PrintBoard;

write(MoveNo, '....');
done := false;
while not done do
begin
readln(sBlackMove);

if not ValidMoveSyntax(sBlackMove) then
begin
writeln('Ошибка в записи ', MoveNo, ' хода черных');
write(MoveNo, '....');
readln(sBlackMove);
end
else
begin
StrToMove(sBlackMove, cc3, cc4);
if not ValidMove(cc3,cc4) then
writeln('Ход черных ', sBlackMove, ' невозможен');
end;
done := true;
end;

ChangeBoard(cc3,cc4);
PrintPos;
PrintBoard;
// Если все удачно, меняем позицию на доске
// Меняем список фигур
until sWhiteMove='';
writeln('Спасибо за игру!');

end.

Пример диалога
Код:
Введите позицию белых фигур, пробел для завершения
->кh6
->лf6
->
Введите позицию черных фигур, пробел для завершения
->кh8
->
Белые : кh6 лf6 ;
Черные: кh8 .
0 0 0 0 0 0 0 3
0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 1
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
================
Вводите ходы, пробел для завершения
1.лf6-f5
6=5
Белые : кh6 лf5 ;
Черные: кh8 .
0 0 0 0 0 0 0 3
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 2 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
================
1....кh8-g8
Белые : кh6 лf5 ;
Черные: кg8 .
0 0 0 0 0 0 3 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 2 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
================
2.лf5-f6
5=6
Белые : кh6 лf6 ;
Черные: кg8 .
0 0 0 0 0 0 3 0
0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 1
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
================
2....кg8-h8
Белые : кh6 лf6 ;
Черные: кh8 .
0 0 0 0 0 0 0 3
0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 1
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
================
3.
Партия прервана на 3 ходу


Неизвестный
24.11.2010, 21:57
общий
Цитата: lamed
Рассмотрим, например, позицию. Белые: Крh6, п.f7. Черные: Крh8. Ход белых 1.f7-f8ФX! :)


не знаю как но короли в класических шахматах не имеют право встречаться..а пешка не может прямо бить...даже если и походят кудато то максимум будет пат только!
давно
Академик
320937
2216
28.11.2010, 19:22
общий
Не совсем понял, к чему относится Ваш пост, где здесь встреча королей и прямой бой пешки, но, так как мы в какой-то мере коллеги, попробую объяснить, как можно было бы получить эту позицию.

Пусть Белые: Крh6, п.f6. Черные: Крg8.
Первый ход белых 1.f6-f7+?. Конечно, черные могут и съесть пешку, но мы-то с Вами говорим только о возможности поставить мат. Поэтому Черный король отступает в угол
1...Крg8-h8??. К слову сказать, "на флажке" в турнирах и не такие чудеса встречаются.
Итак, черный король ушел в угол, подставился
2.f7-f8ФX. Превращение в ферзя и мат. Кстати, необязательно ферзь. С таким же успехом можно бы сыграть f7-f8ЛX
Форма ответа