Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi->Pascal] Вывод графики, рисование шахматной доски 
:(
    Опции темы
Assan
Дата 8.12.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.12.2006

Репутация: нет
Всего: нет



Здраствуйте, у меня (точнее у моего друга) зачетка по Delphi завтра! Я написал программу на паскале, но возникли трудности в написании ее на Дельфи в визуальной среде (потому-что я не знаю Дельфи). Помогите пожалуйста перевести мою программу в Дельфи.
 Условие: Дана шахматная доска, размером 8x8, начальное положение шахматного коня на ней, его конечное положение. Требуется написать программу, которая считывает данные из 2 полей ввода, задем переходит на объект StringGrid и показывает на нем минимальный путь из 1 точки во 2-ую.
Входные координаты даются в формате а1, b2, h8 (как на шахматной доске первая координата - столбец, вторая - строка)
Доска должна быть раскрашена в цвета #CCCC99 и #666633 (RGB: 204 204 153 и 102 102 51 соответственно) 
Конкретно, на экране картинка шахматного коня прыгает из начальной точки последовательно в конечную, клетки по ходу коня затемняются (когда он там побывал). По прибытии коня в пункт нахначения он должен улыбнуться.
Помогите: Я написал программу на Pascal'e ниже приведен ее код. Она считывает из файла input.txt и выводит в output.txt результат. Работает правильно, проверял на тестах. Вся проблема состоит в том, чтобы написать аналогичное приложение на Delphi с использованием визуальных средств как поле ввода, StrinGrid, картинка коня. Пожалуйста помогите, уже завтра ему сдавать, а мне ему отдавать уже сегодня )). 
Исходный код на паскале с комментариями прицеплен к теме

Добавлено @ 16:15 
Что-то я не увидел у себя прицепленного файла, вот исходник:
Код

{$APPTYPE CONSOLE}
const
     FileIn='input.txt';
     FileOut='output.txt';
     n=9;
     m=8;
     {dopustimyie hody konia dx-kak izmenitsa stroka,kuda mozhet hodit kon'
                             dy-kak izmenitsa stolbec,kuda mozhet hodit kon
                             m- kolichestvo vsevozmozhnyh hodov konia}
     dx:array[1..m] of integer=(1,-1, 1, -1,2, 2,-2, -2);
     dy:array[1..m] of integer=(2, 2,-2, -2,1,-1, 1, -1);
type
     mas1=array[-1..n+2,-1..n+2] of integer;
     {ochen' nuzhnyi tip - hranit koordinaty mestopolozhenia na doske r- stroka, c - stolbec }
     coord=record
                 r,c:integer;
                 end;
     mas2=array[1..n*n] of coord;
var
   (*massiv a - nasha shakhmatnaia doska 1..n,1..n diapozon realnyh strok
            i stolbcov - kletok doski, a diapozon
              [-1..0,n+1..n+2],[-1..0,n+1..n+2] - pustaia
              zona shtob programma po hodu vypolnenia ne vyzvala elenent skazhem
              s indexom (-1,0)*
              ELEMENT A[I,J] MASSIVA HRANIT ZNACHENIA - MINIMAKNOIE KOLICHESTVO
                                        HODOV NEOBHODIMOIE DLIA KONIA+1
                                        pochemu+1 - stanet poniatno iz realizacii
                                        CHTOB DOSTIGNUT' TOCHKI S COORDINATAMI I,J
                                        I-STROKA,J-STOLBEC*)
     a:mas1;
     {massiv q - nuzhen dlia hranenia ocheredi, to est' dlia realizacii
             poiska v shirinu}
     q:mas2;
     {ql,qr - nachalo i konec ocheredi sootvetstvenno}
     ql,qr:integer;
     {result - massiv posledovatelnost' hodov v minimalnom puti po
               poradku iz konca v nachalo
               nuzhno potom prosto
               vyvesti s poslednego elementa po porvyi
     k       - kolichestvo hodov v minimalnom puti, to est razmer massiva result}
     result:mas2;
     k:integer;
     {s,t - tochka starta i tochka naznachenia}
     s,t:coord;
{========================================================================================}
procedure convert(c1:char;c2:char;var a:coord);
var stroka,code:integer;
  begin
  code:=0;
  {vvod tochki naprimer, starta}
  (*c1 - stolbec na doske, c2 - stroka na shakhmatnoi doske,
  naprimer vveli b2 c1=b c2=2
  *)
  (*perevodim v verkhnii registr stroku na sluchai esli vhodnyie dannyie
  budut raznogo formata naprimer h6 ili H6
  *)
  c1:=upcase(c1);
  (* nakonec prisvaivaem nuzhnoie znachenie parametru a.c (a.r - stroka tochki, naprimer
  starta a.c - stolbec tochki, naprimer starta) dlia a4 stolbec=1 stroka=5 (8-4+1)
  dlia h2 stolbec=8 stroka=7(8-2+1))  *)
  a.c:=ord(c1)-ord('A')+1;
  {i stroke tozhe...}
  val(c2,stroka,code);
  a.r:=n-stroka+1;
  end;
{========================================================================================}
procedure reverse(a:coord; var c1,c2:char);
  begin
  {a eta procedura naoborot iz zadannyh stroki i stolbca v zapisah peremennoi a
    vozvrashchaet coordinaty f formate a1, b2, h5, i tak dalee, c1 - eto koordinata - stolbec
    c2 - eto koordinata - stroka}
  c1:=low(char);
  c2:=c1;
  c2:=chr((n-a.r+1)+ord('1')-1);
  c1:=chr(a.c+ord('a')-1);
  end;
{========================================================================================}
procedure init;
var i,j:integer;
  begin
  {delaem ogranku massiva, chtob kon' ne popal za predely doski
  eto delaetsia prosto - vokrug doski delaetsa ogranka ili ograda ))
  tolshchinoi=2 vot kak eto vygladit:
  -1-1-1-1-1-1-1-1-1-1-1-1
  -1-1-1-1-1-1-1-1-1-1-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1 0 0 0 0 0 0 0 0-1-1
  -1-1-1-1-1-1-1-1-1-1-1-1
  -1-1-1-1-1-1-1-1-1-1-1-1
  }

  for i:=-1 to 0 do
      for j:=-1 to n+2 do begin
          a[i,j]:=-1;
          a[j,i]:=a[i,j];
          end;
  for i:=n+1 to n+2 do
      for j:=-1 to n+2 do begin
          a[i,j]:=-1;
          a[j,i]:=a[i,j];
          end;

  end;
{========================================================================================}
procedure read;
var c1,c2:char;
  begin
  (*vvod iz faila input.txt
  pervaia stroka - tochka starta v formate {a1,h2,b5...}
  vtoraia stroka - tochka finisha v tom zhe formate*)
  assign(input,filein);
  reset(input);
  assign(output,fileout);
  rewrite(output);
  {tochka starta}
  readln(c1,c2);
  convert(c1,c2,s);
  {tochka finisha - target}
  readln(c1,c2);
  convert(c1,c2,t);
  end;
{========================================================================================}
procedure add(a:coord);
  begin
  inc(qr);
  if qr=n*n+1 then qr:=1;
  q[qr]:=a;
  end;
{========================================================================================}
procedure extract(var b:coord);
  begin
  inc(ql);
  if ql=n*n+1 then ql:=1;
  if ql>qr then begin
     writeln('Ochered'' perepolnena kon'' sdoh');
     close(output);
     halt(0);
     end;
  b:=q[ql];
  end;
{========================================================================================}
function founded:boolean;
  begin
  {proveraiet naiden li kratchaishii put' ili net}
  if a[t.r,t.c]<>0 then founded:=true
                   else founded:=false;
  end;
{========================================================================================}
procedure definepath;
var i,j,n1:integer;
    cur:coord;
  begin
  n1:=0;
  cur:=t;

  for i:=k downto 1 do begin
      inc(n1);
      result[n1]:=cur;
      for j:=1 to m do
          if a[cur.r+dx[j],cur.c+dy[j]]=i then begin
             cur.r:=cur.r+dx[j];
             cur.c:=cur.c+dy[j];
             break;
             end;
      end;
  end;
{========================================================================================}
procedure work;
var i,j:integer;
    cur,next:coord; {cur sokr. current - eto tekushaia rassmatrivaiemaia tochka}
  begin
  {prisvaivaem nachalnoi tochke znachenie 1
  to est v konce my poluchim minimalnoie chislo hodov+1}
  a[s.r,s.c]:=1;
  {dobavlaiem tochku starta v ochered' i poneslas'!}
  add(s);
  {algoritm privedennyi nizhe iavlaietsa standartnym algoritmom poiska minimalnogo puti na ploskosti s ispolzovaniem poiska v
  shirinu. V dannom sluchaie ispolzovalas' ochered' q, gde hranilis' v nachale ocheredi - tekushaia rassmatrivaiemaia tochka, v
   konce - vozmozhnyie hody iz tekushei tochki}
  while not founded do begin
        {izvlekaiem iz ocheredi tekushuiu tochku}
        extract(cur);
        for i:=1 to m do
            {Iesli my mozhem iz nee kuda-libo pohodit', gde kon' eshche ne byl to pishem v konec ocheredi vozmozhnyi variant, z
            ametim chto vsego vozmozhnyh variantov u konia 8. Ih opisanie sm. v razdele  const v nachale programmy}
            if a[cur.r+dx[i],cur.c+dy[i]]=0 then begin
               {zadaem koordinaty sleduiushei poseshchaemoi konem tochki...}
               next.r:=cur.r+dx[i];
               next.c:=cur.c+dy[i];
               {...pishem etu tochku v konec ocheredi}
               add(next);
               {delaiem pometku na doske: My zdes' byli na takom-to hodu(tochnee na tekushem hodu+1)}
               a[next.r,next.c]:=a[cur.r,cur.c]+1;
               end;
        end;
  {rezultat k - chislo hodov}
  k:=a[t.r,t.c]-1;
  {Delo za malym - vosstanovit' posledovatelnost' hodov s konca}
  definepath;
  end;
{========================================================================================}
procedure write;
var i:integer;
    c1,c2:char;
  begin
  writeln(k);
  for i:=k downto 1 do begin
      reverse(result[i],c1,c2);
      writeln(c1,c2,' ');
      end;
  close(output);
  end;
begin
init;
read;
work;
write;
end.



M
alexeis1
Модератор: не забывайте выбирать тип подсветки.


Это сообщение отредактировал(а) alexeis1 - 8.12.2006, 16:37
PM MAIL   Вверх
Assan
Дата 8.12.2006, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.12.2006

Репутация: нет
Всего: нет



Опечатка, в строке 5 нужно написать n=8 (а не n=9), потому что на шахматной доске 8*8 клеток
PM MAIL   Вверх
Albinos_x
Дата 9.12.2006, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

Репутация: 2
Всего: 108



вот пример на делифи... подправишь его как тебе нужно и всё
http://www.zoforum.zeroes-and-ones.com.ru/...p?showtopic=790


--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0499 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.