Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача "Ход конем"
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
leahov
Даны две литеры - латинская буква (от a до h) и цифра (от 1 до восьми). Рассматривая их как координаты поля шахматной доски, на котором находится конь, нарисовать шахматную доску, пометив крестиками все поля, которые «бьет» этот конь, и ноликами все остальные.

шахматку нарисовал - вот код
Program zadacha1; 
uses graph,crt;
var driver,mode,m,n:integer;
stroka:string[1];
const
l:array [0..7] of string[1] =('a','b','c','d','e','f','g','h');
begin
driver:=detect;
Initgraph(driver,mode,'c:/bp/bgi');
setcolor(15);
for n:=1 to 8 do
for m:=0 to 7 do
rectangle(n*50,m*50,n*50+50,M*50+50);
for n:=0 to 3 do
begin
for m:=0 to 3 do
begin
floodfill(100*n+75,100*m+25,15);
floodfill(100*n+125,100*m+75,15);
end;
end;
for n:=0 to 7 do
begin
str(n+1,stroka);
OutTextXY(25,n*50+22,stroka);
end;
for n:=0 to 7 do
OutTextXY(n*50+70,415,l[n]);
readln;
closegraph;
end.


Помогите закончить задание
Есть мысля как её закончить - изначально все поля сделать с нулями, а потом просто расставить под ход коня единички, одна загвоздка - не получается реализовать этот план. Может это и не правильно, но это по моему один из простых вариантов
RaV
Конь ходит буквой "Г".
Значит надо просто вычислить координаты клеток на которые может встать конь.
Всего есть максимум 8 вариантов, если он не у края доски.

Я так понимаю координаты коня вводит пользователь.
остаеться только вычислить его возможные ходы.
leahov
RaV в задании написано просто пометить крестиками все поля, которые «бьет» этот конь. Мне кажется надо просто вывести на экран шахматку с уже помеченными крестиками и ноликами.
Цитата

Всего есть максимум 8 вариантов, если он не у края доски.

А почему 8, я их штук 40 насчитал wacko.gif
RaV
А как ты считал?
Я понимаю что он может сделать только один ход, и он может встать на 8 разных клеток.
leahov
я просто брал коня и ходил им по полю буквой Г, или я не понял задания? там вроде написано пометить все поля которые бьет конь
RaV
Я думаю что так не правильно.А то так можно всю доску обойти.
Цитата

Даны две литеры - латинская буква (от a до h) и цифра (от 1 до восьми). Рассматривая их как координаты поля шахматной доски, на котором находится конь нарисовать шахматную доску, пометив крестиками все поля, которые «бьет» этот конь, и ноликами все остальные.

Тут сказано, что есть координаты коня.Далее имеется ввиду,на какие клетки сможет встать конь.
надо их вичислить и пометить на доске.Это и будут все поля ,которые "бьет" конь.
Lapp
Я немного причесал твою прогу, изменений вносить не стал (хотя руки чесались.. smile.gif ).
Вставил код, который рисует кресты (мои вставки помечены строчками комментов со звездочками) - надеюсь, разберешься..

Program zadacha1;
uses
graph,crt;

var
driver,mode,m,n:integer;
stroka:string[1];

const
l:array [0..7] of string[1] =('a','b','c','d','e','f','g','h');
{**************************}
Kx:integer=5;
Ky:integer=4;
{**************************}

begin
driver:=detect;
Initgraph(driver,mode,'c:/bp/bgi');
setcolor(15);
SetFillStyle(1,15);
for n:=1 to 8 do
for m:=0 to 7 do rectangle(n*50,m*50,n*50+50,M*50+50);
for n:=0 to 3 do begin
for m:=0 to 3 do begin
floodfill(100*n+75,100*m+25,15);
floodfill(100*n+125,100*m+75,15);
end;
end;
for n:=0 to 7 do begin
str(n+1,stroka);
OutTextXY(25,n*50+22,stroka);
end;
for n:=0 to 7 do OutTextXY(n*50+70,415,l[n]);

