IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Задача "Ход конем", помогите закончить
leahov
сообщение 3.06.2006 7:23
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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


Помогите закончить задание
Есть мысля как её закончить - изначально все поля сделать с нулями, а потом просто расставить под ход коня единички, одна загвоздка - не получается реализовать этот план. Может это и не правильно, но это по моему один из простых вариантов
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
RaV
сообщение 3.06.2006 8:08
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


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

Я так понимаю координаты коня вводит пользователь.
остаеться только вычислить его возможные ходы.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 8:29
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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

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

А почему 8, я их штук 40 насчитал wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
RaV
сообщение 3.06.2006 8:45
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


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

Сообщение отредактировано: RaV - 3.06.2006 8:51
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 8:53
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


я просто брал коня и ходил им по полю буквой Г, или я не понял задания? там вроде написано пометить все поля которые бьет конь
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
RaV
сообщение 3.06.2006 9:01
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


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

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

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

Сообщение отредактировано: RaV - 3.06.2006 9:04
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.06.2006 9:04
Сообщение #7


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я немного причесал твою прогу, изменений вносить не стал (хотя руки чесались.. 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.
Цифровая нумерация у тебя неправильная (сверху вниз)


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 9:10
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


rolleyes.gif я так всю доску и обошел
то есть я так понимаю надо задать двумерный массив изначально заполненный нулями, каждому его элементу будет соответствовать поле шахматной доски. (1, 1) - A1, (2,2) -B2, (1,8) - A8. Проблема в том что я не знаю как привязать координаты к шахматной доске. Я не волшебник no1.gif ,я только учусь smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 9:25
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


lapp спасибо, сейчас попробую нули ставить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.06.2006 9:50
Сообщение #10


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 10:15
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


а кружки через Ellipse рисовать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.06.2006 10:23
Сообщение #12


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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

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

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


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 3.06.2006 10:32
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

только те клетки, у которых выполнено условие Odd(n+m) ).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 10:43
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


lapp извини за мою тупость , но куда эту процедуру засунуть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
RaV
сообщение 3.06.2006 11:05
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


Вот сюда :

{**************************}
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 {<----вот сюда ,рисуем окружность}
{**************************}



Сообщение отредактировано: volvo - 2.11.2006 14:58
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 11:16
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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

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

Сообщение отредактировано: volvo - 2.11.2006 14:58
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 11:27
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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

Сообщение отредактировано: leahov - 3.06.2006 11:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
RaV
сообщение 3.06.2006 11:27
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Владимир

Репутация: -  0  +


X и Y - центр твоей клетки
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 3.06.2006 11:27
Сообщение #19


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


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);
{**************************}


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
leahov
сообщение 3.06.2006 11:38
Сообщение #20


Новичок
*

Группа: Пользователи
Сообщений: 39
Пол: Мужской
Реальное имя: leahov

Репутация: -  0  +


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

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 24.04.2024 5:11
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"