Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача "Ход конем"

Автор: leahov 3.06.2006 11:23

Даны две литеры - латинская буква (от 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 3.06.2006 12:08

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

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

Автор: leahov 3.06.2006 12:29

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

Цитата

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

А почему 8, я их штук 40 насчитал wacko.gif

Автор: RaV 3.06.2006 12:45

А как ты считал?
Я понимаю что он может сделать только один ход, и он может встать на 8 разных клеток.

Автор: leahov 3.06.2006 12:53

я просто брал коня и ходил им по полю буквой Г, или я не понял задания? там вроде написано пометить все поля которые бьет конь

Автор: RaV 3.06.2006 13:01

Я думаю что так не правильно.А то так можно всю доску обойти.

Цитата

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

Тут сказано, что есть координаты коня.Далее имеется ввиду,на какие клетки сможет встать конь.
надо их вичислить и пометить на доске.Это и будут все поля ,которые "бьет" конь.

Автор: lapp 3.06.2006 13:04

Я немного причесал твою прогу, изменений вносить не стал (хотя руки чесались.. 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 3.06.2006 13:10

rolleyes.gif я так всю доску и обошел
то есть я так понимаю надо задать двумерный массив изначально заполненный нулями, каждому его элементу будет соответствовать поле шахматной доски. (1, 1) - A1, (2,2) -B2, (1,8) - A8. Проблема в том что я не знаю как привязать координаты к шахматной доске. Я не волшебник no1.gif ,я только учусь smile.gif

Автор: leahov 3.06.2006 13:25

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

Автор: lapp 3.06.2006 13:50

Цитата(leahov @ 3.06.2006 10:25) *

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

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

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

Автор: leahov 3.06.2006 14:15

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

Автор: lapp 3.06.2006 14:23

Цитата(leahov @ 3.06.2006 11:15) *

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

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

Автор: Malice 3.06.2006 14:32

Цитата(lapp @ 3.06.2006 9:50) *

только те клетки, у которых выполнено условие Odd(n+m) ).

Автор: leahov 3.06.2006 14:43

lapp извини за мою тупость , но куда эту процедуру засунуть?

Автор: RaV 3.06.2006 15:05

Вот сюда :


{**************************}
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 3.06.2006 15:16

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

R-50
X,Y - это мои n и m?

Автор: leahov 3.06.2006 15:27

если да - то она выдает ошибку на двоеточие после Y

Автор: RaV 3.06.2006 15:27

X и Y - центр твоей клетки

Автор: lapp 3.06.2006 15:27

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 3.06.2006 15:38

я как раз примерно тоже самой уже сделал только R вычислял, поставил 50 и испугался - узоры какие то фрактальные вышли lol.gif , самому смешно
Спасибо всем кто решил вместо меня unsure.gif это задание.

Автор: lapp 3.06.2006 15:43

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

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

Э, нет! Мы только немножко подправили..
Сами мы сделали бы совсем иначе! smile.gif