{**************************}
SetColor(LightRed);
Ky:=8-Ky;
for n:=1 to 8 do
for m:=0 to 7 do
if (Abs(n-Kx)=2)and(Abs(m-Ky)=1)or(Abs(n-Kx)=1)and(Abs(m-Ky)=2) then begin
Line(n*50,m*50,(n+1)*50,(m+1)*50);
Line(n*50,(m+1)*50,(n+1)*50,m*50);
end;
{**************************}

readln;
closegraph;
end.


P.S.
Цифровая нумерация у тебя неправильная (сверху вниз)
leahov
rolleyes.gif я так всю доску и обошел
то есть я так понимаю надо задать двумерный массив изначально заполненный нулями, каждому его элементу будет соответствовать поле шахматной доски. (1, 1) - A1, (2,2) -B2, (1,8) - A8. Проблема в том что я не знаю как привязать координаты к шахматной доске. Я не волшебник no1.gif ,я только учусь smile.gif
leahov
lapp спасибо, сейчас попробую нули ставить
Lapp
Цитата(leahov @ 3.06.2006 10:25) *

lapp спасибо, сейчас попробую нули ставить

Давай, вставляй. Для этого просто добавь else в мой if и рисуй кружочки.

Но вообще - подумай над переделкой.
1. Не тащи 50 через всю прогу - сделай константу (скажем, a) и используй ее.
2. Закрашивание клеток белым цветом делай в первом же цикле (используй Bar вместо Rectangle, но рисуй только те клетки, у которых выполнено условие Odd(n*m) ), а цикл с FloodFill убери совсем.
3. Продумай нормальную адресацию клеток, можно сделать и буквенную
....
остальное потом.. smile.gif
leahov
а кружки через Ellipse рисовать?
Lapp
Цитата(leahov @ 3.06.2006 11:15) *

а кружки через Ellipse рисовать?

Ну зачем же? используй Circle
Цитата
Procedure Circle (X, Y: Integer; R: word) Рисует окружность радиуса R, используя X,Y как координаты центра
Malice
Цитата(lapp @ 3.06.2006 9:50) *

только те клетки, у которых выполнено условие Odd(n+m) ).
leahov
lapp извини за мою тупость , но куда эту процедуру засунуть?
RaV
Вот сюда :

{**************************}
SetColor(LightRed);
Ky:=8-Ky;
for n:=1 to 8 do
for m:=0 to 7 do
if (Abs(n-Kx)=2)and(Abs(m-Ky)=1)or(Abs(n-Kx)=1)and(Abs(m-Ky)=2) then begin
Line(n*50,m*50,(n+1)*50,(m+1)*50);
Line(n*50,(m+1)*50,(n+1)*50,m*50);
end{<---- убери ';'}
else {<----вот сюда ,рисуем окружность}
{**************************}

leahov
Circle (X, Y: Integer; R: word) 

R-50
X,Y - это мои n и m?
leahov
если да - то она выдает ошибку на двоеточие после Y
RaV
X и Y - центр твоей клетки
Lapp
2 Malice: спасибо, конечно +.

Цитата(leahov @ 3.06.2006 12:16) *

Circle (X, Y: Integer; R: word) 

R-50
X,Y - это мои n и m?
Нет, это экранные координаты центра круга... короче, вот
{**************************}
SetColor(LightRed);
Ky:=8-Ky;
for n:=1 to 8 do
for m:=0 to 7 do
if (Abs(n-Kx)=2)and(Abs(m-Ky)=1)or(Abs(n-Kx)=1)and(Abs(m-Ky)=2) then begin
Line(n*50,m*50,(n+1)*50,(m+1)*50);
Line(n*50,(m+1)*50,(n+1)*50,m*50);
end
else Circle(n*50+25,m*50+25,20);
{**************************}
leahov
я как раз примерно тоже самой уже сделал только R вычислял, поставил 50 и испугался - узоры какие то фрактальные вышли lol.gif , самому смешно
Спасибо всем кто решил вместо меня unsure.gif это задание.
Lapp
Цитата(leahov @ 3.06.2006 12:38) *

Спасибо всем кто решил вместо меня unsure.gif это задание.

Э, нет! Мы только немножко подправили..
Сами мы сделали бы совсем иначе! smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.