Консультация № 70874
14.01.2007, 14:24
0.00 руб.
0 1 1
Двумерный массив 8x8 представляет собой шахматную дос-
ку: 0 - пустое поле, положительные числа - белые фигуры (1 -
король, 2 - королева, 3 - тура, 4 - офицер, 5 - конь, 6 - пеш-
ка), отрицательные числа - черные фигуры (-1 - король и т.д.).

Требуется вычислить оценку позиции следующим образом. За белую королеву дается 90 очков, туру - 50, короля, офицера и коня - 30, пешку - 10.
Кроме того, за каждое свободное поле (или занятое фигурой
противника), на которое может пойти (ударить) данная фигура,
добавляется в 10 раз меньшее количество очков. Например, за
каждого белого коня каждое пустое поле, находящееся под его
ударом, приносит 3 очка.
За каждую черную фигуру дается такое же по модулю отрица-
тельное число. Все эти очки суммируются.

Обсуждение

Неизвестный
18.01.2007, 11:01
общий
это ответ
Здравствуйте, X-Whisper!
В приложении примерная реализация. Там нет действий при обнаружении коня и пешки (думаю, там придется делать без циклов и всего прочего - просто проверять нужные ячейки), нет черных фигур (нужно в case‘ах добавить модуль т.е. не case figure of а case abs(figure) of. Но думаю, идею Вы поняли, и дополните решение до полноценного. Если что-то не будет получаться или не разберетесь в коде - пишите во внутреннюю почту.

Приложение:
program Project2;var a: array[1..8, 1..8] of integer = ((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, 1, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0), (0, 0, 0, 0, 0, 0, 0, 0)); i, j, score: integer;procedure found(i, j, figure: integer); procedure f1(i, j, figure: integer); {король} var k, m, b: integer; begin b := 0; repeat b := b + 1; k := i; m := j; case b of 1: begin dec(k); dec(m); end; 2: begin dec(k); end; 3: begin dec(k); inc(m); end; 4: begin inc(m); end; 5: begin inc(k); inc(m); end; 6: begin inc(k); end; 7: begin inc(k); dec(m); end; 8: begin dec(m); end; else exit; end; if (a[k, m] = 0) then score := score + 10 else if a[k, m] * figure < 0 then {если знаки разные} score := score + 10; until b >= 8; end; procedure f234(i, j, figure: integer); var k, m, b, f, d: integer; begin case figure of 2: begin b := 0; d := 1; end; {все направления} 3: begin b := 0; d := 2; end; {вверх-вниз, вправо-влево} 4: begin b := -1; d := 2; end; {по диагоналям} end; repeat b := b + d; {d - шаг, для ладьи и офицера он равен 2} f := 0; k := i; m := j; repeat case b of {направление по час. стрелке начиная с верхней левой диагонали} 1: begin dec(k); dec(m); end; 2: begin dec(k); end; 3: begin dec(k); inc(m); end; 4: begin inc(m); end; 5: begin inc(k); inc(m); end; 6: begin inc(k); end; 7: begin inc(k); dec(m); end; 8: begin dec(m); end; else exit; end; if (a[k, m] = 0) then begin if f = 0 then score := score + 10 end else if f = 0 then begin f := 1; if a[k, m] * figure < 0 then {если знаки разные} score := score + 10; end; until not ((k > 1) and (m > 1) and (k < 8) and (m < 8)); until b >= 8; end;begin case figure of {вызод процедуры в зависимости от фигуры} 1: begin f1(i, j, 1); end; 2: begin f234(i, j, 2); end; 3: begin f234(i, j, 3); end; 4: begin f234(i, j, 4); end; 5: begin end; 6: begin end; end;end;begin score := 0; for i := 1 to 8 do for j := 1 to 8 do if a[i, j] <> 0 then begin found(i, j, a[i, j]); end; writeln(‘score= ‘, score); readln;end.
Форма ответа